Snake tsssssssssss aidez moiiiiiiii

Signaler
Messages postés
368
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
27 janvier 2010
-
Messages postés
368
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
27 janvier 2010
-
Salut ,
Je suis en train de coder un snake et la je crois avoir bien compris le principe de l'algo mais niveau code
ça foire je sais pas pourquoi voila le principe de l'algo que je vais utiliser :
je vais faire un tableau qui contient les coordonnées X de tous les points du serpent et un autre pour les coordonnées Y en partant de la tete du serpent jusqu'a la queue.
pour ce qui est du mouvement on bouge seulement la tete( la premiere case des deux tableaux) puis il faut partir de la deuxieme case jusqu'a la derniere et lui attribuer la précedente (une boucle for suffit)
ca donne qqch comme ca:

int i;
for(i=1;i<TAILLE_SERPENT;i++)
{
tab_X[i]=tab_X[i-1];
tab_Y[i]=tab_Y[i-1];
}

voila donc mais niveau code j'ai essayé mais ça bug !

#include <stdio.h>
#include <econio.h>

void Affichage_Snake1();
void Affichage_Snake2();
void Affichage_Snake3();
void Affichage_Snake4();
void Avancer_Snake();

int Snake_X[80];
int Snake_Y[24];
int xs=23,ys=9;

void Affichage_Snake1() // Fonction qui va Afficher la tete du snake seulement
{
clrscr();
gotoxy(Snake_X[1],Snake_Y[1]);
printf("*");
}

void Affichage_Snake2() // Fonction qui va Afficher le reste du corp du snake !
{

gotoxy(Snake_X[2],Snake_Y[2]);
printf("#");

}

void Affichage_Snake3()
{
gotoxy(Snake_X[3],Snake_Y[3]);
printf("#");
}

void Affichage_Snake4()
{
gotoxy(Snake_X[4],Snake_Y[4]);
printf("#");
}

void Avancer_Snake() // Fonction qui va faire Avancer le Snake
{


switch(getch ())
{

case 'z':

Snake_X[1]=xs; // Le premier élément (la tete)
Snake_Y[1]=ys-1;
Affichage_Snake1();
ys=ys-1;

Snake_X[2]=Snake_X[1];//Le 2eme élément
Affichage_Snake2();

Snake_X[3]=Snake_X[2];//Le 3ème élément
Affichage_Snake3();

Snake_X[4]=Snake_X[3];//Le 4ème élément
Affichage_Snake4();
// Affichage2 Affichage3 Affichage4 seront traités grace à une boucle for !
// Ici c'est juste pour comprendre le principe ...
break;

}
}

int main()
{

do
{

Avancer_Snake();

}
while(getch()!='p');

}

//FIN

je vous rassure les fonctions affichage serpent 2 3 4 je les ferai a l'aide d'une boucle enfin ..là c'est juste pour comprendre qu'est ce qui foire ...??

Si quelqu'un pourrait m'aider ça serait cool :) ..
Merci
A voir également:

6 réponses

Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
Qu'est qui ne marche pas ??

(pourquoi tu est oblige d'appuyer deux fois sur une touche ... he oui tu fais deux 'getch', un dans le main, et autre dans 'Avancer_Snake' ? )

:-p :sleepy) :shy) :sleepy) :-p
Messages postés
368
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
27 janvier 2010
1
oui en effet pour ce qui concerne le fait que l'on est obligé de taper 2 fois mais ça c'est pas un problème c'est facile à arranger mon problème c'est que quand je compile le résultat n'est pas le résultat que j'avais souhaité parceque ça m'affiche 1 et etoile a la position 23 9 et un dieze a la position 23 1 !! alors que j'aurai espéré 4 etoiles l'une devant l'autre et que à mesure que l'on avance en haut ben ça fait l'effet d'un snake parceque je suis sur que mon algo est juste l'erreur se trouve dans le code ... compile et tu verras
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
je pense que c'est ta boucle for (aussi simple soit elle) qui merde.

