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? P>
7 Réponses :
Voici quelques beaux points de départ pour vous ... depuis que je ne veux pas faire vos devoirs: p>
Code pseudo pour Snake Game Pour avoir une idée p>
Fil avec un exemple allemand ... peut-être que ce code vous aide p>
Si des erreurs se produisent pendant votre processus de programmation, n'hésitez pas à ouvrir une nouvelle question. P>
Je ne veux pas que quelqu'un fait mes devoirs .. Je veux juste des conseils sur le tableau ou la liaison ..
Une liste liée est meilleure. (Chaque nœud peut pointer sur le nœud précédent et suivant) Il est plus facile d'ajouter des nœuds à la fin d'une liste liée. p>
Si vous utilisez un tableau, vous devez soit redimensionnez-le, soit de l'initialiser à la longueur maximale possible du serpent pour commencer avec lequel peut être gaspillé à la mémoire. P>
Et comme il s'agit de devoirs, tout exercice utilisant des pointeurs serait très utile.
@skamradt vous suggère de demander cela comme une autre question. Vous ne spécifiez pas quelle langue. Je ne code pas normalement à Pascal (Delphi) mais je pense que Contrairement à C ++, il masque l'utilisation des pointeurs
@Andrew, vous pouvez toujours utiliser des pointeurs à Delphes. Ils ne sont pas cachés, tout simplement impliqués pour les cas de classe.
@skamradt - intéressant - a ajouté un lien vers un article qui peut aider. Delphi est plus polyvalent que j'ai réalisé (je code normalement en C # ou Java, C ++ devient une mémoire plus lointaine).
Pascal (et donc Delphi) a toujours soutenu des pointeurs. Je me souviens d'écrire des listes liées en 1984!
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;
Popping d'une file d'attente supprime l'élément tête i>, 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 code>.
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.
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;
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.
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 à. P>
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é. P>
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. P>
J'ai utilisé quelque chose de différent pour ma mise en œuvre de serpent. L'idée est que vous stockez p>
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. p>
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.
Vous pouvez utiliser un tampon circulaire . Elaborer: P>
Obtenez un tableau suffisamment gros pour maintenir le serpent maximum. Établissez deux pointeurs, un pour la tête, une pour la queue. p>
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. P>
J'aime toujours les questions sur les devoirs. Curieux de savoir quelle école et quelle classe. . ..