Snake / Ncurses

Résolu
Maitre2B Messages postés 341 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

Je suis étudiant en informatique, et j'aimerais approfondir mes connaissances autour de ce projet qu'est le "Snake".
Pas besoin de vous expliquez les règles je suppose, ce jeu est monstrueusement connu (surement grâce à Nokia).

C'est un jeu relativement simple a faire mais je ne savais pas comment faire pour pouvoir utiliser les flèches directionnelles (arrow keys) pour déplacer mon serpent dans la carte.

J'ai donc décidé d'utiliser le ncurses.

J'ai donc dans ma fonction main() ces fonctions pour initialiser le ncurses

#include <ncurses.h>
#include <ctype.h>

int       main()
{
  initscr();    
  raw();    
  keypad(stdscr, TRUE);  
  noecho();
  cbreak(300);
}


ect ect...

Je possède des fonctions pour allouer la mémoire nécessaire pour la map où se déplace le serpent, tout fonctionnent "parfaitement" sauf à partir du moment où intervient le ncurses:

Dans le cas où je veux que mon serpent (o) aille à droite, voilà ce qu'il s'affiche sur mon écran:
_____________
|........................|
|........................|
|....................o..|
|........................|
|____________|

_____________
|........................|
|........................|
|.....................o.|
|........................|
|____________|

_____________
|........................|
|........................|
|......................o|
|........................|
|____________|

alors que j'aimerais qu'il n'y ait qu'une seule fenêtre comme ceci avec le déplacement:

_____________
|........................|
|........................|
|.............o>o>o|
|........................|
|____________|

Sans le ncurses, (et donc sans les flèches directionnelles), j'utilisais la fonction unix "system(clear);" ce qui permet d'avoir l'illusion qu'il n'y a qu'une seule fenêtre se rafraichissant alors qu'il y en a en fait des tas qui sont juste supprimées puis repmplacées.

(Je remercie ceux qui ont lu jusque là car je sais que ce n'est pas du tout évident <3 )

J'ai donc besoin de vous pour m'aider au niveau de cette fonction avec le ncurses:

void cycle()
{
while (42) // à modifier, ne vous inquiétez pas ^^
{
moves(); //modifie les coordonnées du serpent
diisplay(); //affiche le serpent sur les nouvelles coordonnées avec la map
refresh(); //fonction ncurses pour rafraichir la page
}
}

Je sais que pour vous, c'est absolument incompréhensible, mais je vous assure que je fais ce que je peux pour que vous compreniez le problème :s

5 réponses

Maitre2B Messages postés 341 Date d'inscription   Statut Membre Dernière intervention   33
 
Ajout d'un détail important: la boucle ne semble s'effectuer que 3 fois puisque la map est affichée seulement 3 fois (comme s'il s'arrêtait lorsque la map devait s'afficher plus bas que mon écran, je suis incompréhensible.)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

J'ai pas vraiment compris ce qui te pose problème ?
Est-ce le refresh() qui ne te plait pas ? Pourquoi ?
0
Maitre2B Messages postés 341 Date d'inscription   Statut Membre Dernière intervention   33
 
Bonsoir, merci pour m'avoir répondu si rapidement.
Le fonction refresh() ne semble absolument rien faire, c'est bien là le problème . :/
Et encore plus problématique, alors que je suis dans une boucle infinie, l'affichage de la map ne se fait que 3 fois (je crois que ça a à voir avec le ncurse par rapport à la taille de ma fenêtre).
0
Maitre2B Messages postés 341 Date d'inscription   Statut Membre Dernière intervention   33
 
J'ai trouvé cette vidéo : https://www.youtube.com/watch?v=dxpv3vgmtZU
C'est exactement ce que je veux faire, sauf que dans mon cas, la fenêtre ne se rafraîchie pas comme lui, j'ai donc plusieurs map à la suite (3 puis ça s'arrête)
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut Maitre2B,

Avec ncurses, tu ne vas pas redessiner l'intégralité de la fenêtre, mais juste les caractères que tu veux changer.

En utilisant move(y, x); tu pourras déplacer ton curseur et avec addch(ch); afficher un caractère à l'endroit souhaité (qui peut être un espace pour effacer quelque chose, ou un 'o' pour dessiner quelque chose).

https://invisible-island.net/ncurses/man/ncurses.3x.html
https://invisible-island.net/ncurses/man/curs_move.3x.html
https://invisible-island.net/ncurses/man/curs_addch.3x.html


Dal
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Maitre2B Messages postés 341 Date d'inscription   Statut Membre Dernière intervention   33
 
Merci Dal pour votre réponse.
Dans mon cas, le fonction move(); me semble inutile, je vais donc regarder du côté de addch();

Merci pour votre aide, je reviendrai vers vous en cas de pépin (bientôt).
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Dans mon cas, le fonction move(); me semble inutile

Ce que tu dis n'a pas de sens. Sans une fonction de positionnement du curseur d'écriture, tu ne peux pas contrôler à quelle position de l'écran tu écris.

N'utiliser que addch(); revient à écrire sur la fenêtre des caractères les uns à la suite des autres et aller à la ligne en fin de ligne. Tu n'as pas besoin de ncurses pour cela.


Dal
0
Maitre2B Messages postés 341 Date d'inscription   Statut Membre Dernière intervention   33
 
Ah d'accord, j'avais mal compris
Il faut donc quelque chose de ce genre

int main
{
init_position(); // initailise la position du serpent (au milieu par ex)
display_map(); // affiche le contour de la map
...while (42)
...{
.....move_snake(); // modifie les coordonnées de base (décrémente les abscisses si la touche "gauche" est appuyée par exemple)
.....move(abs, ord); // en utilisant les nouvelles coordonnées, place le curseur au bon endroit
.....addch("o"); // affiche à l'endroit du coeur (abs, ord) un "o" si le serpent est représenté avec des "o"
.....refresh();
...}
}

Ai-je bien compris la logique ou suis-je encore totalement à l'ouest ?
0
Maitre2B Messages postés 341 Date d'inscription   Statut Membre Dernière intervention   33
 
Je confirme, c'est la bonne logique.
Le problème pour faire déplacer le serpent est résolu ! (Même si j'en ai un tas de nouveaux ^^)

MERCI DAl !
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
oui, mais c'est move(y, x); dans le repère géré par ncurses (ligne y et colonne x).

Bon courage pour la suite :-)


Dal
0