Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Conway's Game Of Life (GoL); auch noch von mir (https://www.delphipraxis.net/140594-conways-game-life-gol-%3B-auch-noch-von-mir.html)

Lumpiluk 21. Sep 2009 20:23


Conway's Game Of Life (GoL); auch noch von mir
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen!
Ich habe (wie viele andere ja auch) irgendwann mal ein Game Of Life programmiert. In letzter Zeit habe ich es nun noch um einiges verbessert und erweitert und vor Allem übersichtlicher gestaltet :)

Den Source habe ich inzwischen auch beigelegt. Vielleicht könnt ihr ja trotz der mangelnden Überschaubarkeit etwas damit anfangen :oops:

Ich freue mich über Kritik und Verbesserungsvorschläge!
Ich bin mir nicht sicher, ob ich das hier posten darf, aber hier ist schonmal eine Vorschau als Video. Falls es doch nicht erlaubt sein sollte, sagt mir bescheid (in den Regeln habe ich dazu jetzt nichts gefunden).

Hier ein paar Features:
- variable Feldgröße mit Torusfunktion (was z.B. rechts rausgeht kommt links wieder rein)
- anpassbare Geschwindigkeit
- beliebiges setzen von Figuren aus einer Auswahl von ca. 370 Stück (fast alle aus diesem Lexicon wurden eingebaut)
- Farbe anpassbar (mit 'Rainbow'-Funktion: automatischer Farbwechsel)
- Zufallsfüllung der Fläche
- Generationenzähler
- Möglichkeit, eigene Figuren zu speichern
- Vollbildmodus und Hauptfenstertransparenz (aus irgendeinem Grund funktioniert die Transparenz nicht ganz mit den Optionen: danach sind sie immer hinter der Hauptform...)
- Zoom


//edit:
Hier ist die neue Version! Danke für die Hinweise 8) :-D
Falls euch noch was stört: sagt Bescheid

Delphi-Laie 21. Sep 2009 22:08

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Zitat:

Zitat von Lumpiluk
Ich freue mich auf Kritik und Verbesserungsvorschläge!

Aber gern - mir sind sofort zwei Dinge aufgefallen:

1. Die Anzahl der Zellen ist unabhängig von den Fensterabmessungen. Ich erinnere mich dunkel, daß ich mal ein solches Programm hatte (sicher irgendwo gebrannt, doch dafür werde ich mich nicht durch den CD-Stapel kämpfen, sieh mir das bitte nach), das bei vergrößertem Zoom, am besten maximiert, mehr Zellen zur Verfügung stellt. Das bietet Dein Programm leider nicht.

2. Aaaaaber: Was links am Rand verschwindet, taucht rechts wieder auf, analog alle anderen Richtungen. Damit wird Dein Spielfeld letztlich ein Baustein einer periodischen Parkettierung einer unendlichen Ebene. Mit diesem Trick eine unendliche Fläche (fast) zu simulieren, so etwas erlebte ich bei solchen zellulären Automaten noch nicht.

Viel Freude beim weiteren Feinschliff!

Medium 22. Sep 2009 00:16

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Zitat:

Zitat von Delphi-Laie
unendlichen Ebene.

Um genau zu sein ist dies ein 2-Torus, und keineswegs unendlich. Das aber wirklich nur als Spitzfindigkeit am Rande :stupid:

Delphi-Laie 22. Sep 2009 10:19

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Zitat:

Zitat von Medium
Zitat:

Zitat von Delphi-Laie
unendlichen Ebene.

Um genau zu sein ist dies ein 2-Torus, und keineswegs unendlich. Das aber wirklich nur als Spitzfindigkeit am Rande :stupid:

Yo, der Punkt geht an Dich. Ich verwechselte unendlich und schrankenlos (hoffentlich irre ich mich nicht schon wieder). Eine Ebene oben und unten sowie links und rechts zu vereinen, gibt einen Torus. Also, Conway Spiel auf der Fläche eine Torus', dargestellt in der Ebene.

himitsu 22. Sep 2009 10:56

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Was ich unhandlich finde ist, daß immer nur beim Loslassen der Maustaste ein Feld gesetzt wird.
> ich fännde es prakischer, wenn dieses beim Drücken und auch beim Verschieben pasiert.
(OnMouseDown und OnMouseMove)


Da gibt es doch rechts und unten soeine Begrenzungslinie ... da hätte ich erwartet, daß die Figuren/Felder nur innerhalb (links über) des "Spielfeldes" bleiben und nicht auch auf der anderen Seite (außerhalb).


