2 listen [] vergleichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

servus leute irgend wie häng ich heute mal wieder in den seilen
oder der Schlauch ist zu dünn !!!

ich habe 2 listen
finde = [0,1,2,3] es können an allen positionen werte von 0-3 stehen
das gleiche gilt für
meinewahl = [0,0,2,2]

mein code zur analyse
PROBLEM irgendwie bekomm ich falsche angaben zu den Farbtreffern

Code: Alles auswählen

def auswerten(screen,meinewahl):
    richtigplatz=0
    richtigfarbe=0
    for j in range(4):        # farben und platz richtig
        if finde[j] == meinewahl[j]:
            richtigplatz += 1
       
    for i in range(4): #richtige anzahl farben ermitteln
        for j in range(4):
            if meinewahl[j] == finde[i]:
                richtigfarbe += 1 #doppelte farbe gefunden
                meinewahl[j] = -1 #loesche die zahl in meinewahl wegen doppeltenFarben
    
    if richtigplatz == 4:    #	Alle richtig
            richtig = True
            alles_richtig_falsch(screen,richtig)
                
    if richtigplatz > 0 or richtigfarbe > 0:
            treffer_anzeigen(screen,richtigplatz,richtigfarbe)

    nix_getroffen(screen)
        
def treffer_anzeigen(screen,richtigplatz,richtigfarbe):
    global reihe,meinewahl
    if richtigfarbe > richtigplatz:
        for r in range(richtigplatz,richtigfarbe):
            pygame.draw.circle(screen, weiss,koor_treffer[((reihe-1) * 4) + r], 4)
            pygame.display.flip()

    if richtigplatz > 0:
        for r in range(0,richtigplatz):
            pygame.draw.circle(screen, farben[1],koor_treffer[((reihe-1) * 4) + r], 4)
            pygame.display.flip()
kompletter code
http://paste.pocoo.org/show/38800
screenshot
Bild
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sea-live hat geschrieben:ich habe 2 listen
finde = [0,1,2,3] es können an allen positionen werte von 0-3 stehen
das gleiche gilt für
meinewahl = [0,0,2,2]

mein code zur analyse
PROBLEM irgendwie bekomm ich falsche angaben zu den Farbtreffern
Was soll überhaupt analysiert werden? Wenn du das mal klar niederschreibst, wird es auch sicher einfacher da etwas zu implementieren. Außerdem muss man deinen Code nicht zu verstehen versuchen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ich vermute es geht immer noch um Mastermind. Nochmal der Link auf meine "Mastermind verkehrt"-Lösung: http://paste.pocoo.org/show/38982/

Da wird das ja auch gemacht. Für die Anzahl der korrekten Farben benutze ich ein Histogramm und rechne jeweils das Minimum von beiden Kombinationen für jede Farbe zusammen. Und bei den richtigen Plätzen addiere ich eine 1 für jede Stelle die bei beiden Kombinationen gleich ist.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Danke blackjack

es müsste doch aber auch mit normalen durchläufen klappen

in dem man die Treffer bei den farben und den Stellen wegnimmt -1

Code: Alles auswählen

    for j in range(4):        # farben und platz richtig
        if finde[j] == meinewahl[j]:
            finde[j] = -1
            meinewahl[j] = -1
            richtigplatz += 1 #treffer gefunden
dann das nochmal durchlaufen lässt 4x4

Code: Alles auswählen

    for i in range(4): #richtige anzahl farben ermitteln
        for j in range(4):
            if meinewahl[j] == finde[i]:
                if meinewahl[j] != -1:
                    richtigfarbe += 1 #doppelte farbe gefunden
                    meinewahl[j] = -1 #loesche die zahl in meinewahl wegen doppeltenFarben
    print richtigplatz
    print richtigfarbe
  
GEHT aber so nicht
Wo liegt da mein Denkfehler
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

so läuft es
! bis zum nächsten bug

Nochmal zur info ***
zwei array finde = [0,1,2,3] und meinewahl = [1,2,0,3] wobei an allen stellen alle zahlen 0-3 sein können
die ziffern stehen bei mir für farben
ergebnis hier wäre 1 treffer Farbe und Platz
3 treffer Farbe

Code: Alles auswählen