for(i=1;i<TAILLE_SERPENT;i++)
{
tab_X[i]=tab_X[i-1];
tab_Y[i]=tab_Y[i-1];
}

Elle copie la valeur de tab_X[0] dans tab_X[1], la valeur de tab_X[1] dans tab_X[2] et ainsi de suite.

L'algo est bon, il faut decaler les coordonnées des points du corp du serpent d'un rang. Mais si tu pars de la tete.. ben elles auront toutes les meme coordonnées.
Si tu pars de la queue par contre, toutes les coordonnées seront bien décallées d'un rang...

for(i=TAILLE_SERPENT; i>1 ;i--)
{
tab_X[i]=tab_X[i-1];
tab_Y[i]=tab_Y[i-1];
}

dsl moi je peux pas compiler (g des probs avec gotoxy).
dis moi si ca marche.
Messages postés
91
Date d'inscription
lundi 19 mai 2003
Statut
Membre
Dernière intervention
31 août 2004

salut
d'abors je crois que tu devrais écouter aardman ;)
en fait il te dit que tas boucle n'est pas dans le bon sens regarde:

for(i=1;i<TAILLE_SERPENT;i++)
{
tab_X[i]=tab_X[i-1];
tab_Y[i]=tab_Y[i-1];
}
donc
tab_X[1]=tab_X[1-1]; // 1-1=0
donc tab_X[1]=tab_X[0] //ok!
tab_X[2]=tab_X[1]; //et la regarde tab_X[1]=tab_X[0] donc tab_X[2]=tab_X[0] et ainsi de suite!!

bon ben j'ai bcq détaillé et donc je pense que t'as compris(je me trompe pas, j'en étais sur j'explique trop bien lol)
et sinon au lieu de faire:
int i;
for(i=1;i<TAILLE_SERPENT;i++)
{
tab_X[i]=tab_X[i-1];
tab_Y[i]=tab_Y[i-1];
}
fait(le int i)

for(int i=1;i<TAILLE_SERPENT;i++){
tab_X[i]=tab_X[i-1];
tab_Y[i]=tab_Y[i-1];
}
non seulement c'est plus prope mais t'a variable(locale) disparait apres la boucle (normal t'en a plus besoin)
enfin chais pas peu etre que tu la fait expres(je dis ca comme ca)

et aussi si t'as besoin d'aide j'avais fait un serpent a une epoque sous le nom de myror(facile ya qu'1 source)

et aussi j'avais decouvert a cette epoque que sous DOS si tu t'approche trop des bord ca bug.

et aussi(mon jour de bonté aujourd'hui) j'ai vu que tu voulais savoir comment mettre une icone perso une api. je sais faire que sous window(directX ou pas) quand crée la classe de la fenetre tu met:
wndClass.hIcon = LoadIcon( hInst, MAKEINTRESOURCE(IDI_NOMICON) );

je te donne pour le curseur pareil au lieu de IDC_ARROW(classique) tu met MAKEINTRESOURCE(IDI_NOMCURSEUR).
wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
par contre il faut les crée dans les ressouces de VC++

bon ben j'espere que ca t'aidera( ben dis donc j'avais besoin de parler!) ca m'autra fait bien plasir entout cas
sita une question n'esite pas

A+;)
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
Tu pourrais me passer tout le code, car ce que j'ai, moi ca marche pas, mais c'est logique.
Ca afficher "*###"
C'est normal puisque l'on demande d'afficher
"Afficher_Snake1"
"Afficher_Snake2"
"Afficher_Snake3"
"Afficher_Snake4"

Donc moi je ne vois pas ou est le probleme !
(pourquoi le tableau des Y n'est pas initialiser ?)

:-p :sleepy) :shy) :sleepy) :-p
Messages postés
368
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
27 janvier 2010
1
hmmmm merci jedimaster et aardman et jdcjdc je crois que je vais pouvoir m'en sortir ...