Beim Einfügen von Figuten wäre es schön, wenn vorm Einfügen man die Figur schon sehen kann, also z.B. wie so ein Schatten im Spielfeld, da wo dann die Felder eingefügt werden, wenn man klickt.

Die [O.K.] Buttons in Figure Settings und Speed Options würde ich Close nennen, da die Einstellungen ja sofort übernommen werden und damit nur das Festerchen geschlossen wird.

Und nun noch das Wichtiges:
Mach bitte den globalen Tastaturhook raus!
Hab mich schon gewundert, was hier los ist und warum soeine Titelleiste ständig über's Bild husch, wärend ich diesen Beitrag hier verfaßte und deine Anwendung im Hintergrund lief,
bis ich merkte, daß sie auf die Tastatureingaben im FF regaierte.


PS: wozu ist eigentlich das Setup?
(hab die 7zip (exe) direkt entpackt und nötig scheint diese ja nicht zu sein :gruebel:

[add]
ach ja, diese kleinen Optionsdialog könnten doch gleich neben dem Spielfeld positioniert sein, damit man sie nicht erst noch verschieben muß.


Ansonsten isses ja ganz nett :thumb:

Luckie 22. Sep 2009 11:02

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Zitat:

Zitat von himitsu
Mach bitte den globalen Tastaturhook raus!

Das ist doch nur der zugehörige Keylogger. Wenn er den entfernt, verliert das Programm doch jeglichen Sinn und Zweck. ;)

Jetzt mal im Ernst, wozu braucht man bei einer normalen Anwendung einen globalen Tastaturhook?

Sherlock 22. Sep 2009 11:46

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Sehr schönes Programm, aber:
Der Generationszähler wird genau wann zurück gesetzt? :)

Sherlock

Lumpiluk 22. Sep 2009 13:58

Re: Conway's Game Of Life (GoL); auch noch von mir
 
So, danke erstmal an alle!

Zitat:

Zitat von Sherlock
Sehr schönes Programm, aber:
- Der Generationszähler wird genau wann zurück gesetzt?

Zurückgesetzt wird der Zähler normalerweise beim setzen einer neuen Figur. Dafür werde ich aber auch noch einen neuen Button im Menü einbauen.

- Das mit der Positionierung der Menüs dürfte eigentlich kein Problem sein.
- Naja, das Setup... :) Ich weiß, dass es Leute gibt, die sich mit PCs sehr schwer tun (mein Bruder zum Beispiel) und wenn die es immerhin geschafft hätten, die 7zip zu entpacken, wüssten die wohl immernoch nicht, wie sie das Programm starten sollen.
- Den globalen Tastaturhook hab ich drin, weil ich zuerst ein TMainMenu drin hatte und dann auf eine TToolBar umgestiegen bin. Dafür musste ich beim Menü automerge einstellen und dann waren plötzlich die Shortcuts nicht mehr da und ich bin auf getasynckeystate umgestiegen... Wie bekomme ich das besser hin?
- Den Torus kann man ausschalten
- Es stehen sehr wohl mehr Zellen zur Verfügung (Options -> Size of Workspace...). Allerdings werde ich wohl noch die TPaintBox in eine TScrollBox packen und eine Zoomfunktion einbauen.
- Und bei den Buttons gebe ich dir auch Recht ;)

So, wenn ich dann wieder zu Hause bin werde ich mich mal drum kümmern. :)

Lumpiluk 22. Sep 2009 20:23

Re: Conway's Game Of Life (GoL); auch noch von mir
 
So, die neue Version ist fertig. Viel Spaß damit ;-)

Achja, fast vergessen: Wenn ich beim zoomen das Feld zu groß mache, kommt ziemlich bald die Fehlermeldung "Für diesen Befehl ist nicht genügend Speicher verfügbar!" Woran liegt das? Ich vermute, dass es irgendwie mit der ScrollBox, dem Image oder der PaintBox zusammenhängt, von denen letztere ja immer größer werden. Das Image nicht mitwachsen zu lassen hat aber nicht viel gebracht und im Taskmanager wird auch garnicht so viel verbrauchter Speicher angezeigt (Firefox hat bei mir viel, viel mehr :) )...

HalloDu 22. Sep 2009 20:36

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Ich gehe mal davon aus, dass du die Werte in einem dynamischen Array speicherst. Wenn du nun die Größe des Arrays mit SetLength bestimmst, wird dafür Speicher reserviert. Wenn nun der Array zu groß wird, muss nun zu viel Speicher reserviert werden, was zu deiner Fehlermeldung führt.

