![]() |
Das wohl beste Schlange der Welt
Liste der Anhänge anzeigen (Anzahl: 2)
Moin ihr, :angel:
hier habt ihr mal das vermutlich allerbeste Schlange-Spiel (Snake, falls es wer nicht kennt) der Welt. Ich denk mir, daß es vorallem wegen der extrem vielen Kommentare vorallem für lernwillige Schüler bestens geeignet ist. Dazu kommen noch die voll aussagekräftigen Objekt- und Variablennamen und auch die sehr verständlich beschrifteten Buttons. Ansonsten besteht es auch nur einem Label, 2 Buttons, 3 4 Timern (mir fällt bestimmt noch was für Weitere ein) und 2561 3102 Images. Und einer knuffigen nur ~15 MB kleinen DFM ... wobei die Bilder selber nur je 2-3 KB sind. (schon erstaunlich, wie gut 7-Zip komprimieren kann :roll: ) Es gibt aber inzwischen auch ein paar "optimiertere" Versionen. (siehe ![]() Aber ihr müßt zugeben, die Grafik ist doch erstklassig, oder? :angel2: :duck: schnell weg hier PS: mit neueren Delphis gibt es ein klitzekleines Problemchen Zitat:
Aber dafür soll es ja ein Fixup geben > ![]() Falls noch wer weitere Ideen für weitere Verschlimmbesserungen hat ... sagt es ruhig. Und ja, ich hatte grad etwas Lange Weile und mir fehlt der Negierenthread. :cry: [add] ach ja, mein letztes richtiges Snake hatte ich noch in QBasic programmiert :angel: [add] Weitere Infos, zu den einzelnen Versionen, sind im ![]() |
Re: Das wohl beste Schlange der Welt
![]() Sound und Musike fehlt ! Da könnte man noch ein paar MB verbrutzeln oder 2²³ Timer verwenden. Irgenwie hat sich mein Delphi gerade ![]() |
Re: Das wohl beste Schlange der Welt
OK, hab mir grad die Original Nibbles-Sounds besorgt ... jetzt muß ich sie nur noch in Windows.
![]() PLAY "MBT160O1L8CDEDCDL4ECC" PLAY "T160O1>L20CDEDCDL10ECC" PLAY "MBO0L16>CCCE" PLAY "MBO0L32EFGEFDC" |
Re: Das wohl beste Schlange der Welt
Ehrlich gesagt verstehe ich gerade den Sinn nicht ganz :oops:
Habs mir jetzt nicht angeschaut, aber was bitte sollen 3 Timer und 2561 Images? Den Anfängern erklärt man immer, dass man sowas nicht machen soll und dann findet man in der OpenSource-Sparte sowas :gruebel: Bin auf die ersten Threads gespannt, wo es heißt: "Habs genauso wie ->hier<- gemacht, aber irgendwie funktionierts nicht" ;-) Patti |
Re: Das wohl beste Schlange der Welt
Den Sinn kann ich dir nennen: Himi ist mal wieder langweilig und macht daher irgendeinen Blödsinn. :mrgreen:
Lustige Idee und für die paar Images recht performant. |
Re: Das wohl beste Schlange der Welt
hallo Patti,
nichts für ungut, Du hast's nicht verstanden, Genau so sollte man's nicht machen. Zitat:
Gruß K-H P.s. und alles in Handarbeit? |
Re: Das wohl beste Schlange der Welt
Schön finde ich auch:
Zitat:
|
Re: Das wohl beste Schlange der Welt
Nja, vielleicht hab ich es noch nicht ironisch genug angepriesen :lol:
Es ist praktisch 'ne Antipatterndesignstudie. ( ![]() Also genau so, wie man es nicht machen sollte. Zitat:
die Idee ist mir Aufgrund eines gewissen "Programm zurücksetzen"-Threads gekommen :) Eigentlich wollte ich auch noch die ganzen Einrückungen aus dem Code entfernen, aber ich hab's dann doch gelassen :nerd: Kann ja jeder selber noch machen > Strg+A Strg+Shift+UUUU Zitat:
Zitat:
Nur blöd, daß ich es dann nicht direkt übernehmen konnte, da D7 die ganzen GIFs aus den Images gelöscht hatte :? |
Re: Das wohl beste Schlange der Welt
Zitat:
Ich frage mich nur, ob man seine Zeit vielleicht nicht NOCH sinnvoller nutzen könnte :gruebel: :mrgreen: Frage: Wo sind denn bitte die 2561 Images? Selbst wenn ich für jedes Feld, das auf dem Screenshot zu sehen ist, 1 Image rechne, komme ich nur auf 640 Stück :gruebel: Patti |
Re: Das wohl beste Schlange der Welt
1 für den Hintergrund und dann sind nochmals je mehrer Images hintereinander/übereinander
(pro Bild/Feld Eines ... also aktuell je 4 Images) |
Re: Das wohl beste Schlange der Welt
Die Bestenliste fehlt, ganz wichtig! :)
|
Re: Das wohl beste Schlange der Welt
Vermutlich ein paar übereinander --> jenachdem welches gesehen werden soll :)
Cooles Dings! |
Re: Das wohl beste Schlange der Welt
es war so grauslich, daß ich den Fehler 87 ganz übersehen hab.
war da WINEXEC schuld? oder muß ich das selbst heraus finden? Gruß K-H P.S. das schlimme ist ja das das Teil wirklich funktioniert, ein bißchen lahm auf der Tastatur, aber ES GEHT! |
Re: Das wohl beste Schlange der Welt
Der 87-Fehler scheint nur in der "neueren" VCL zu liegen.
Diese gibt einfach nach so 500-1000 Objekten auf. Man kann sich dann die Form nicht mehr ansehn, wobei Kompilieren dennoch geht, aber sobald die VCL ebenfalls im Programm die Form laden soll, dann ist der Fehler auch dort. @p80286: ich war ehrlich gesagt auch sehr überrascht, daß es dennoch so gut läuft :shock: Und das mit dem langsam Reagieren: Es wird jeweils die lezte Taste (pro Intervall) alle 100ms ausgewertet und es werden keine schnellen Tastenfolgen zwischengespeichert. Soll es schneller reagieren, dann einfach die Zeit von Timer2 runtersetzen, aber dann ist auch die Schlange schneller. :) [add] Zitat:
|
Re: Das wohl beste Schlange der Welt
Zitat:
|
Re: Das wohl beste Schlange der Welt
Wat ne Freakshow... :lol:
Aber die Idee, ein Snake aus DP-Foren-Symbolen zu machen, finde ich irgendwie... lustig. :mrgreen: |
Re: Das wohl beste Schlange der Welt
Liste der Anhänge anzeigen (Anzahl: 1)
Dann will ich mal nicht zurückstecken und ein Musterbeispiel für leserlichen Code präsentieren. Das Programm ist natürlich noch ausbaufähig *g*.
|
Re: Das wohl beste Schlange der Welt
Wer schon immer Mal wissen wolltet, wie man mit Delphi Musik macht: :nerd:
Delphi-Quellcode:
uses Windows, Math;
procedure TForm1.FormCreate(Sender: TObject); const C = 0/8; D = 1/8; E = 2/8; F = 3/8; G = 4/8; A = 5/8; B = 6/8; H = 7/8; var T, O, L: Integer; X: Extended; begin // PLAY "T160 O1 L8 C D E D C D L4 E C C" T := 160; {160} O := 1; L := 8; Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * D / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * E / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * D / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * D / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); L := 4; Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * E / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Sleep(2500); // PLAY "T160 O1 >L20 C D E D C D L10 E C C" T := 160; {160} O := 1; L := 20; Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * D / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * E / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * D / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * D / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); L := 10; Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * E / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Sleep(2500); // PLAY "O0 L16> C C C E" T := 160; {160} O := 0; L := 16; Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * E / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Sleep(2500); // PLAY "O0 L32 E F G E F D C" T := 160; {160} O := 0; L := 32; Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * E / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * F / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * G / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * E / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * F / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * D / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); Beep(Round(4186 / Power(2, 6 - O)*2 + 4186 * C / Power(2, 6 - O)*2), Round((1000 / L) * (160 / T))); end; |
Re: Das wohl beste Schlange der Welt
Liste der Anhänge anzeigen (Anzahl: 1)
Fehler, geht nicht! :nerd:
|
Re: Das wohl beste Schlange der Welt
Du musst dir natürlich erstmal 'ne Power-Funktion schreiben (so 100 Zeilen lang oder sowas). :stupid:
|
Re: Das wohl beste Schlange der Welt
Tja, hätte man gleich "Windows.Beep" geschrieben ^^, aber math steht ja da.
|
Re: Das wohl beste Schlange der Welt
so, der Sound ist nun eingebaut
und es wurde auch ein Fehler behoben - wenn man "Wichtig" :lol: von links angerannt hatte, dann wurde man nicht länger. außerdem wird man nun schneller länger und (weil es so einfacher war) wird die neue Länge erst verzögert hinzugefügt und zwar erst, wenn das Schwanzende da vorbeimacht, wo der Kopf zu diesem Zeitpunkt war. (ist witzig, wenn der Schanz urplötzlich Mal kurz vor dir stehen bleibt :twisted: ) Zitat:
vielleicht erstell ich ja mal 'ne QBasic-Soundcollektion und mach 'ne Prozedur draus :-D |
Re: Das wohl beste Schlange der Welt
Zitat:
:wiejetzt: http://www.delphipraxis.net/images/common/divider.jpg Zitat:
:coder2: |
Re: Das wohl beste Schlange der Welt
Na, math in die uses-Liste und sicherheitshalber alle Beep durch Windows.Beep ersetzen. Ich kann mir allerdings kaum vorstellen, dass Du das nicht wissen willst.
|
Re: Das wohl beste Schlange der Welt
Dieses Beep ist nicht das Beep aus der SysUtils (welches eine Umleitung zu MessageBeep(0) ist), sondern das Beep aus der Windows.pas
Also Windows.Beep oder Windows hinter die SysUtils in die Uses hauen. Ach ja: und der PC sollte einen Speaker haben (der kleine Lautsprecher im Gehäuse) nicht so wie bei mir, welcher vorhin ausgeschaltet war :wall: |
Re: Das wohl beste Schlange der Welt
[spässchen]
Zitat:
Delphi-Quellcode:
geht auch nicht!!!
uses
SysUtils, Windows.Beep; :zwinker: :mrgreen: [/spässchen] |
Re: Das wohl beste Schlange der Welt
:lol:
|
Re: Das wohl beste Schlange der Welt
Da wollte ich grade noch 'ne Ebene bzw. ein neues Feld einbauen und was ist?
Ab genau 2899 Images kann man selbst im guten alten Delphi 7 nichts mehr machen. Es sind zwar alle 3200 Images in der Form, aber Speichern läßt sich nix mehr und auch rauskopieren geht ebenfalls nicht, denn dann kommt nur noch Zitat:
is ja voll gemein :cry: In Delphi ist ja garnichts möglich ... vielleicht sollte ich doch zu C# wechseln :stupid: |
Re: Das wohl beste Schlange der Welt
Zitat:
:stupid: |
Re: Das wohl beste Schlange der Welt
Und ich wollte schon ernsthaft antworten nachdem ich die .exe gestartet habe, bis ich dann doch noch den Code angeschaut habe :stupid:
Fast 3000 Zeilen -> *RESPECT* Und wenn ich mir die Beep Zeilen anschaue bekommt das Wort Redundanz eine ganz neue Bedeutung! :mrgreen: |
Re: Das wohl beste Schlange der Welt
Zitat:
> kleines Update ... so alle 60 Sekunden taucht noch ein nettes [?] auf, welches nette sachen macht Wobei 3000 Zeilen davon nur die Klassendefinition (das Interface) abfallen Und wenn man den Code wirklich optimiert, dann sollte man bestimmt locker die 300 Zeilen unterschreiten können :) ich editiere es oben dann gleich auch noch (es sind ja nun 4 Timer und 3102 Images, was fast das Maximum ist, was D7 noch schafft) und 'ne nette 15 MB kleine DFM |
Re: Das wohl beste Schlange der Welt
Zitat:
(Oder alternativer Contest: Wer schreibt das coolste Snake Programm mit <= 300 Zeilen Code.) Erinnert mich an die Scene-Contests mit ![]() |
Re: Das wohl beste Schlange der Welt
![]() |
Re: Das wohl beste Schlange der Welt
Zu den Images: Ich hatte letztens ein C# Projekt im VS2008 wo ich versucht habe, 16 Buttons mit Bildern zu füttern. Ging nicht. Die letzten 5 gingen partout nicht rein (man konnte nicht mehr speichern wg. einer OutOfMemory-Exception) Es waren Bilder einer Digitalkamera, also zugegebenermaßen hochaufgelöst.
Ich musste die dann erst verkleinern bevor alles lief :roll: Btw.: Die Bilder wurden base64-encodiert in einer XML-datei gespeichert ... |
Re: Das wohl beste Schlange der Welt
Zitat:
Btw. Himitsu, du bist nicht damit gemeint. MfG |
Re: Das wohl beste Schlange der Welt
Himitsu, wenn das ein Beispiel sein soll, wie man es nicht macht, dann könntest Du ja dieses Beispiel nehmen und auch gleich zeigen, wie man es richtig macht, wenn Du schon so viel Zeit hast :zwinker: Was hälst Du davon ?
|
Re: Das wohl beste Schlange der Welt
Aber das ist doch auch mal ne variante:
Man sucht im I-Net... "ahh, dieses Wort "if" kommt auch in dem unbeispiel vor, darf ich also nicht nehmen..." :stupid: :stupid: |
Re: Das wohl beste Schlange der Welt
Für die vielen IFs gibt es ja auch das CASE :stupid:
Sooooooooooo, jetzt gibt es 3 Versionen 0: das originale "wie man es vielleicht nicht machen sollte" 1: dort wurde(n) - einige Variablennamen und Buttonbeschriftungen verständlichert - die Groß-/Kleinschreigung verbessert - Code-Duplikate entfernt und in eigene Funktionen/Prozeduren gekapselt - der Inhalt vom häßlichen Label in die Titelleiste verschoben - der Reset wird nicht mehr über einen kompletten Neustart erledigt 2: ja und hier wurden dann noch viele der die zuvielen Images entfernt und der Status der einzelnen Felder in einem Array gespeichert, anstatt ihn aus der Sichbarkeit der jeweiligen Images zu generieren 3: kommt vielleicht auch bald hier würde dann vermutlich alles auf EIN Canvas umgestellt
Code:
An der Funktionsweise des Programms wurde aber nichts verändert.
. DFM- EXE- PAS PAS
Größe Größe Größe Zeilen 0: 15 MB 7,2 MB 93 KB 3636 1: 15 MB 7,1 MB 6,3 KB 247 2: 266 KB 589 KB 6,1 KB 250 3: - - - - (abgesehn von dem Label, dem Reset und einer "besseren" Button-Steuerung aka SetFokus) Codes in ![]() ![]() Man mag es nicht glauben, aber in der knapp 410 KB kleinen 7Zip sind unschlagbare 44 MB drinnen. Das sollte wohl auch erkenntlich machen, daß selber die Komprimierungsprogramme der Meinung sind, daß da etwas leicht unoptimal gelaufen ist. :angel: Und das Ganze zeigt, wohl, daß ein paar "kleine" Optimierungen - kein doppelter/mehrfacher Code - eine halbwegs ordentliche Codeformatierung - und ein gesundes Maß an Optimierung den gesamten Code wesentlich lesbarer und verständlicher machen. :angel: Und es spart sogar Zeit und Nerven ... ihr glaubt nicht, wie anstrengend es war all diese Images dort reinzubekommen und sich bei der Indizierung nicht ständig zu verzählen (im Programmcode). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 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