def auswerten(screen,meinewahl):
    richtigplatz = 0
    richtigfarbe = 0
    find = [7,7,7,7]
    for j in range(4): # zu suchendes zum auswerten laden
        find[j] = finde[j]

    for j in range(4):        # farben und platz richtig
        if find[j] == meinewahl[j]:
            find[j] = -1
            meinewahl[j] = -1
            richtigplatz += 1 #treffer gefunden
       
    for i in range(4): #richtige anzahl farben ermitteln
        for j in range(4):
            if meinewahl[j] == find[i]:
                if meinewahl[j] != -1:
                    richtigfarbe += 1 #doppelte farbe gefunden
                    meinewahl[j] = -1 #loesche die zahl in meinewahl wegen doppeltenFarben
                    
    
    if richtigplatz == 4:    #	Alle richtig
            richtig = True
            alles_richtig_falsch(screen,richtig)
                
    if richtigplatz > 0 or richtigfarbe > 0: #treffer anzeigen
            treffer_anzeigen(screen,richtigplatz,richtigfarbe)

    nix_getroffen(screen)
        
def treffer_anzeigen(screen,richtigplatz,richtigfarbe):
    richtigfarbe += richtigplatz
    for r in range(4):
        if r < richtigfarbe:
            pygame.draw.circle(screen, weiss,koor_treffer[((reihe-1) * 4) + r], 4)
        if r < richtigplatz:
            pygame.draw.circle(screen, farben[1],koor_treffer[((reihe-1) * 4) + r], 4)

    pygame.display.flip()
BlackJack

Wieso werden in der ersten Schleife die Inhalte der Listen verändert? Kann dabei nicht ein Eintrag auch -1 werden, womit er dann in der zweiten Schleife nicht mehr berücksichtigt wird!?

Was mich zu der Bemerkung bringt, dass besondere Zahlwerte für "ungültige" Werte zu verwenden keine gute Idee ist, weil es dann passieren kann, dass man irgend wo anders mit diesen unsinnigen Zahlen rechnet ohne dass es sofort auffällt oder offensichtlich ist wo die Fehlerquelle liegt. An solchen Stellen sollte man lieber spezielle Objekte, wie zum Beispiel `None` verwenden.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Du hast recht !
None wäre besser
da es hier aber um ein geschlossenes programm handelt und in der ersten schleife das auszuwerdende array zur auswertung übergeben wird wird nur dieses zerstört das original finde bleibt erhalten!
BlackJack

`finde` heisst hier `find` und wird nicht übergeben sondern auf eine Liste mit Siebenen gesetzt. Und heisst "übergeben", dass Du explizit eine Kopie von der Liste machst, bevor Du sie übergibst? Wenn nicht, dann wird doch die übergebene Liste verändert.

Und mir ist immer noch nicht klar, was das abziehen von 1 bei beiden Listen bewirken soll!?

`alles_richtig_falsch()` ist ein lustiger, aber sehr verwirrender Funktionsname.

Um an audax's MVC-Frage anzuknüpfen: Schreib das Programm so um, das Logik und GUI getrennt sind. Die `auswerten()`-Funktion, sollte beide Listen bekommen und ein Tupel mit zwei Zahlen (Anzahl richtiger Farben, Anzahl richtiger Plätze) zurückgeben und nichts mit der GUI zu tun haben. Dann kannst Du die Funktion zum Beispiel ganz einfach einzeln mit verschiedenen Listen testen und sehen was passiert.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

hier wird eine kopie von finde ersatellt

Code: Alles auswählen

    find = [7,7,7,7]
    for j in range(4): # zu suchendes zum auswerten laden
        find[j] = finde[j]
abziehen bzw ändern vermeidet die doppelzählung won werten da ja schon ausgewertet wntweder treffer ziffer und stelle oben
hier

Code: Alles auswählen

    for j in range(4):        # farben und platz richtig
        if find[j] == meinewahl[j]:
            find[j] = -1
            meinewahl[j] = -1
            richtigplatz += 1 #treffer gefunden
 
oder dann treffer nur ziffer aber nicht an der stelle
hier

Code: Alles auswählen

    for i in range(4): #richtige anzahl farben ermitteln
        for j in range(4):
            if meinewahl[j] == find[i]:
                if meinewahl[j] != -1:
                    richtigfarbe += 1 #doppelte farbe gefunden
                    meinewahl[j] = -1 #loesche die zahl in meinewahl wegen doppeltenFarben
 
da ich dann 2 einzelne ergebnisse bekomme muss ich diese beim anzeigen addieren
hier

Code: Alles auswählen

def treffer_anzeigen(screen,richtigplatz,richtigfarbe):
    richtigfarbe += richtigplatz

alles_richtig_falsch() ersetzt halt doppelcode
motto hier ist GENI und WAHNSINN liegin dicht zusammen SUPER /LOSER

ich schreib da mal noch die koordinaten um und mach funktino in deinem stiele dann wird das alles kompakter.



Bild
BlackJack

Ah, die Schleife hatte ich übersehen. Die Siebenen haben also gar keine Bedeutung. Bitte wegwerfen und so eine Kopie erstellen: ``find = list(finde)``. Wobei ich mich gerade frage wo `finde` her kommt. Das sollte als Argument übergeben werden.

