Frage von DimiTopalidis, 86

Hilfe an die Informatiker muss snake ohne Jpanel nur mit den einfachen Grundlagen java auf Netbeans Programmieren kann mir da jemand helfen?

was ich bis jetzt benutzt habe: primitive DAatentypen, if -Schleife, while-Schleife, switch/ case, break continue, return,for-schleife, foreach, do/while, arrays, string-arrays, wachsende-arrays, mehrdimensionalle-arrays, LinkedList, Scanner, Random, Hashmap, enumarations, Klassen/Objekte, uml, array.lenght, cast ,

Antwort
von annonymus702, 50

Dafür brauchst du nicht einmal Arrays. Mache 2 for Schleifen für x/y und deklariere Zahlen 0 ist ein leeres Feld 1 die Schlange mit +/- kannst du die Positionen wechseln mit dem Java.util.scanner mit einem case feld kannst 1 und 0 unterscheiden.

Kommentar von annonymus702 ,

mit printf kannst du dann das spielfeld anzeigen lassen. in den for schleifen muss dann print f stehen.

Kommentar von DimiTopalidis ,

und wie genau mach ich das?

Kommentar von DimiTopalidis ,

danke :) muss ich da die Größe des Feldes nicht bestimmen?

Kommentar von annonymus702 ,

doch das kannst du in dem index der for schleife deklarieren i hat dann die größe also wenn i größer als 10 ist ist das feld automatisch zuende.PS:Bin kein informatiker...

Expertenantwort
von KnusperPudding, Community-Experte für Java, 16

Wenn man von einem Consolen-Basiertem Spiel ausgeht und deinem "Vorwissen" und dem was du hierbei eventuell lernen sollst, habe ich dann schon eine grobe Idee was von dir erwartet wird.

Als erstes benötigst du die entsprechenden Klassen:

enum SpielbrettZelle{}

class Spielbrett{}

class Koordinate{}

class Schlange{}

class Spiel{}

Anschließend formulierst du die Klassen aus. Mit Attributen und Methoden die notwendig sind.

Bei der SpielbrettZelle würde ich ein Enum verwenden. Das ist leserlicher und völlig ausreichend um den Zustand einer Zelle zu beschreiben.

Entsprechend kann eine Spielbrett-Zelle folgende Zustände haben:

    LeerSchlangeEssenWand

Entsprechend sieht dein Spielbrett so aus, dass du hier eine 2D-Array haben wirst, welche aus Spielbrett-Zellen besteht:

SpielbrettZellen[][] brettZellen;

Um die Größe dynamisch zu halten, könntest du im Konstruktor die Größen der Array mit übergeben.

Hier wäre eine Methode ratsam um das Spielbrett zu initialisieren sowie eine Methode um das Essen per Zufall zu platzieren. Sowie eine Methode: "ZeichneSpielbrett()"

Die Klasse Koordinate hat z.B. die Eigenschaften: 

int positionX;
int positionY;

Die Klasse Schlange wiederum hat dann Attribute:

Koordinate kopfPosition;
Koordinate[] hinterteile;

Spielbrett spielbrett;

entsprechend benötigt dann die Schlange entsprechende Methoden:

Einen Konstruktor dem man die Koordinate der Kopfposition, sowie das Spielbrett mitteilen kann.Eine Methode "

bewegen

" die eine Richtung entgegen nimmt. Zudem sollte die Methode die Positionen der Schlange (Kopf und Hinterteile) aktualisieren und zugleich das spielbrett aktualisieren.etc.

In der Klasse Spiel wiederum könntest du den Benutzer die Größe des Spielbrettes angeben lassen durch 2 Scanner-Eingaben.

Des weiteren Benötigst du dann die Methode: Spielstart().

Hier Erstellst du dann eine neue Instanz des Spielbrettes. Welches dann auch die erste Zufallsposition des Essens platziert. 

Anschließend erstellst du nun eine Instanz der Schlange, der du die Zufalls-Start-Position sowie das Spielbrett mitgibst.

An dieser Stelle wäre das Spiel bereits Spielbar.

Woran sich die anderen Antwortgeber jedoch noch aufgehalten haben, ist die "Eigenart" von Snake, bei der sich die Schlange eben "von allein" in eine Richtung bewegt. Aber auch dafür gibt es Abhilfe.

