Seite 1 von 1
2 listen [] vergleichen
Verfasst: Dienstag 8. April 2008, 21:49
von sea-live
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

Re: 2 listen [] vergleichen
Verfasst: Dienstag 8. April 2008, 23:17
von Leonidas
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.
Verfasst: Mittwoch 9. April 2008, 11:27
von 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.
Verfasst: Mittwoch 9. April 2008, 11:34
von sea-live
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
Verfasst: Mittwoch 9. April 2008, 12:26
von sea-live
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()
Verfasst: Mittwoch 9. April 2008, 12:27
von 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.
Verfasst: Mittwoch 9. April 2008, 12:32
von sea-live
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!
Verfasst: Mittwoch 9. April 2008, 12:47
von 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.
Verfasst: Mittwoch 9. April 2008, 12:53
von sea-live
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.

Verfasst: Mittwoch 9. April 2008, 13:46
von 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.
Verfasst: Mittwoch 9. April 2008, 15:01
von sea-live
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
Verfasst: Mittwoch 9. April 2008, 20:07
von sea-live
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
Verfasst: Mittwoch 9. April 2008, 20:22
von EyDu
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.
Verfasst: Donnerstag 10. April 2008, 08:24
von sea-live
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
Verfasst: Donnerstag 10. April 2008, 09:53
von audax
Och...da du mich ja erleuchtest hast, dass MVC ein Anti-Pattern ist...
Lass es einfach so, es funktioniert ja(tm).
Verfasst: Donnerstag 10. April 2008, 12:49
von sea-live
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);
}
}
}
Verfasst: Donnerstag 10. April 2008, 15:59
von sea-live
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)