Ich finde das mit den -1, die besser `None` sein sollten, immer noch sehr verwirrend. Bei der Anzahl der richtigen Farben muss man doch auch die an den richtigen Stellen mit zählen. Denn wenn eine Farbe an der richtigen Stelle steht, dann ist sie ja auch eine richtige Farbe.

Bei [0,1,2,3] und [1,2,0,3] ist IMHO das Ergebnis `richtiger_platz` = 1 und `richtige_farbe` = 4.

`finde` würde ich übrigens umbenennen. Das ist eine Tätigkeit, also eher ein Name für eine Funktion. `geheimnis` wäre passender.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

BlackJack hat geschrieben:Ah, die Schleife hatte ich übersehen. Die Siebenen haben also gar keine Bedeutung. Bitte wegwerfen und so eine Kopie erstellen: ``find = list(finde)``. Wobei ich mich gerade frage wo `finde` her kommt. Das sollte als Argument übergeben werden.

Ich finde das mit den -1, die besser `None` sein sollten, immer noch sehr verwirrend. Bei der Anzahl der richtigen Farben muss man doch auch die an den richtigen Stellen mit zählen. Denn wenn eine Farbe an der richtigen Stelle steht, dann ist sie ja auch eine richtige Farbe.

Bei [0,1,2,3] und [1,2,0,3] ist IMHO das Ergebnis `richtiger_platz` = 1 und `richtige_farbe` = 4.

`finde` würde ich übrigens umbenennen. Das ist eine Tätigkeit, also eher ein Name für eine Funktion. `geheimnis` wäre passender.
du hast wi immer recht
finde=zusuchen() in neu()
geheimnisse muss man finden also du finde bitte meine farbkombination

deswegen wird es ja auch in treffer_anzeigen addiert somit stimmen beide die auswertung erfasst aber die treffer einzel dabei wird durch -1 die ziffer gelöscht und steht für die farb anzahl analyse nicht mehr zur verfügung

vorläufiges funktionierendes !bugs gibts immer auch bei Microschrott
hier
http://paste.pocoo.org/show/39314

Alle von euch genannten BUGS Gefixt !!!

bitte testen
Zuletzt geändert von sea-live am Donnerstag 10. April 2008, 15:56, insgesamt 1-mal geändert.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Die Stelle um die es hier mit dem Listenvergleichen ging sieht nun so aus

Code: Alles auswählen

def nix_getroffen(screen):
    global reihe,meinewahl
    reihe = reihe - 1
    if reihe == 0:
        richtig = False
        alles_richtig_falsch(screen,richtig)
    meinewahl = [7,7,7,7]
    if reihe != 0:
        if not aus:
            balken(screen,reihe)

def auswerten(screen,meinewahl):
    richtigplatz = 0
    richtigfarbe = 0
    find = [7,7,7,7]
    for j in range(4): # zu suchendes zum auswerten laden
        find[j] = finde[j]
    for j in range(4):        # farben und platz richtig
        if find[j] == meinewahl[j]:
            find[j] = -1
            meinewahl[j] = -1
            richtigplatz += 1 #treffer gefunden
    for i in range(4): #richtige anzahl farben ermitteln
        for j in range(4):
            if meinewahl[j] == find[i]:
                if meinewahl[j] != -1:
                    richtigfarbe += 1 #doppelte farbe gefunden
                    meinewahl[j] = -1 #loesche die zahl in meinewahl wegen doppeltenFarben
    if richtigplatz == 4:    #	Alle richtig
            richtig = True
            alles_richtig_falsch(screen,richtig)
    if richtigplatz > 0 or richtigfarbe > 0: #treffer anzeigen
            treffer_anzeigen(screen,richtigplatz,richtigfarbe)
    nix_getroffen(screen)
        
def treffer_anzeigen(screen,richtigplatz,richtigfarbe):
    if richtigfarbe == richtigplatz:
        richtigfarbe += richtigplatz
    koor_treffer = punktmatrix()
    for r in range(4):
        if r < richtigfarbe:
            pygame.draw.circle(screen, weiss,koor_treffer[((reihe-1) * 4) + r], 4)
        if r < richtigplatz:
            pygame.draw.circle(screen, farben[1],koor_treffer[((reihe-1) * 4) + r], 4)
    pygame.display.flip()

def reihe_ermitteln(pos):
    mous_koord_reihe = [(20, 45),(50, 75),(80,115),
                    (120,145),(150,180),(185,215),
                    (220,250),(255,280)]
    cx = 150 < pos[0] < 250
    if cx:
        for index,koor in enumerate(mous_koord_reihe):
            if koor[0] < pos[1] < koor[1]:
                akt_zeile = index+1
                return akt_zeile
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beachtest du unsere Tips eigentlich? Ich hatte schon einen langen Post geschrieben und BlackJack hat dir auch so einiges genannt. Umgesetzt wurde davon aber gar nichts.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

