A la ferme du code heureux, des codes, des programmes, broutent en champ libre.
Un serpent et une pomme

Your browser does not support the canvas tag.



Le classique jeu Snake en Processing.js par Guillaume Stagnaro.
Utilisez les flèches du clavier pour diriger le serpent.



ArrayList snake;      // l'ArrayList qui va contenir les elements du serpent
int snakeTaille = 5; // la taille initial du serpent

int positionX = 0; // position sur l'axe des X de la tete du serpent
int positionY = 0; // et sur l'axe des Y
int direction = 0; // la direction initial

Point pomme; // la position de la pomme

int colonnes = 78; // la taille de la grille notre jeu en lignes et colonnes
int lignes = 24;
int pas = 10; // le pas de la grille du jeu

int tempo = 250; // la tempo du déplacement du serpent
long dernierPas = 0;

int score = 0; // le score

boolean commencer = false;

// la direction est codée par un nombre qui représente le Nord, Sud, Est ou Ouest
// 0 = N
// 3 = O + 1 = E
// 2 = S

void setup() {

size(780, 240); // la taille du sketch est celle de la grille * le pas de la grille
textAlign(CENTER);
noStroke();

// à sa naissance le serpent est placé au centre de la grille du jeu
positionX = colonnes/2;
positionY = lignes/2;

snake = new ArrayList(); // on initialise l'ArrayList du serpent
snake.add(new Point(positionX, positionY)); // on y ajoute le premier element

// la pomme est créée à une position aléatoire
pomme = new Point((int)random(colonnes), (int)random(lignes));

dernierPas = millis();
}

void draw() {
background(211);

if (commencer==false) {
fill(127);
text("Cliquez pour commencer.\nUtilisez les flèches du clavier pour diriger le serpent.", width/2, height/2);
return;
}

if (millis()>dernierPas+tempo) { // si 'tempo' milliscondes se sont écoulées on bouge le serpent

// on determine la position de la tête en fonction de la direction
if (direction == 0) positionY -= 1; // nord
if (direction == 1) positionX += 1; // est
if (direction == 2) positionY += 1; // sud
if (direction == 3) positionX -= 1; // ouest

// si le serpent sort du cadre on perd.
if ((positionX<0)||(positionX>=colonnes)||(positionY<0)||(positionY>=lignes)) {
snake.clear(); // on vide l'ArrayList du serpent
positionX = colonnes/2; // et on repositionne la tête du serpent au centre
positionY = lignes/2;
snakeTaille = 5; // on remet le serpent a sa taille initiale
tempo = 250; // on remet le tempo a 250
}

// si le serpent se mord la queue on perd aussi
for (int i = snake.size()-1; i >= 0; i--) {
Point snakeElement = (Point) snake.get(i);
if (snakeElement.touche(positionX, positionY)) { // la tête est-elle sur le même point qu'un des elements du serpent ?
snake.clear(); // on vide le arrayList du serpent
positionX = colonnes/2; // on repositionne le serpent au centre
positionY = lignes/2;
snakeTaille = 5; // on remet le serpent a sa taille initiale
tempo = 250; // on remet le tempo a 250
break; // on peu sortir prématurement de la boucle 'for'
}
}
// si le tête touche la pomme on gagne un point, une taille et on acélère
if (pomme.touche(positionX, positionY)) {
score ++; // un point de plus
snakeTaille ++; // une taille en plus
tempo -=1; // on accelere la cadence
// et on replace la pomme quelque part dans le jeu
pomme.x = (int) random(colonnes);
pomme.y = (int) random(lignes);
}

// on ajoute la tete à la l'ArrayList du serpent
Point tete = new Point(positionX, positionY);
snake.add(tete);
// on contraint la taille du serpent à 'snakeTaille' elements
if (snake.size()>snakeTaille) snake.remove(0);

dernierPas = millis();
}

fill(127);
text(score, width/2, height-10);

//on dessine chaque elements du serpent
for (int i = snake.size()-1; i >= 0; i--) {
Point point = (Point) snake.get(i);
ellipse(point.x*pas + pas/2, point.y*pas + pas/2, pas, pas);
}

// et on dessine la pomme en rouge
fill(255, 0, 0);
ellipse(pomme.x*pas + pas/2, pomme.y*pas + pas/2, pas, pas);
}

void keyPressed() {
// on change la direction en fonction des fleche du clavier
// mais on ne permet pas de revenir sur soi
switch(keyCode) {
case RIGHT:
if (direction!=3) direction=1;
break;
case LEFT:
if (direction!=1) direction=3;
break;
case UP:
if (direction!=2) direction=0;
break;
case DOWN:
if (direction!=0) direction=2;
break;
}
}

void mousePressed() {
commencer = true;
}

// Cette classe représente un point sur la grille
// Elle sert aussi bien à représenter les elements du serpent que la pomme
class Point {
int x; // position x
int y; // et y

// le constructeur de la classe
Point(int _x, int _y) {
x = _x;
y = _y;
}

// une fonction qui determine si le point est sur les x et y donnés
Boolean touche(int _x, int _y) {
return ((_x==x)&&(_y==y));
}
}



Téléchargez le code source : UnSerpentEtUnePomme.pde