Tetrinoxid - Tetris mit Pygame

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Ich hab mich mal wieder hingesetzt und etwas mit pygame gespielt (nachdem ich SSL+Python nun echt nicht mehr sehen kann :twisted: ). Herausgekommen ist diesmal ein Tetris-Klon.
Freue mich wie immer auf euer Feedback, insbesondere zum Source.
Für Windows Benutzter gibt es eine setup.exe, für alle anderen ein Tarball welches ihr einfach nach $PREFIX entpacken könnt. Unter nicht Windows Systemen wird Python 2.4 sowie pygame Benötigt. Getestet habe ich das ganze auf Arch Linux, Ubuntu Feisty, sowie Windows XP Prof mit SP2.

Download/Source:
http://29a.ch/tetrinoxid/

Screenshot:
Bild
Zuletzt geändert von veers am Sonntag 2. September 2007, 16:57, insgesamt 1-mal geändert.
abgdf

Ja, das ist Tetris. Sehr hübsch !
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Schön das du es fertig gemacht hast. Auch gefällt mir deine Mühe daraus ein richtiges Paket zu machen. Sogar ein Introvideo ist dabei. Insgesamt kann ich behaupten das du dir viel Mühe gegeben hast und sauber gearbeitet hast.

Das es jetzt nicht das revolutionär neue Spielprinzip ist kann zwar als Kritik gewertet werden, sehe ich aber nicht so eng.

Zum Source hab ich natürlich ein paar Fragen und natürlich Anregungen. Ich bin (noch) nicht der Python Freak also sollten meine Vorschläge nicht so "abgehoben" wirken :)

1. Highscoreliste, könnte man Ideal mit Pickle lösen, spart geschätzte 10 Zeilen und wäre einfacher zu lesen (der Code).
2. setgrid in Blocks zeichnet bei jeder Änderung neu, kann man das eventuell verhindern?
3. Du erstellst die Blöcke bei jedem Zeichenvorgang neu? Notwendig?
4. Mir würde es gut gefallen wenn einige Einstellungen in "Datafiles" wandern würden. Z.b. die Blockformen und Farben.
5. Mehrere Geschwindigkeiten wären sehr gut.
6. Zeichenausgaberoutinen einführen -> Bastel dir etwas das die leidige Aufgabe des Fontsrenderings vereinfacht. Hier könnte auch das Rendern wegfallen wenn sich der Inhalt nicht geändert hat.
7. time.sleep(x) ist mir nicht ganz klar da sich ja pygame soweit ich weiß auch darum kümmern kann das ein Framelimiter läuft.
8. Schön wäre es noch wenn ein "halten" einer Taste einen Block weiterbewegen würde als nur 1 Feld.
9. ist "del intro" wirklich notwendig? Kümmert sich Python nicht sowieso selbst um sowas?
10. Sanftes bewegen der Blöcke, nicht "hüpfen
11. Kontrollierter Zufall -> Warscheinlichkeiten der Blöcke abhängig des Levels
12. Puzzle Modus :D
13. Shader Unterstützung und hohe Auflösungen :D

Aber wie gesagt, gut das es fertig ist ;)

lgherby
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Schön das du es fertig gemacht hast. Auch gefällt mir deine Mühe daraus ein richtiges Paket zu machen. Sogar ein Introvideo ist dabei. Insgesamt kann ich behaupten das du dir viel Mühe gegeben hast und sauber gearbeitet hast.

Das es jetzt nicht das revolutionär neue Spielprinzip ist kann zwar als Kritik gewertet werden, sehe ich aber nicht so eng.

Zum Source hab ich natürlich ein paar Fragen und natürlich Anregungen. Ich bin (noch) nicht der Python Freak also sollten meine Vorschläge nicht so "abgehoben" wirken :)
thelittlebug hat geschrieben: 1. Highscoreliste, könnte man Ideal mit Pickle lösen, spart geschätzte 10
Zeilen und wäre einfacher zu lesen (der Code).
Hatte ich Anfangs auch so gelöst, hab dann aber einiges bezüglich sicherheits Bedenken und Pickle gelesen, unds dann umgeschrieben. Die sicherheits Probleme sollen zwar schon (wie ich später herrausgefunden habe ) seit Version 2.2? gelöst sein aber ich habs dann bei dem Textfile belassen. Ist transparent und benötigt keine weitere library.
thelittlebug hat geschrieben: 2. setgrid in Blocks zeichnet bei jeder Änderung neu, kann man das eventuell verhindern?
Könnte man ja. Aber ich glaube nicht dass es den Aufwand Wert ist.
thelittlebug hat geschrieben: 3. Du erstellst die Blöcke bei jedem Zeichenvorgang neu? Notwendig?
Nein, aber auch hier denke ich wieder das es denn Aufwand nicht Wert ist. Wäre aber Sinnvoll wenn ich etwas komplexere Blöcke hätte.
4. Mir würde es gut gefallen wenn einige Einstellungen in "Datafiles" wandern würden. Z.b. die Blockformen und Farben.
thelittlebug hat geschrieben: 5. Mehrere Geschwindigkeiten wären sehr gut.
Sprich Level wahl? ;)
thelittlebug hat geschrieben: 6. Zeichenausgaberoutinen einführen -> Bastel dir etwas das die leidige Aufgabe des Fontsrenderings vereinfacht. Hier könnte auch das Rendern wegfallen wenn sich der Inhalt nicht geändert hat.
Da hast du absolut Recht, mit einer eigenen Text Klasse hätte ich das viel hübscher lösen können

