nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.
Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance. Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.
Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.
Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Sieht nicht nach viel aus, aber was der Schein trügt. Ich habe quasi die API der Unity Engine nachgebaut (zumindest teilweise). Ich könnte da jetzt diverse einfache 2D Spiele mit programmieren. Das Einzige das mich stört ist die Verarbeitung der Eingabe-Ereignisse. Allerdings habe ich keine Lust mir für 4 Richtungstasten + Pause ein komplettes System zu einfallen zu lassen und zu programmieren. Das wird hardcoded und gut ist.
Bis auf ein paar Kleinigkeiten steht das Grundgerüst. Dann kann ich bald Snake schreiben (was mit meiner "Engine" einfach ist), die GUI erweitern für Punkte, Zeit, etc. (was mit QtQuick einfach ist) und dann ganz, ganz, ganz viel Eye-Candy hinzufügen. Ich habe bewusst den Aufbau einer richtigen Engine gewählt und Zeit habe ich ja auch noch genug.
*) Zusätzlich wird eine Compilierte .exe zum Download angeboten, bei Implementierung in Javascript, PHP etc. ein aufrufbarer Weblink, bei Java die .jar und evtl. eine .bat / sh dazu.
Der Code ist, wenn man einmal von der nicht vorhandenen Formatierung und den kurzen Variablennamen absieht, nur an einer einzigen Stelle tatsächlich `obfuscated` im klassischen Sinne: Der String `Obfuscated Snake` wird über einen regulären Ausdruck erzeugt, damit er nicht offensichtlich im Quelltext auftaucht (und das auch bloss, weil dafür noch Platz in den 10 x 120 Zeichen war). Allerdings verwendet der Code absichtlich einige Perl-Idiome, ANSI-Escape-Sequenzen und magische Zahlen. Derselbe Code mit hinzugefügter Formulierung und einigen Kommentaren:
[src=perl]use Term::ReadKey;
# k() => Taste von Konsole lesen
sub k {
return ReadKey(-1)
};
# ak() => Kompletten Tastaturbuffer lesen
sub ak {
$k = '';
$k .= $c
while ($c = k());
return $k;
};
# Terminal initialisieren: Raw-Modus ...
ReadMode 5;
# ... und Output-Buffering aus.
$ |= 1;
# Im Tastaturbuffer befindet sich nun eine Sequenz der Form `\e[y;xR`, wobei x und y die Koordinaten der unteren
# rechten Ecke sind. Diese Sequenz auslesen.
($s .= $c) until(($c = k()) eq 'R');
# ... und die Zahlen extrahieren - $h = Hoehe, $w = Breite des Terminals
$s =~ s/[^0-9;]//g;
($h,$w)=split(/;/,$s);
# Wenn `q` im Eingabepuffer => Spielabbruch
last if ($k =~ /q/);
# Wenn eine Pfeiltaste gedrueckt wird, findet sich im Eingabepuffer \e[A .. \e[D (ggf. bekannt als ^[[A .. ^[[D)
# Das Folgende ist ein Perl-idiomatischer (kurzer) Hack, um dies auf \e[A = 0 .. \e[D = 3 zu mappen und $d
# entsprechend zu aktualisieren. Ausserdem wird der Fall einer 180-Grad-Drehung hier abgefangen (letzte Bedingung)
$d = $k - 0x41 if (($k = ord(substr($k, 2, 1))) && (int(($k - 0x41) / 2) != int($d / 2)));
# Position aktualisieren. Die scheinbar komplexen Berechnungen sparen eine explizite Fallunterscheidung, welche
# deutlich laenger gewesen waere.
$p[int($d / 2)] -= (($d % 2) * 2 - 1) * (int($d / 2) * 2 - 1);
# Wenn Zielpunkt erreicht: Neuen Punkt erzeugen, Score erhoehen, Titelleiste neu schreiben
if ($f[$p[0]][$p[1]] == 42) {
pp();
$pt++;
mt();
};
# Wenn in eigene Schlage gefahren, Game Over
last if ($f[$p[0]][$p[1]] == 23);
# Position im Feld-Array als besetzt markieren (== 23)
$f[$p[0]][$p[1]] = 23;
habe heute meine Version nahe Fertigstellung gebracht, dennoch möchte ich eine kurze Vorstellung in Form von Screenshots und einer kleinen Beschreibung, danach die Changelog mit Tagesdetails was hinzugekommen ist und dann ein Link zum Repo posten.
Grundlegendes im Überblick:
Erstellt in C mit SDL2 und SDL2 TTF Font Library und Gimp.
Die Steuerung erfolgt mit WASD oder den Pfeiltasten.
Das Spielfeld beträgt etwas weniger als 640x480, bietet aber genug viele Spielfelder damit das Spiel nicht zu kurz wird.
Es müssen Äpfel gefressen werden um Punkte zu bekommen, bis zu 10 Gegenstände sind gleichzeitig auf dem Spielfeld möglich. Jeder Apfel bringt 2 Punkte plus Multiplikator mit der Länge der Schlange.
Wird eine Wand (noch schwarze Bildbereiche) berührt oder die Schlange trifft sich selbst ist das Spiel zu Ende.
Auch wird die Schlange wird bei jedem Bissen schneller, bis auf einen begrenzten Minimalwert. Eine Anzeige für Zeit, Punktzahl und aufgebaute Länge der Schlage ist auch mit enthalten.
Hier Screenshots der Snake-Variante - Version sollte allerdings korrekt (0.8a) sein, das Datum stimmt allerdings..
Was noch fehlt, einiges - so kann bis jetzt nicht resettet werden, das Spiel muß geschlossen und neu gestartet werden. Ist aber auf meiner To-Do Liste von Dingen die ich noch gerne implementieren will bevor der Contest zu Ende ist. Dann noch ein paar andere Dinge, aber ich will jetzt nicht zu viel versprechen. Auch sind die ganzen Kommentare noch in Englisch, das würde ich aber definitiv noch vor der finalen Einreichung um- bzw. mit einarbeiten.
Ich werde gern versuchen auch Binaries zusammen zu stellen, aber ich muss schauen in wie weit ich das hin bekomme wegen der Bibliotheken, für Windows könnte ich das noch hinbekommen, unter Linux bin ich mir allerdings sehr unsicher. Da kenne ich mich zu wenig aus.
** Edit:
Habe mich etwas schlauer gemacht wie man die Bibliotheken alle erhalten kann (Windows, Mac OS und Linux) - einige Links dazu mit Download Quellen aus der readme.md:
REQUIREMENTS
Snakebite alias snake is linked to SDL2 - which is required for compiling the c source.
I will try to get binaries for Linux and Windows ready of the app, so one only needs to download the DLL files/binaries.
Hier auch die Changelog an was ich wann gearbeitet habe (neueste Änderungen stehen oben):
[src=text]
28.09.2015
- Added option to reset the game by pressing "R" key
- Added option to pause the game by pressing "P" key
- Fixed an issue where the controls by using WASD where strangely mixed up
- Fixed code to use pointer versus regular structs where approperiate
this wasnt the case earlier, in example for the struct gameLogic "logic" var
- Added multiple snake support, now two snakes can be in the game
- Removed pit structure which was obsolete as the gameLogic structure could
hold all this data instead over fieldX count, fieldY count and field total
count
- Resolved an illegal memory write upon snake extension
- Moved snake extension into separate function
- Moved snake placement into separate function
- Corrected UI not to offset the game space in default window dimensions so much
- Changed UI to be little smaller
- Added enums for:
INITIAL_GAME_SPEED, GAME_SPEED_DECREASE, MINIMUM_GAME_SPEED
- Moved snakeFields into the snakeDef structure instead of logic
- Wrote resetGame function which resets logics and snakes, no freeing there
- Changed font holder to rw58 instead of rw64
- Moved hasNewDirection for head direction control into snakeDef structure,
so every snake knows if it has been moved in this frame
27.09.2015
- Updated snake gfx with field background image
- Minor code cleanups and improvements
- Tail no longer flips direction after snake ate
- Added logic struct with:
score, snakeFields, lastPowerUp, lastFood, itemCount,
itemFields, items, itemAge
- Splitted up enums to be more precies what each one holds, added items enum
- Added function getFieldIndex:
To retrive index of field by p-cords
- Added more comments in the code
- Added more checks for out of memory errors
- Added precised "ERROR: msg" display on errors
- Added function getAvailableRandomFieldIndex:
Which gets a random unused field index
- Added item spawing if item amount is below MAX_ITEMS
- Added first collectedable item (food) into gameplay
- Added SDL2 TTF font library for font display see readme.md for notes
- Added fonts/Raleway including license, see readme.md
- Added death display messages
- Added death by wall hit and snake self bite
26.09.2015
- Creating basic snake movement, now right way of doing it!
- Adding corner cases for middle snake parts
- Improving keyboard controls to not accept movement to opposite direction
to avoid tail biting
- Added corner processing - working
- Added snake extension by keypress for debugging
- Minor code cleanups and more commenting
25.09.2015
- Adding inital source code and gfx to project to repository
- Updating readme.md with requirements
- Changed texture loading to function handling
- Created images for snake parts, head and tails gfx; added textures for those
- Added pitMin, pitMax for x and y axis to define game area boundaries
- Adding more details to snake parts structure (isTail, orientation store)
- Added snake creation and stripped of unrequired details, added some others
- Started with snake render and beginning of movement (broken at present)
23.09.2015
- Initial code version 0.1
- Image creation and loading of field texture and display in rendering loop
- Main loop addition
- Window quit even handling
- Definition of snake, tail and pit and field structures
[/src]
Dort ist auch eine Readme.md die auf die Requirements eingeht, wie auch weitere Links mit Hilfen wie das Spiel kompiliert werden kann. Sourcen für die Grafiken sind auch enthalten wie auch der Font der zur Darstellung benötigt wird.
Ich melde mich hiermit offiziell vom Wettbewerb ab, da ich die Deadline zu 99,9999% reißen würde.
Zu Hause und auf der Arbeit ist grade einfach zu viel los.
Das ist schade... - ist doch noch so viel Zeit, noch gut 1 1/4 Monate bis zur "Abgabe". Also ich würde dir einfach ans Herz legen nicht gleich alles über Bord zu werfen - sondern einfach zu sehen wie es zeitlich und von der Motivation her passt. Kann ja schneller passieren als man denkt das man wieder Luft hat und wenn du mal nebenbei darüber nachdenkst kann man doch ein wenig daran werkeln.
Soll kein Vorwurf sein, aber nur der Wink das noch Zeit ist... - auch wenn es keine 3 Monate mehr sind.
wie werden da eigentlich die futter-felder generiert? sind immer 10 auf dem spielfeld und wenn eins gefressen wird, kommt ein neues hinzu? oder kommt nach einer bestimmten zeit (x frames) ein neues hinzu, egal ob eins gefressen wurde oder nicht, bis ein maximum erreicht wird? fängst du auch den fall ab, wenn das spielfeld "voll" ist, d.h. weniger als 10 felder frei sind und alles andere mit der schlange gefüllt ist? - in dem fall wären alle freien felder mit futter gefüllt und es könnte kein neues dazukommen.. was ist die "sieg"-bedingung? und wird es nicht zu einfach, wenn es mehr als ein futter-feld gibt?
Mit den X Frames hast du nicht unrecht, ich hab einen Counter laufen der runter zählt wann neues Futter plaziert werden darf. Am Anfang ist die Szene allerdings leer, das Futter/die Äpfel werden dann während des Ablaufs erzeugt, dabei erstelle ich eine Liste aus den frei verfügbaren Feldern auf denen kein Futter platziert und die Schlange nicht präsent ist und wähle dann per Zufall aus dieser Liste ein Feld aus und Plaziere dort.
Es können sich bis zu 10 Gegenstände gleichzeitig auf dem Spielfeld befinden, die Zahl ist allerdings variable einstellbar im Quelltext - enum logicData "MAX_ITEMS".
Allerdings habe ich noch nicht den Fall berücksichtigt wenn kein Feld mehr verfügbar ist, dann müsste das noch entsprechend abgefangen werden. Danke für den Hinweis
Ursprünglich war es auch geplant das Futter nach einer bestimmen Zeit wieder verschwinden kann, also mit begrenzter Lebensdauer auf einem Feld verfügbar ist. Natürlich deutlich länger als das platzieren dauert, aber das ist noch nicht implementiert - und ich bin gerade auch am überlegen ob man das überhaupt implementieren sollte...
Es ist schon etwas einfacher, da geb ich dir Recht, wenn das Futter, welches zum Beispiel in einer Ecke liegen kann, nicht geholt werden muß, weil man circa 9 andere Futterquellen verteilt über das Spielfeld erreichen könnte - aber man darf nicht vergessen, mit jedem Bissen wird die Schlage länger und schneller. Man kommt zwar so schnell zu Punkten - aber dadurch wird das Spiel auch insgesamt schneller und man kommt früher an den Punkt das die Schlange taktisch klug manövriert werden muss - da es auch relativ viele Spielfelder gibt, ist dies etwas erträglicher. Gleichzeitig wird dem Spieler aufs Auge gedrückt das Zeug "schnell" zu mampfen.
Wenn ich es mir aber so recht überlege, sollte das Futter sich nicht automatisch auflösen, dann wäre der Reiz etwas Futter an einer schwierigen Position zu ergattern nicht vorhanden.
Im weiteren hatte ich angedacht auch PowerUps drin zu haben, die der Schlange Superkräfte geben - zum Beispiel das man durch Wände "schreiten" kann für eine bestimmt Zeitdauer mit Countdownanzeige. Aber bisher gibt es nur Futter.
Aber irgendwas was die Mechaniken aushebelt oder das Spiel etwas aufmischt wäre irgendwie schon witzig.
wie wär's mit "theSplit"? - ein powerup, das die schlange in der mitte in 2 schlangen teilt, von denen man eine mit den pfeiltasten und die andere mit WASD steuert? sobald eine der schlangen kollidiert, verschwindet sie aus dem spiel, quasi wie multiball beim flipper.. man verliert dann quasi die hälfte seiner schlange, was das spiel verlängert, und zudem kann man mit der doppelten schlange doppelt so viele punkte sammeln, wenn man ninja-reflexe hat .. das powerup darf dann natürlich nur entsprechend selten auftauchen..
Ehehehe..... ich setzt es mal auf die "possible to-do" Liste für später - rein von der Technik her wäre es schon möglich mehrere Schlangen auf dem Spielfeld zu haben....
Soll das vor oder nach dem Multiplayer Modus (an einem Gerät) kommen?
Was mir so bisher in den Sinn kam: Durch Wände gehen können (quasi Links aus dem Spielfeld, auftauchen am recht Rand usw.) , über seinen Körper fliegen und sich selbst nicht beißen, ein Leben das nach 66 anderen Gegenständen kommt bei dem man drauf gehen kann aber die Punktzahl dann nicht resettet wird, "Mushroom Mode" (das ganze Spielfeld und die Schlange werden invertiert dargestellt), Time flies by Power Up - Futter und Gegenstände werden mit höherer Rate platziert....
Es fehlt dann noch eine Countdown Anzeige, aber im Grunde wäre das alles möglich
Sind nur ein paar Ideen, ist auch nicht so originell wie deine - aber das wäre schon witzig wenn man einen zweiten Kopf hinter sich her zieht und den abspalten kann wenn man will der dann die Hälfte der Gesamtlänge übernimmt.
Nur man sollte das platzieren mancher dieser Gegenstände so einstellen, das diese entweder erst später auftauchen - ab einer gewissen Länge der Schlange zum Beispiel. Da ist auch der Reiz größer sich etwas hoch zu spielen und es wird nicht gleich vorweg zu leicht.
Ach ja, was defintiv noch fehlt ist eine Pause Taste
Bis meine VB.NET Version fertig ist ... hier mal eine *sehr kreativ* gelöste Version von Mir aus dem Jahr 2003
Habe versucht das ganze so anzupassen das die Libs die es unter win7 und neuer nicht mehr gibt zu compilieren ist - aber irgendwie Stürzt meine Version von VB6 die ich noch habe trotzdem ab - daher kann ich gerade keine .exe bieten - Direkt starten funktioniert aber soweit ....
Aber ich bin gerade in meinem Linux Desktop und kann es daher nicht testen, leg ich mir für morgen auf die Agenda
Morgen im Laufe des Tages werde ich mich aber mal damit befassen
Was ich gerade so sehe beim Überfliegen des Quelltexts, du gibst zeitlichen Punktabzug bei dem der Spieler sogar verlieren kann wenn unter bestimmten Wert? Also das die Schlange quasi verhungert? Oder war sowas auch in der originalen Snake Version?
Beim verhungert kommt mir noch eine Idee für meine Variante...
Für dich bau ich ein Power up ein, eine Chilli. Und in einer Wirkungsdauer von X bekommt man für jede danach gefressen Apfel/Punkt 5 fach mehr Punkte für eine begrenzte Dauer und wächst nicht mal dabei