10
votes

Quelle structure de données dois-je utiliser pour un jeu de serpent?

J'ai des devoirs pour mon école et je dois faire un jeu de serpent, comme Nokia, à Delphi. Je me demande quelle solution est la meilleure. Je veux que mon serpent soit une classe et que le corps est une gamme de points (classe mère) ou une liste liée des points. Quel est le meilleur? Une matrice ou une liste liée?


1 commentaires

J'aime toujours les questions sur les devoirs. Curieux de savoir quelle école et quelle classe. . ..


7 Réponses :


2
votes

Voici quelques beaux points de départ pour vous ... depuis que je ne veux pas faire vos devoirs:

Code pseudo pour Snake Game Pour avoir une idée

Fil avec un exemple allemand ... peut-être que ce code vous aide

Si des erreurs se produisent pendant votre processus de programmation, n'hésitez pas à ouvrir une nouvelle question.


1 commentaires

Je ne veux pas que quelqu'un fait mes devoirs .. Je veux juste des conseils sur le tableau ou la liaison ..




2
votes

dans Delphi, j'utiliserais une tquelle, la sorcière est définie dans l'unité CONTNRS. Vous pouvez "pousser" votre nouvelle coordonnée (tête de serpent) et lorsque votre taille de serpent maximum est atteinte, vous devez simplement appeler "pop" pour libérer la queue de serpent.

  TSnakeBody = class(TObjectQueue)
  public
    property List;  //Expose the list
  end;


3 commentaires

Popping d'une file d'attente supprime l'élément tête , pas la queue. Et dans quelle version du jeu de serpent le serpent a-t-il une longueur maximale? C'est censé continuer à croître - c'est le défi du jeu. Si vous avez besoin d'obtenir au contenu intérieur d'une file d'attente, une file d'attente n'est pas la bonne structure de données. Utilisez une liste ordinaire à la place. En outre, je ne suis pas sûr que la syntaxe valide pour nouveau .


Une file d'attente est une structure de données de premier ou premier sorti (FIFO) contraste avec une pile qui est Dernière-Fist-Out (Life) que vous ajoutez à votre collection, car ROB indique de ne pas supprimer les articles.


Avec TQUEUE DE DELPHI (PAS UN TSTACK), POP Supprimer les premières données saisies. Donc, vous poussez la tête, vous allez la queue ... dans ma version de serpent, vous devez manger des trucs avec le serpent pour le faire grandir. Obtenir le contenu intérieur de la file d'attente est nécessaire pour dessiner le serpent.



0
votes

J'ai un très vieux programme de serpent turbopascal. Il utilise un tableau pour le corps.

procedure Slither;
var i : integer;
    npos,lpos : tPoint;
    hasEaten:boolean;
begin
  npos:=Snake.Head;
  lpos:=Snake.Tail;
  case Snake.dir of
    East  : inc(npos.x);
    West  : dec(npos.x);
    South : inc(npos.y);
    North : dec(npos.y);
  end;
  hasEaten:=(npos.x=fruit.x) and (npos.y=fruit.y);
  if hasEaten then 
    inc(Snake.BodyLength)
  else
    Snake.Tail:=Snake.Body[Snake.BodyLength];

  for i:=Snake.BodyLength downto 2 do
    Snake.Body[i]:=Snake.Body[i-1];
  Snake.Body[1]:=Snake.Head; 

  if not hasEaten then
    Snake.Head:=npos;

  writeP(idHead,Snake.Head);  
  writeP(idBody,Snake.Body[1]); 

  if not hasEaten then 
   begin
    writeP(idTail,Snake.Tail); 
    writeP(idResidual,lPos); 
   end;
  if hasEaten then 
    NewFruit;
end;


1 commentaires

Je suis assez certain que ce n'est pas Turbo Pascal. La longueur de la matrice de l'enregistrement est définie par un membre de l'enregistrement? Ce n'est pas permis. Les enregistrements ont des tailles fixées au moment de la compilation. Vous ne pouvez pas incrémenter le champ de la longueur de la corniche et avoir le tableau pour plus longtemps.



9
votes

Une solution simple consiste à créer un tableau [horizontal] [vertical] de type, de sorte qu'il y ait un élément pour chaque coordonnée à l'écran. Chaque type peut être une direction de serpent, une nourriture, un poison, un mur ou vide. Cela signifie que vous n'avez besoin que de vous souvenir de la tête et de la position de la queue du serpent et du nombre de nourriture et de poisons, et le tableau décrit la façon dont l'écran ressemble à.

Cela supprime les tracas de la manipulation des éléments du serpent et facilite la position de la nouvelle alimentation ou des nouveaux objets empoisonnés à l'écran, garantissant que vous ne le mettez pas dans un endroit déjà occupé.

Lorsque vous devez retirer l'élément de la queue du serpent, obtenez la direction de la queue à l'aide de la direction: = Array [TrayX, Taily]; puis définissez une matrice [TrayX, Taily]: = vide. Ensuite, Mettre à jour Tradex et Taily Selon la direction. C'est tout.


0 commentaires

3
votes

J'ai utilisé quelque chose de différent pour ma mise en œuvre de serpent. L'idée est que vous stockez

  1. L'emplacement de la tête du serpent
  2. la longueur du serpent
  3. la direction de la tête du serpent
  4. Un tableau d'objets "pli", où une courbure consiste en une direction (gauche ou droite) et un décalage (par exemple (gauche, 3) lorsqu'il y a une courbure gauche à la troisième position dans le serpent)

    Ceci est assez efficace, pas une solution stupide comme un tableau simple et peut facilement être utilisé pour dessiner des serpents «Finier», par exemple. avec des coins arrondis.


1 commentaires

Comment va une file d'attente? C'est clairement une structure de données, si vous souhaitez créer des coins arrondis, vous pouvez le faire dans votre rôle de rendu, la logique de jeu peut rester muette.



0
votes

Vous pouvez utiliser un tampon circulaire . Elaborer:

Obtenez un tableau suffisamment gros pour maintenir le serpent maximum. Établissez deux pointeurs, un pour la tête, une pour la queue.

Au début, la queue serait dans la cellule n ° 1, la tête dans la cellule n ° 3. Lorsque le serpent se déplace, déplacez le pointeur de tête vers la droite et écrivez la nouvelle coordonnée. Ensuite, s'il n'y a pas de nourriture mangée, déplacez le pointeur de la queue vers la droite aussi. Si l'un des pointeurs essaie d'aller au-delà de l'extrémité la plus à droite de la matrice, enveloppez-les au début.


0 commentaires