thelittlebug hat geschrieben: 7. time.sleep(x) ist mir nicht ganz klar da sich ja pygame soweit ich weiß
auch darum kümmern kann das ein Framelimiter läuft.
Ja, aber pygame scheint busy waiting zu betreiben, und ich mags nicht wenn ein Tetris vollkommen sinnlos eine CPU voll auslastet.
thelittlebug hat geschrieben: 8. Schön wäre es noch wenn ein "halten" einer Taste einen Block weiterbewegen würde als nur 1 Feld.
Habe ews so gemacht um mehr Kontrolle zu haben. Nach dem Testen haben mir aber des öftern die Arme geschmerzt. War vielleicht doch keine so gute Entscheidung.
thelittlebug hat geschrieben: 9. ist "del intro" wirklich notwendig? Kümmert sich Python nicht sowieso selbst um sowas?
Gute Frage, hab mich mit der Garbage Collection von Python noch nicht beschäftigt. Habe es explizit gemacht aus Gewohntheit. Grosses Object welches ich sicher nicht mehr brauche - gleich explizit löschen.
thelittlebug hat geschrieben: 10. Sanftes bewegen der Blöcke, nicht "hüpfen"
Wär möglich, würde jedoch so seine Probleme bringen mit dem verschieben in Lücken.
thelittlebug hat geschrieben: 11. Kontrollierter Zufall -> Warscheinlichkeiten der Blöcke abhängig des Levels
Hm da verstehe ich denn Sinn nicht so ganz.
thelittlebug hat geschrieben: 12. Puzzle Modus :D
So in From eine Halbnackten Frau die dann als Hintergrund für die Blöcke verwendet wird, so das Mann versucht das Feld möglichst voll zu bekommen.
thelittlebug hat geschrieben: 13. Shader Unterstützung und hohe Auflösungen :D
Tetris HD, wahaha ;) Shader sind mit pygame wohl leider nicht möglich ;)

Auf jeden Fall vielen dank für dein Feedback! Werde es vielleicht noch hier, sicher aber im nächsten Projekt berücksichtigen.
BlackJack

Zum ``del intro``: Du löscht nicht das Objekt, sondern erst einmal nur den Namen. Das kann dann zur Folge haben, dass das Objekt gelöscht wird.
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Ja, mehrere Levels wären warscheinlich nicht so schlecht.

Busy waiting wär mir noch nie aufgefallen. Ich habe mal sowas ähnliches wie SuperCollapse3 programmiert und das hatte eine Auslastung von ~15% auf meinem betagten AMD Athlon XP 1900. Allerdings wurden da die Blöcke nicht jedes mal neu in die Buffer geladen ;)

Also soweit ich Blackjack verstanden habe kann man das "del intro" weglassen.

Kontrollierter Zufall bringt nur in Verbindung mit Levels etwas. Z.b. könnte man in einem lvl die Zahl dieser Blöcke

Code: Alles auswählen

**
 **
erhöhen.

Für Shader könntest du auf OpenGL umsteigen :D

lgherby
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

"Choose zero polys and shaders" *sing*


Edit: Gnaa, [url] heult rum, daher hier der URL: http://www.kewlers.scene.org/bitchard/t ... rsion).mp3
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

veers hat geschrieben:
thelittlebug hat geschrieben: 1. Highscoreliste, könnte man Ideal mit Pickle lösen, spart geschätzte 10
Zeilen und wäre einfacher zu lesen (der Code).
Hatte ich Anfangs auch so gelöst, hab dann aber einiges bezüglich sicherheits Bedenken und Pickle gelesen, unds dann umgeschrieben. Die sicherheits Probleme sollen zwar schon (wie ich später herrausgefunden habe ) seit Version 2.2? gelöst sein aber ich habs dann bei dem Textfile belassen. Ist transparent und benötigt keine weitere library.
Nein, ``pickles`` sind eben unsicher, da sie eben Beliebige objekte serialisieren können. Deswegen setzt man sie nicht für RPC ein und schickt sie nicht durchs Netz. Für den lokalen Gebrauch sind sie in der Regel sicher genug.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Leonidas hat geschrieben:
veers hat geschrieben:
thelittlebug hat geschrieben: 1. Highscoreliste, könnte man Ideal mit Pickle lösen, spart geschätzte 10
Zeilen und wäre einfacher zu lesen (der Code).
Hatte ich Anfangs auch so gelöst, hab dann aber einiges bezüglich sicherheits Bedenken und Pickle gelesen, unds dann umgeschrieben. Die sicherheits Probleme sollen zwar schon (wie ich später herrausgefunden habe ) seit Version 2.2? gelöst sein aber ich habs dann bei dem Textfile belassen. Ist transparent und benötigt keine weitere library.
Nein, ``pickles`` sind eben unsicher, da sie eben Beliebige objekte serialisieren können. Deswegen setzt man sie nicht für RPC ein und schickt sie nicht durchs Netz. Für den lokalen Gebrauch sind sie in der Regel sicher genug.
Naja das ganze ist ja nicht wirklich lokal sondern Systemweit. Und es ist ja nicht wirklich toll wenn dannach jeder Benutzer auf dem System Code mit den Rechten eines anderen ausführen kann.
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

So hab ich mir das noch gar nicht überlegt. Auch wenn es sich "nur" um ein Spiel handelt, das sicherlich "selten bis gar nicht" auf einem Server oder einer Maschine läuft die mehreren Leuten, die sich nicht gegenseitig trauen, das tägliche Brötchengeld einspielt, ist es wahrscheinlich besser gleich auf pickle zu verzichten. Gibt es eine sichere Alternative zu Pickle die vielleicht nur Daten speichern kann und Code weglässt?

lgherby
BlackJack

Für eine Highscoreliste sollte eigentlich eine einfache Textdatei reichen. Entweder selbstgestrickt, oder mit `csv` oder `ConfigParser`.

Für verschachtelte Daten bietet sich JSON an. Leider ohne passendes Modul in der Standardbibliothek.
Antworten