//variables :
// coordonnées des carrés :
int x=170; // abscisse du carré 1
int y=170; // ordonnée du carré 1
int h=150; // abscisse du carré 2
int v=170; // ordonnée du carré 2
int h2=130; // abscisse du carré 3
int v2=170; // ordonnée du carré 3
// nombres aléatoires pour les coordonnées de la pomme :
int aleatoireX = (20* int ( random (0,14)))+40 ; //le nombre aleatoire est multiplié par 20 et on y ajoute 40 pour qu'il soit entre 40 et 320 pour l'abscisse
int aleatoireY = (20* int ( random (0,14)))+40 ; //le nombre aleatoire est multiplié par 20 et on y ajoute 40 pour qu'il soit entre 40 et 320 pour l'ordonnée
// bouléens pour le mouvement des carrés :
boolean a = false;
boolean b = false; // on définit 4 bouléens comme faux au départ, ils serviront plus bas dans le programme
boolean c = false; // afin de distinguer les 4 directions possibles de mouvement du carré
boolean d = false;
boolean e = false; // on définit un 5e bouléen comme faux au départ, il servira pour la reinitialisation du jeu
void setup()
{
size(720,360); // taille de la fenetre
frameRate(30); // frameRate() fixe la fréquence des appels à draw() par seconde (par défaut 30).
}
void keyPressed()
{
// mouvement unique des carrés , une seule direction à la fois :
if (keyCode == UP) { a = true; b=false;c=false;d=false;} // si on appuie sur la fleche HAUT, le carré se déplace uniquement vers le haut
if (keyCode == DOWN) { b = true; a=false;c=false;d=false;} // si on appuie sur la fleche BAS, le carré se déplace uniquement vers le bas
if (keyCode == LEFT) { c = true; a=false;b=false;d=false;} // si on appuie sur la fleche GAUCHE, le carré se déplace uniquement vers la gauche
if (keyCode == RIGHT) { d = true; a=false;b=false;c=false;} // si on appuie sur la fleche DROITE, le carré se déplace uniquement vers la droite
// si on appuie sur SHIFT,les carrés reviennent à leurs positions de départ sans mouvements => reinitialisation du jeu,sinon,le jeu continue:
if (keyCode == SHIFT ) { e = true ;} else { if (keyCode==UP||keyCode ==DOWN||keyCode == LEFT||keyCode == RIGHT){e= false; }}
}
void draw (){
// grille :
int ligneY=20; // definit l'ordonnée des lignes
int ligneX=20; // definit l'abscisse des lignes
// couleurs du fond :
background(100,100,100); // le fond est en gris foncé
fill(150); // la couleur est gris clair
rect(10,10,340,340); // le contour est en gris clair
fill(100,100,100); // la couleur est en gris foncé
rect(30,30,300,300); // la grille est en gris foncé
// texte pour le jeu :
PFont mapolice2; // créé une police de texte nommée mapolice2
mapolice2 = loadFont("EurostileBold-48.vlw"); // charge la police "EurostileBold-48" sur processing
textFont(mapolice2,30); // le texte est en taille 30
fill(0,200,0); // la couleur est rouge
text("SNAKE",450,35); // affiche snake pour x=420 et y=35
textFont(mapolice2,15); // le texte est en taille 15
fill(200,200,0); // la couleur est jaune
text(" Appuyez sur ' UP ' pour se déplacer vers le haut ",360,75); // affiche le texte aux coordonnées données
text(" Appuyez sur ' DOWN ' pour se déplacer vers le bas ",360,105); // affiche le texte aux coordonnées données
text(" Appuyez sur ' RIGHT ' pour se déplacer vers la droite ",360,135); // affiche le texte aux coordonnées données
text(" Appuyez sur ' LEFT ' pour se déplacer vers la gauche ",360,165); // affiche le texte aux coordonnées données
text(" Appuyez sur ' SHIFT ' pour réinitialiser le jeu ",360,265); // affiche le texte aux coordonnées données
text(" Appuyez sur ' echap ' pour quitter le jeu ",360,295); // affiche le texte aux coordonnées données
// quadrillage :
//lignes horizontales:
for(int i=0;i<=15;i=i+1){
line(30,i*ligneY+30,330,i*ligneY+30); }
//lignes verticales :
for(int i=0;i<=15;i=i+1){
line(i*ligneX+30,30,i*ligneX+30,330); }
// appel des methodes liées a la classe pomme :
apple.display(); // appelle la methode test apple
apple.testCollision(); // appelle la methode test collision
// la chaine de carrés :
fill(0,200,0); //remplit le carré 1 de couleur vert
rect(x,y,20,20); //affiche le carré 1
fill(0,100,0); //remplit le carré 2 de couleur vert
rect(h,v,20,20); //affiche le carré 2
fill(0,50,0); //remplit le carré 3 de couleur vert
rect(h2,v2,20,20); //affiche le carré 3
if( x<30 || x>310 || y<30 || y>310 ) { // Si le carré principal sort de la grille de jeu :
PFont mapolice1; // créé une police de texte nommée mapolice1
mapolice1 = loadFont("EurostileBold-48.vlw"); // charge la police "EurostileBold-48" sur processing
textFont(mapolice1,75); // définit la police et la taille du texte
fill(100,100,100); // la couleur est gris clair
rect(30,30,300,300); // la grille est en gris clair
fill(200,0,0); // le texte est en rouge
text("PERDU",65,180); //affiche "PERDU" si le carré sort du cadre
fill(0);
textFont(mapolice1,15); // définit la police et la taille du texte
text(" Appuyez sur ' SHIFT ' pour réessayer ",60,265); // effiche le texte dans la fenetre
// le mouvement des carrés grace aux fleches directionnelles n'est plus possible :
a = false;
b = false;
c = false;
d = false;
// la chaine de carrés tourne autour de la grille :
if (frameCount % 5 == 0) {
if(x>=330 ) { v2=v; v=y; y=y-20; h2=h; h=x; }
if(x<=10 ) { v2=v; v=y; y=y+20; h2=h; h=x; }
if(y<=10 ) { h2=h; h=x; x=x-20; v2=v; v=y; }
if(y>=330 ) { h2=h; h=x; x=x+20; v2=v; v=y; }
}
}
if (frameCount % 10 == 0) { /* la variable frameCount permet de connaître le nombre de fois où draw()
a été appelé depuis le lancement du programme. L'opérateur modulo '' % '' permet de compter
sans jamais dépasser un certain nombre. Cette méthode permet d' effectuer une action en fonction du temps, ici, on définit les mouvements du carré en fonction du temps pour que celui-ci se deplace de une case dans la direction donnée à une vitesse acceptable */
if (a == true){ v2=v; v=y; y=y-20; h2=h; h=x; } else {y=y;v=v;v2=v2;} // le carre se deplace automatiquement dans la direction donnée : haut
if (b == true){ v2=v; v=y; y=y+20; h2=h; h=x; } else {y=y;v=v;v2=v2;} // le carre se deplace automatiquement dans la direction donnée : bas
if (c == true){ h2=h; h=x; x=x-20; v2=v; v=y; } else {x=x;h=h;h2=h2;} // le carre se deplace automatiquement dans la direction donnée : gauche
if (d == true){ h2=h; h=x; x=x+20; v2=v; v=y; } else {x=x;h=h;h2=h2;} // le carre se deplace automatiquement dans la direction donnée : droite
// si le jeu est rénitialisé :
if (e == true){
x = 170; y = 170; // le carré 1 revient à sa position initiale
h = 150; v = 170; // le carré 2 revient à sa position initiale
h2= 130; v2= 170; // le carré 3 revient à sa position initiale
// les carrés sont immobiles :
a = false;
b = false;
c = false;
d = false;
}
}
}
//new tab ( nouvel onglet)
// classe de la pomme :
pomme apple = new pomme(100, 100, color(200,0,0));
class pomme { //
float A; // définit les variables de départ de l'objet "pomme"
float B; //
color couleur; //
pomme (float nouvA, float nouvB, color nouvCouleur) { //
B = aleatoireY; // définit les nouvelles variables de l'objet "pomme"
A = aleatoireX; //
couleur = nouvCouleur; //
}
void display() {
fill(200,0,0); // remplit le cercle de couleur rouge
ellipse(A,B, 10, 10); // trace une ellipse de 11 sur 10, à des coordonnées aléatoires
}
void testCollision() {
// interaction entre le serpent et la pomme :
if ( A == x || B == y ){ background(0); }
}
}
Grace au programme actuel ci dessus, nous commencons avec un serpent constitué de 3 carrés, au centre de la fenetre que nous pouvons bouger dans 4 directions, mais sur la grille, comme présenté ci dessous :
Et si le carré sort de la grille, nous perdons et le serpent fait alors le tour de la grille de jeu :



Mais, il nous est maintenant possible de réinitialiser le jeu, en fin ou en cours de partie, mais seuls les carrés sont remis à zero pour le moment, la pomme ne l'est pas encore :
