[Python] Wie kann ich am besten meine Elemente in den untersten leeren String tun?

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.

python1noob 
Beitragsersteller
 18.10.2022, 00:54

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.


python1noob 
Beitragsersteller
 17.10.2022, 03:20

Hallo, KarlRanseierIII.

Ich habe 2 Folgende Outputs:

lst_1 = [['🍇', '🍉', '🍌', '🍎', '🍪', '🍬'],
['🍇', '🍉', '🍑', '🍑', '🍬', '🍭'],
['🍇', '🍌', '🍩', '🍬', '🍬', '🍬'],
['🍇', '🍎', '🍒', '🍩', '🍬', '🍬'],
['🍉', '🍑', '🍩', '🍩', '🍩', '🍬']]

lst_2 = [['🍇', '🍉', '🍌', '🍎', '🍪', '_'],
['🍇', '🍉', '🍑', '🍑', '_', '🍭'],
['🍇', '🍌', '🍩', '_', '_', '_'],
['🍇', '🍎', '🍒', '🍩', '_', '_'],
['🍉', '🍑', '🍩', '🍩', '🍩', '_']]

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.

KarlRanseierIII  17.10.2022, 03:58
@python1noob

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 ...

KarlRanseierIII  17.10.2022, 05:01
@KarlRanseierIII

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