Wichtig wäre es erstmal für dich und deinem aktuellen Wissensstand: Mach das erstmal so, dass sich die Schlange nur auf Tastatur-Eingaben hin bewegt. Und um es noch einfacher zu machen, da Konsolenanwendung: Vielleicht auch eine Richtungssteuerung via: WASD (und Enter um den Befehl entgegen zu nehmen).

Hier erst weiter lesen, wenn alles bisher passt, sonst komm nur Verwirrung auf.

Für später und der "Premium-Lösung" wenn sich die Schlange automatisch bewegen soll:

Benötigt deine Klasse: Spiel zwei (weitere) Variablen: richtung und benutzerEingabe. wobei die benutzereingabe leer initialisiert und die richtung mit einer vorbestimmten Richtung vorbelegt ist. z.B. d für Rechts.

In deiner Methode start könntest du nun einen neuen Thread starten. Dieser Thread besitzt anschließend eine Schleife, die so lange läuft, bis das spiel vorbei ist. Innerhalb dieser Schleife prüfst du die Variable: "Benutzereingabe": Ist die Variable leer, so wird die "bewegen" Methode der Schlange mit d für rechts ausgeführt. 

Ist die Variable nicht leer: so wird die Variable: Richtung mit der benutzereingabe überschrieben und die benutzereingabe wieder auf leer gesetzt und die Methode "bewegen" der Schlange aufgerufen.

Nach dem Starten des Threads kann im Nachgang via Scanner Eingabe die Variable  "Benutzereingabe" gesetzt werden, z.b. so:

while ((input = new Scanner(System.in).next()) != null&& !this.spielEnde()) {
benutzerEingabe = input;
}
Kommentar von DimiTopalidis ,

Danke für diese ausführliche Antwort hat mir sehr geholfen. Weisst du allerdings noch wie ich das Fenster (Konsole) ohne jpanel und jframe erstellen kann?

Kommentar von KnusperPudding ,

Schrieb ich als Kommentar in der anderen Frage.

Erstelle dir eine Methode: printSpielbrett();

innerhalb dieser Methode durchläufst du die 2D Array und fügst ein Zeichen Pro Zelle an. (Via System.out.print())

z.B.:

Blank für leer-räume, H für die Wand, O für das Essen X für die Schlange.

Antwort
von Gastnr007, 47

Was genau brauchst du denn da für Hilfe? Java an sich ist keine Sprache, aus der du einfach ins Binäre kommst (z.B. Kommunikation über serielle Schnittstellen ist ohne erweiternde dlls (oder Ähnliches) unmöglich). Du könntest den Spielplan in der Konsole allerdings als Text ausgeben. Ein/Zwei Spielplanupdate(s) / Sekunde sollten da ganz passend sein

Kommentar von DimiTopalidis ,

ich weiss nicht wie ich da richtig vorgehen soll. Könntest du mir bei der Codierung helfen?

Kommentar von Gastnr007 ,

na das Problem liegt dann aber an Snake und nicht an dem JPanel. Bei dem JPanelproblem kann/möchte ich dir helfen, bei Snake sicher nicht.

Jedenfalls musst du doch nur die Map sekündlich (Thread.sleep(1000) in deiner while(true)-Schleife) ausgeben. Jedes Element der einzelnen Reihen, gegebenenfalls Wände aneinandergereiht und nach jeder Reihe einmal ein Zeilenumbruch ("\n")

Kommentar von DimiTopalidis ,

hmm okey ich darf hier kein Jpanel benutzen alles was ich oben aufgelistet hab ist erlaubt

Kommentar von Gastnr007 ,

ja System.out.print() und .println() gehören da rein, also machs einfach so, wie ich es gesagt habe :)

Kommentar von DimiTopalidis ,

okey danke war schon mal hilfreich. Mehr kannst du mir nicht helfen oder?

Kommentar von Gastnr007 ,

naja das ist ja schon so gut wie der ganze JPanelersatz. Du sollst ja die Snakeengine selber schreiben :)

Kommentar von DimiTopalidis ,

Das Problem ist ich bin noch ein Anfänger was das Programmieren angeht. Wir hatte nur ein paar Grundlagen in Java wie die oben aufgelistet siehst. Ich weiss auch gar nicht wie ich da richtig vorgehen soll, weil die meisten Codes, die im Internet steht sind mir fremd und weiss nicht was ich damit anfangen soll. Wäre nett wenn du mir damit helfen könntest/würdest

Danke im Voraus

Mfg Dimi 

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten