@Chimera: Wenn Du es nicht so kompliziert mit den ``if``-Abfragen haben möchtest, kannst Du auch einfach eine Liste erstellen, die 20 Listen enthält, die jeweils 50 Leerzeichen als Elemente enthalten. Da kannst Du dann an den entsprechenden Koordinaten die Zeichen für deine Spielelemente einfach eintragen. Dann die inneren Listen zu Zeichenketten zusammenfügen, und diese Zeichenketten dann zu einer grossen zusammenfügen, wobei die einzelnen Zeichenketten durch '\n' getrennt werden. Und schon hast Du ein ganzes Feld.
Bei Deiner jetzigen Lösung könntest Du `i` auch von 1 bis ``fy - 2`` laufen lassen. Dann sparst Du im Folgenden einige ``- 1`` ein. Wobei ich übrigens nicht ganz sicher bin, ob Du wirklich ``- 2`` beim Endwert meintest!?
Bei den ``if``-Abfragen könntest Du einige verknüpfte Bedingungen einfacher schreiben. Python kann Operatoren "verketten". `a op1 b op2 c` ist äquivalent zu `a op1 b and b op2 c`, wobei `op1` und `op2` beliebige binäre logische Operatoren sind.
Der Quelltext auf Modulebene sollte in einer Funktion verschwinden. Das macht das Programm übersichtlicher, verringert die Gefahr, dass in Funktionen "globale" Werte benutzt werden, und mit folgendem Idiom kann man das Modul dann auch als solches importieren, ohne dass das Programm losläuft:
Code: Alles auswählen
def main():
# Der Code auf Modulebene...
if __name__ == '__main__':
main()
Zusammengehörige Werte könntest Du zu Tupeln (und später eigenen Datentypen (Klassen)) zusammenfassen und ihnen vernünftige Namen geben. Wenn man etwas durch einen sprechenden Namen ausdrücken kann, sollte man das einem Kommentar vorziehen.
Code: Alles auswählen
feld_dimensionen = (50, 20)
schlitten = (1, 6, 1) # Position und Höhe
ball = (47, 7)
Wenn man an die Werte dann herankommen möchte, sollte man in der Regel "tupel unpacking" einem Indexzugriff vorziehen, weil man sonst unverständliche "magische" Zahlen, statt sprechender Bezeichner hat.
Code: Alles auswählen
ball_x, ball_y = ball
feld[ball_y][ball_x] = '*'
# statt
feld[ball[1]][ball[0]] = '*'
# später mit eigenen Datentypen dann
feld[ball.y][ball.x]
Ich habe die verschachtelte Liste `feld` genannt. Du hast die Funktion so genannt -- bessere Namen für Funktionen und Methoden sind Verben, die Tätigkeiten beschreiben, statt Namen für Dinge. Funktionen tun etwas. ``zeichne_feld()` wäre zum Beispiel ein besserer Name.
Ansonsten noch ein paar Formatierungshinweise: Zeilen sollten nicht länger as 80 Zeichen sein, und vor und nach Operatoren und nach Kommata sollte man jeweils ein Leerzeichen setzen. Leerzeichen sollten auch um Zuweisungen ausserhalb von Argumentlisten stehen. Das erhöht die Lesbarkeit.
Zuguter Letzt möchte ich Dich noch ein wenig bei diesem Projekt bremsen. Du solltest Dich mal um die Benutzereingabe kümmern bevor Du mit etwas anderem weitermachst. Das ist nämlich plattformübergreifend nicht einfach hinzubekommen.