Wie löse ich das Problem beim ASCII Snake Clon(Prozendural)?

... komplette Frage anzeigen

2 Antworten

Oh je, ohne OOP, da weiß ich leider nicht ganz wie genau man vorgeht, gebe dir aber trotzdem eine Problemlösung die in OOP ganz sicher funktionieren würde. (Ich weiß garnicht was ohne OOP alles wegfällt :D)

aber mit einem Array kann man soweit ich weiss nur ein Wert mitgeben.

Also grundsätzlich würde ich dem Fall dir raten zwei Arrays anzulegen die beide jede Position der Schlange enthalten die gezeichnet werden müssen. So würde ich den letzten Eintrag immer für die Kopfposition verwenden. Wächst die Schlange dann, so fügt man ganz einfach die neue Position am Ende hinzu. Also einmal xPositionArray und einmal yPositionArray. Ich weiß nicht wie du es bisher gelöst hast, ich hätte aber dann noch eine Funktion geschrieben die nach diesen beiden Arrays die Schlange zeichnet. Also, ungefähr so (C# Syntax):


Am Anfang den Kopf zeichnen:

      Console.SetCursorPosition(xPositionArray[xPositionArray.length-1],yPositionArray[yPositionArray.length-1]);
      Console.Write('o');


Und den Rest dann mit einer Schleife. Beachte hierbei das ich i direkt auf 1 setze statt 0.

for(int i = 1; i < xPositionArray.length; i++){
      Console.SetCursorPosition(xPositionArray[i],yPositionArray[i]);
      Console.Write('x');
}

So, dass ganze in eine Methode packen und wir hätten das Zeichnen der Schlange fertig. Ich nenne Sie einfach mal DrawSnake().

Des weiteren weiss ich auch nicht, wie ich es hinbekommen soll, das die Segmente deren Positionen richtig ändern, also das Segment 2 auf die Position soll in der der Schlangenkopf war.

Hier würde ich eine Funktion schreiben die je nach Richtung die Position in beiden Arrays pushed(also hinzufügt). Die Richtung kannst du ja ganz einfach in einem String festhalten. Sagen wir also die Schlange bewegt sich nach "unten" so würde meine Funktion move() etwa so aussehen:

void move(direction)
    switch (direction){
       case "up":
              xPositionArray.add(xPositionArray[xPositionArray.length-1]);
              // Hier ziehen wir von der Kopfposition einen ab, da er sich ja nach oben bewegt
              yPositionArray.add(yPositionArray[yPositionArray.length-1]-1);

       break;
               // etc...
    }
}


Das wars auch schon soweit. Die Methoden würde ich dann ca so in einer endlosschleife einsetzen (Die hast du ja aber schon):

while(playerIsAlive){
    string direction = getDirection();
    move(direction);
    DrawPlayer();
}

PS: Bei meiner Endlosschleife beachte ich nicht das der Spieler sich auch bewegt wenn der Nutzer nichts drückt sondern bewege den Spieler erst wenn er sich tatsächlich drückt. Dies ist aber je nach Sprache und Zielumgebung anders zu vermeiden. Die Methoden bleiben jedoch gleich.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Lakritzstange
02.11.2016, 20:19

Also damit kann ich schonmal etwas anfangen, da ich auch schon mit einer OOP gearbeitet habe(Java), danke.

Trozdem wird es mir nicht so leicht fallen das mit der alten Sprache TP zu realisieren, weil ich erst vor kurzem angefangen habe es zu lernen :(

0

Hi, also meine Pascal Zeiten liegen weit zurück, aber ich arbeite jeden Tag mit Delphi.

Du kannst auch komplexe Typen mit einem Array verwalten. Hier mal ein Beispielprogramm:

program Arrays;

type
TPoint = record
X : Integer;
Y : Integer;
end;
var
i : Integer;
myPoint : TPoint;
snake : array[0..10] of TPoint;

begin
myPoint.X := 4;
myPoint.Y := 2;
snake[0].X := 3;
snake[0].Y := 2;
snake[1] := myPoint;
for i := 0 to 10
do writeLn(snake[i].X, '|', snake[i].Y);
end.

Zur Struktur: Ich will dir nicht den Spass verderben, den Weg selber zu gehen. Deshalb hier nur ein Denkanstoß:

Jedes Element deines Arrays speichert ein Glied der Schlange. Bei [0] ist der Kopf. Bewegt sich jetzt der Kopf auf eine neue Position erben alle Elemente die Position des Vorgängers und der Kopf bekommt die neue Position.

ich hoffe das hilft.
Viel Erfolg!

gruss, dj

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?