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 -
[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
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
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
A voir également:
- Snake / Ncurses
- Jeux google caché snake - Guide
- Snake Eye Vision - Télécharger - Sciences & Techniques
- Comment installer ncurses-devel in ubuntu 9.4 ✓ - Forum Ubuntu
- Comment jouer a snake sur la calculatrice casio fx-92 - Forum calculatrices
5 réponses
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.)
Bonjour,
J'ai pas vraiment compris ce qui te pose problème ?
Est-ce le refresh() qui ne te plait pas ? Pourquoi ?
J'ai pas vraiment compris ce qui te pose problème ?
Est-ce le refresh() qui ne te plait pas ? Pourquoi ?
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).
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).
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)
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)
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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).
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).
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
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
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 ?
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 ?