Lumpiluk 22. Sep 2009 20:51

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Zitat:

Zitat von HalloDu
Ich gehe mal davon aus, dass du die Werte in einem dynamischen Array speicherst. Wenn du nun die Größe des Arrays mit SetLength bestimmst, wird dafür Speicher reserviert. Wenn nun der Array zu groß wird, muss nun zu viel Speicher reserviert werden, was zu deiner Fehlermeldung führt.

Es geht ja ums Zoomen, heißt: der Array bleibt gleich groß.

himitsu 22. Sep 2009 20:57

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Die Fehlermeldung komm ja, wenn nicht genug Speicher verfügbar "war",
also es wird dann kein Speicher mehr reserviert und im Taskmanager kann man da garnichts erkennen.

Debugge doch einfach mal die entsprechenden Stellen und schau wo/wann es genau "knallt".

Medium 22. Sep 2009 21:19

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Diese Meldung ist mir ab und an begegnet, wenn ich mit GDI Ressourcen etwas großzügig wurde. Erstellst du evtl. oft und schnell hintereinander Bitmaps o.ä. neu? Wenn ja, versuch mal immer nur ein Mal zu erstellen, und dann immer wieder neu befüllen, statt schnellles Spiel aus .Free und .Create.

Lumpiluk 22. Sep 2009 21:26

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Problem mehr oder weniger gelöst: Habe jetzt die Image-/PaintBox-Größe auf 3000 Pixel beschränkt. Bei mir kam immer erst danach der Fehler.

.free und .create habe ich hier selber eigentlich garnicht verwendet (ist wie gesagt ein älteres Programm, das ich bearbeitet habe und damals kannte ich das noch nicht so).

Medium 23. Sep 2009 00:54

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Aha! Okay, das heisst dass dein Bitmap (oder wo auch immer du drauf zeichnest) einfach riesig geworden ist. Das erklärt das auch, da diese seitens Windows gewissen Grenzen unterworfen sind. Die "saubere" lösung wäre hier PaintBox/Bitmap/Image selbst auch wirklich nur genau so groß zu halten wie den tatsächlich sichtbaren Bereich, aber nur das hinein zu zeichnen was man gerade sehen soll. Das heisst dass du das Scrolling nicht "faul" (überspitzt gesagt) den Steuerelementen überlassen, sondern das selbst in die Hand nehmen solltest. Das wäre auch der übliche Weg bei allen möglichen grafischen Angelegenheiten. (Auch bei Direct3D z.B. wird mittels teilweise sehr aufwendigen Methoden im Vorfeld bestimmt welche Elemente man überhaupt sehen wird, bevor sie an DX zum Zeichnen geschickt werden. Auf lange Sicht zahlt sich das generell mächtig aus, in Ressourcensparsamkeit und oft auch Geschwindigkeit.)

Lumpiluk 23. Sep 2009 12:27

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Schade, das hört sich ziemlich aufwändig zu programmieren an...
Ich stell mir das jetzt so vor:
Ich hol das Image und die PaintBox aus der ScrollBox raus und mache unten und rechts je eine ScrollBar hin. Dann müsste ich wahrscheinlich den Maximalwert der ScrollBars immer an den Array anpassen, etwas davon abziehen, damit man plötzlich nicht garnichts mehr sieht und im OnPaint nur ab deren Positionen zeichnen. Mit irgendeinem Anderen Regler könnte man dann die Zellengröße bestimmen... Ist das so im Ansatz richtig?

Heute werde ich aber höchstwahrscheinlich wegen der Schule keine Zeit mehr dafür haben. Mal sehen, wie das Wochenende aussieht.

xZise 25. Sep 2009 01:14

Re: Conway's Game Of Life (GoL); auch noch von mir
 
Also so wie ich das gelesen habe stimmt das ;)

Also wenn du nur die Pixel X=10-20 und y=5-15 sehen kannst, dann zeichnest du nur diese Pixel, aber rechnest natürlich immer mit allen Pixeln!

MfG
xZise

Lumpiluk 25. Sep 2009 17:08

Re: Conway's Game Of Life (GoL); auch noch von mir
 
So, erstmal großes Dankeschön an alle! Die eigene 'ScrollBox' dürfte soweit fertig sein und funktioniert bei mir bis jetzt wunderbar :-D .
Zwischenzeitlich habe ich sogar noch Zeit gefunden, das Schnellstartmenü etwas zu erweitern und in beide Menüs eigene kleine Icons einzufügen.
Ich hoffe, es gefällt euch!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz