Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "serpent.hpp"
#include "coordonnees.hpp"
#include <stdexcept>
#include <cassert>
#include <ncurses.h>
Serpent::Serpent(short int ligne, short int colonne) {
direction = HAUT ;
m_etat = GRANDISSANT ;
m_jauge = 5 ;
m_segments.ajouter_en_queue(encode(ligne, colonne)) ;
}
void Serpent::avancer(const Niveau& niveau) {
/* position de la tete */
int tl = ligne(m_segments.queue()->valeur) ;
int tc = colonne(m_segments.queue()->valeur) ;
/* deplacement de la tete dans la bonne direction */
switch(direction) {
case GAUCHE :
--tc ;
break ;
case HAUT :
--tl ;
break ;
case DROITE :
++tc ;
break ;
case BAS :
++tl ;
break ;
default :
assert(0 && "direction inconnue") ;
break ;
}
/* suppression de la queue si stable */
if(m_etat == STABLE) {
m_segments.supprimer_en_tete() ;
} else {
--m_jauge ;
if(m_jauge == 0) {
m_etat = STABLE ;
}
}
/* test de collision */
int tete = encode(tl, tc) ;
if(m_segments.recherche(tete)) {
throw(std::runtime_error("collision")) ;
}
if(niveau.murs.recherche(tete)) {
throw(std::runtime_error("collision")) ;
}
/* ajout de la tete deplacee */
m_segments.ajouter_en_queue(tete) ;
}
void Serpent::dessiner() {
/* couleur bleue */
init_pair(1, COLOR_BLUE, COLOR_BLUE) ;
attron(COLOR_PAIR(1)) ;
/* itération sur les segments */
Cellule* segment = m_segments.tete() ;
while(segment) {
short int sl = ligne(segment->valeur) ;
short int sc = colonne(segment->valeur) ;
mvaddch(sl, 2*sc, ' ') ;
mvaddch(sl, 2*sc + 1, ' ') ;
segment = segment->suivante ;
}
/* couleur normale */
attroff(COLOR_PAIR(1)) ;
}
void Serpent::rafraichir() {
/* couleur bleue */
init_pair(1, COLOR_BLUE, COLOR_BLUE) ;
attron(COLOR_PAIR(1)) ;
/* dessin de la tete */
short int tl = ligne(m_segments.queue()->valeur) ;
short int tc = colonne(m_segments.queue()->valeur) ;
mvaddch(tl, 2*tc, ' ') ;
mvaddch(tl, 2*tc + 1, ' ') ;
/* couleur normale */
attroff(COLOR_PAIR(1)) ;
if(m_etat == STABLE) {
/* effacement de la queue */
short int ql = ligne(m_segments.tete()->valeur) ;
short int qc = colonne(m_segments.tete()->valeur) ;
mvaddch(ql, 2*qc, ' ') ;
mvaddch(ql, 2*qc + 1, ' ') ;
}
}