[Python] Wie kann ich am besten meine Elemente in den untersten leeren String tun?
Ich übe grad Python und wollte aus Übungsgründen ein Slotspiel machen.
Bisher habe ich soweit geschrieben, dass 8 oder mehr gleich Symbole in meinem Spiel, zu einem leeren String gemacht werden, nun möchte ich das die oben "schwebende" Element in die untersten leeren Strings fallen, bis sie entweder am Boden sind oder oben auf ein Symbol "fallen".
Ich hab schon 2 Stunden rum probiert, komme aber nicht weiter.
Hat jemand Ideen?
Falls ihr bei dem zweiten reel keine leeren Strings bekommt, führ den Code 1,2 neu aus bis 8 oder mehr Symbole kommen.
Dankeschön!
3 Antworten
Meinst Du etwa sowas:
def dropline ( top, bottom ):
# move entries from top to bottom, if bottom is blank:
top[:], bottom[:] = zip(*[(c[1],c[0]) if c[1]==" " else c
for c in zip(top, bottom)])
# let items bubble down through a whole matrix:
for i in range(len(matrix)-1):
dropline( matrix[i], matrix[i+1] )
Ein kleiner Fehler steckt da noch drin: Ein Symbol fällt nur dann, wenn darunter ein Blank ist. Von einer schwebenden Säule bewegt also sich nur das unterste Symbol. Du musst die Schleife mehrfach wiederholen, damit die ganze Säule fällt:
# let items bubble down through a whole matrix:
for _ in range(len(matrix)-1):
for i in range(len(matrix)-1):
dropline( matrix[i], matrix[i+1] )
Und falls Dir dropline() zu kryptisch ist, geht es auch anders:
def _dropline ( top, bottom ):
# move symbols from top to bottom, if the latter is blank:
for i in range(len(top)):
if bottom[i]==' ':
top[i], bottom[i] = bottom[i], top[i]
____________________
Die ganze Sache wird wesentlich einfacher, wenn Du das Spielfeld spaltenweise speicherst. Dann brauchst Du nur in jeder Spalte die Leerzeichen an den Anfang ziehen:
# let items bubble down through a whole matrix:
for column in matrix:
column[:] = [ c for c in column if c==" " ] \
+ [ c for c in column if c!=" " ]
Allerdings musst Du jetzt u.a. für die Ausgabe zip(*Matrix) verwenden.
____________________
Noch ein paar Tipps:
- Statt ["🍇" for x in range(30)] geht auch ["🍇"]*30.
- Python erlaubt Vergleichsketten: 3 < chance <= 7 ist lesbarer als chance <= 7 and chance > 3
- Schau Dir mal die Klasse Counter aus collections an. In fruit_counter() könntest Du statt der länglichen Zähl-Schleife einfach counts.update(reel) schreiben, und in remover() dann z.B. counts["🍇"] >= 8 abfragen. Deine hässlich langen return-Tupel verschwinden dabei auch.
hm, sehr interessant, bin ein blutiger Anfänger.
Danke für die Antwort und die Tipps!
Sorry, Frage ist nicht verständlich - Aber wenn ich den Code sehe......
Mal als Input:
>>> random.choices( ('A','B','C','D') , weights=(10,3,6,20), k=6)
['A', 'D', 'A', 'D', 'C', 'D']
Mit etwas Geschick kannst du Dir Deine spin()-Funktion mehr oder minder schenken. Und auch die Art und Weise wie Du da Comprehensions mißbrauchst ist echt übel, generell für die Zukunft:
>>> ['A']*3
['A', 'A', 'A']
>>> [1,'A',9]*2
[1, 'A', 9, 1, 'A', 9]
Du kannst eine Liste einfach multiplizieren - zumindest mit einem int.
Okay, also, Grundidee
for row in range(1,len(list_2)):
if ' ' in list_2[row]: # könnte man sich sparen
for i,v in enumerate(list_2[row]):
if v=' ':
list_2[row][i],list_2[row-1][i]=list_2[row-1][i],list_2[row][i]
Lässt sich vermutlich hübscher schreiben, aber hey.
Ach mist, zu kurz gedacht ... so wird das nciht klappen ...
Ich hoffe ich bin nicht zu müde:
for row in range(1,len(lst_2)):
for i,s in enumerate(lst_2[row]):
if s=='_':
for j in range(row,0,-1):
lst_2[j][i],lst_2[j-1][i]=lst_2[j-1][i],lst_2[j][i]
Notfalls füge mal Ausgaben ein und korrigiere Offsets etc. .
Ich glaube Objekt orientiert wäre das wesentlich einfacher.
Ich bin aber selbst Anfänger
Hallo, KarlRanseierIII.
Ich habe 2 Folgende Outputs:
Ich habe was geschrieben, dass erkennt, das in lst_1 eines der Symbole die dort vorhanden sind mehr als 8 Stück sind.
lst_2 hat alle Symbole die mehr als 8 sind zu einem "_" ersetzt.
Jetzt würde ich gerne wissen wie ich es schaffe, dass alle Symbole in lst_2 die über einem "_" sind nach unten "fallen" z.B soll lst_2[1][5] nach lst_2[4][5] rutschen.