EyDu hat geschrieben:Beachtest du unsere Tips eigentlich? Ich hatte schon einen langen Post geschrieben und BlackJack hat dir auch so einiges genannt. Umgesetzt wurde davon aber gar nichts.
JETZT bin ich aber enttäuscht ich habe das ganze teil umgeschrieben!!
alles aus mach() in einzelne def

koordinaten arrays benutzt mit forschleifen versehen und ausgegeben

EYDu was soll ich deiner meinung noch ändern !!

Danke
bin immer für alles offen !!
es muss nur funktionieren
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Och...da du mich ja erleuchtest hast, dass MVC ein Anti-Pattern ist...
Lass es einfach so, es funktioniert ja(tm).
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

es gibt immer was zuverbessern in Java sind das ganze 94 zeilen
ich hab 300 und es sieht schlechter aus Optisch zumindest es ist bugbehaftet und hat weder start noch stop sowie keine 4-6Farben zur Wahl

somit ist das Game mies programmiert
sprich nur aus audag was man so denkt !!
ich hab damit kein problem
Java auswerten und anzeigen

Code: Alles auswählen

	public void checkDots(Graphics g)  // Check the pegs
	{
		boolean temp=true;
		int holdDots[];
		int rightCol=0,rightPlace=0;

		for (j=0;j<4;j++)
			temp=(temp && (dotMap[currentRow*4+j]>=0));

		if (temp)		// Guess complete?
		{
			holdDots=new int[4];
			for (j=0;j<4;j++)
				holdDots[j]=dotMap[currentRow*4+j];

			for (i=0;i<4;i++)	// Award white pegs
				for (j=0;j<4;j++)
					if (holdDots[j]==secretCol[i])
					{
						pointMap[currentRow*4+rightCol++]=0;
						holdDots[j]=-1;
						j=4;
					}
			for (j=0;j<4;j++)	// And black ones
			{
				if (secretCol[j]==dotMap[currentRow*4+j])
					rightPlace++;
			}
			for (j=0;j<rightPlace;j++)
				pointMap[currentRow*4+j]=1;

						// Display pegs
			for (j=0;j<2;j++)
				for (k=0;k<2;k++)
					if (pointMap[currentRow*4+j*2+k]>=0)
						pointDot(g,101+k*12,
						206-currentRow*28+j*12,pointMap[currentRow*4+j*2+k]);

			if (rightPlace==4)	// All correct?
			{
				g.setColor(Color.black);
				g.drawString("WELL DONE!",168,20);
				currentRow=8;
			}
			currentRow++;
			if (currentRow>7)	// Game over?
			{
				if (rightPlace<4) // Didn't make it?
				{
					g.setColor(Color.black);
					g.drawString("Sorry!",188,15);
					for (j=0;j<4;j++)
						boardDot(g,163+j*21,20,secretCol[j]);
				}
				gameGoing=false;
				g.setColor(Color.gray);
				g.fill3DRect(175,218,60,18,true);
				g.setColor(Color.white);
				g.drawString("Start",191,231);
			}
		}
	}
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Ich habe das ganze nochmal überarbeitet und nun folgende Lösung die MIR nun wirklich noch keinen Fehler bei ca 100 teste geliefert hat

Code: Alles auswählen

def auswerten(screen,meinewahl):
    richtigplatz = 0
    richtigfarbe = 0
    treffer=[7,7,7,7] # trefferbild loeschen
    find = list(finde)                # zu suchendes zum auswerten laden
    halte_meins = list(meinewahl)     # meine auswahl doppeln
    for i in range(4):                # richtige anzahl farben ermitteln
        for j in range(4):
            if meinewahl[j] == find[i]:
                richtigfarbe += 1     # doppelte farbe gefunden
                meinewahl[j] = -1     # loesche die zahl in meinewahl wegen doppeltenFarben
                break                 # stoppe durchlauf
    for j in range(4):                # farben und platz richtig
        if find[j] == halte_meins[j]:
            richtigplatz += 1         # treffer gefunden
    for i in range(0,richtigfarbe):     # treffer in trefferbild einsetzen 0=Farbtreffer
        treffer[i]=0
    for i in range(0,richtigplatz):     # treffer in trefferbild einsetzen 1=Platz und Farbtreffer
        treffer[i]=1
    if richtigplatz == 4:    #	Alle richtig
            richtig = True
            alles_richtig_falsch(screen,richtig)
    if richtigplatz > 0 or richtigfarbe > 0: #treffer anzeigen
            treffer_anzeigen(screen,treffer)
    nix_getroffen(screen)
Antworten