séance 8 - en groupe
Lors de cette séance nous avons listé les problèmes qui nous empêchent de finir notre projet :
- Obtenir un mouvement fluide du serpent, c’est-à-dire avoir plusieurs carrés constituant le serpent qui puissent à la fois être collés et suivre le même déplacement sens rester en un seul bloc.
- Créer un évènement lorsque la pomme et le serpent ont les mêmes coordonnées: ajouter un carré au serpent et faire apparaittre une nouvelle pomme à des coordonées diffenrentes.
Nous avons fait des recherches sur internet et avons pu trouvé trois programmes succeptibles de nous permettre de résoudre ces problèmes.
Voici ce que nous avons pu trouver :
ArrayList ellipseList;
Ellipse head;
int SEGMENT_SIZE = 10;
int dir;
int prevPosX, prevPosY;
PFont f;
String mesaj="";
boolean ok=false;
Ellipse food;
void setup()
{
size(400, 400);
ellipseList = new ArrayList();
head = new Ellipse(width/2, height/2);
ellipseList.add(head);
dir=2;
// Start with head and small body
ellipseList.add(new Ellipse(width/2 - 2 * SEGMENT_SIZE, height/2));
addFood();
mesaj="Press mouse to start the game!\nUse arrows to move the snake.";
frameRate(10);
}
void draw()
{
fill(0);
background(#FFCCCC);
text(mesaj,width/2-100,height/2);
if(ok)
{
food.createEllipse();
tryToEatAndMove(ellipseList.size());
}
}
boolean tryToEatAndMove(int p)
{
int x = head.getX();
int y = head.getY();
if (dist(x, y, food.getX(), food.getY()) < 6)
{
// Move the body
move();
// Get last two segments
Ellipse e1 = (Ellipse) ellipseList.get(ellipseList.size() - 1);
Ellipse e2 = (Ellipse) ellipseList.get(ellipseList.size() - 2);
int dX = e1.getX() - e2.getX();
int dY = e1.getY() - e2.getY();
// Add another segment at the end
ellipseList.add(new Ellipse(e1.getX() + dX, e1.getY() + dY));
// Add food to replace the one being eat
addFood();
println("Length: " + ellipseList.size());
return true;
}
// Not on food, just move
move();
return false;
}
void addFood()
{
food = new Ellipse(int(random(10, 390)), int(random(10, 390)),6);
}
void move()
{
prevPosX = head.getX();
prevPosY = head.getY();
switch(dir)
{
case 0:
head.moveUp();
break;
case 1:
head.moveDown();
break;
case 2:
head.moveRight();
break;
case 3:
head.moveLeft();
break;
}
followHead();
}
void followHead()
{
fill(0);
head.createEllipse();
fill(255);
for (int i = 1; i < ellipseList.size(); i++)
{
Ellipse e = (Ellipse) ellipseList.get(i);
int ppX = e.getX();
int ppY = e.getY();
// Move the segment where the previous one was
e.x = prevPosX; e.y = prevPosY; // Need Ellipse.setX and setY...
prevPosX = ppX;
prevPosY = ppY;
e.createEllipse();
}
}
void mousePressed()
{
mesaj="";
ok=true;
dir=2;
}
void keyPressed()
{
if(key==CODED)
{
if(keyCode==UP)
{
dir=0;
}
if(keyCode==DOWN)
{
dir=1;
}
if(keyCode==RIGHT)
{
dir=2;
}
if(keyCode==LEFT)
{
dir=3;
}
}
}
class Ellipse
{
int x; int y; int l;
Ellipse(int _x, int _y)
{
x=_x; y=_y; l=10;
}
Ellipse(int _x, int _y, int _l)
{
x=_x; y=_y; l=_l;
}
void createEllipse()
{
ellipse(x,y,l,l);
}
void createEllipse(int a,int b)
{
ellipse(a,b,l,l);
}
void moveUp()
{
y-=l;
if(y<0) y=height;
}
void moveDown()
{
y+=l;
if(y>height) y=0;
}
void moveRight()
{
x+=l;
if(x>width) x=0;
}
void moveLeft()
{
x-=l;
if(x<0) x=width;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
int getL()
{
return l;
}
}
// snake variables
int snakesize=1; //size of the snake
int MAXLENGTH=1011;
int headx[]=new int[MAXLENGTH]; //xlocation
int heady[]=new int[MAXLENGTH]; //ylocation
int i;
//FOOD VARIABLES
int yumx=(round(random(49))+1)*10;
int yumy=(round(random(49))+1)*10;
//SPEED
//int speed;
int xspeed, yspeed;
void setup () {
size (500, 500);
headx[0] = 250;
heady[0] = 250;
// SNAKE HEAD BEGINS UNMOVING.
//speed=1;
xspeed=0;
yspeed=0;
}
void draw () {
background (0);
fill(255, 0, 0);
ellipseMode(CENTER);
ellipse(yumx, yumy, 15, 15);
for (int i =0; i < snakesize; i++) {
//tail
fill(200, 20, 200);
rectMode(CENTER);
rect(headx[i], heady[i], 20, 20);
}
headx[0]=headx[0]+xspeed;
heady[0]=heady[0]+yspeed;
for (int i = snakesize; i > 0; i--) {
headx[i] = headx[i-1];
heady[i] = heady[i-1];
}
// FOOD
if (snakesize
{
if (headx[0]>=yumx-20 && headx[0]<=yumx+20 && heady[0]>=yumy-20 && heady[0]
{
yumx=(round(random(49))+1)*10;
yumy=(round(random(49))+1)*10;
snakesize++;
if (i!=1)
{
headx[snakesize -1] = headx[snakesize - 2] - 0;
heady[snakesize -1] = heady[snakesize - 2] - 20;
}
}
}
}
void keyPressed()
{
// ARROW KEYS OR LETTER KEYS PRESSED.
// RIGHT & LEFT HAND CONTROLS.
if (keyCode==UP || key == 'w')
{
xspeed=0;
yspeed=-2;
}
else if (keyCode==DOWN || key =='s')
{
xspeed=0;
yspeed=2;
}
else if (keyCode==LEFT || key=='a')
{
xspeed=-2;
yspeed=0;
}
else if (keyCode==RIGHT || key =='d')
{
xspeed=2;
yspeed=0;
}
}
// Snakes
// By: Anson Liang
// This is a classic snake game, just made it for fun.
//
color col=color(255,255,192);
color foodColor = color(255,0, 0);
float speed = 100;
int cx, cy;
int moveX = 0;
int moveY = 0;
int snakeX = 0;
int snakeY = 0;
int foodX = -1;
int foodY = -1;
boolean check = true;
int []snakesX;
int []snakesY;
int snakeSize = 1;
int windowSize = 200;
boolean gameOver = false;
PFont Font = createFont("Arial",20, true);
void setup(){
size(int(windowSize), int(windowSize),P3D);
background(0);
speed = 100;
speed=speed/frameRate;
snakesX = new int[100];
snakesY = new int[100];
cx = width/2;
cy = height/2;
snakeX = cx-5;
snakeY = cy-5;
foodX = -1;
foodY = -1;
gameOver = false;
check = true;
snakeSize =1;
}
void draw(){
if(speed%10 == 0){
background(0);
runGame();
}
speed++;
}
void reset(){
snakeX = cx-5;
snakeY = cy-5;
gameOver = false;
check = true;
snakeSize =1;
moveY = 0;
moveX = 0;
}
void runGame(){
if(gameOver== false){
drawfood();
drawSnake();
snakeMove();
ateFood();
checkHitSelf();
}else{
String modelString = "game over";
textAlign (CENTER);
textFont(Font);
text(modelString,100,100,40);
}
}
void checkHitSelf(){
for(int i = 1; i < snakeSize; i++){
if(snakeX == snakesX[i] && snakeY== snakesY[i]){
gameOver = true;
}
}
}
void ateFood(){
if(foodX == snakeX && foodY == snakeY){
check = true;
snakeSize++;
}
}
void drawfood(){
fill(foodColor);
while(check){
int x = (int)random(1,windowSize/10);
int y = (int)random(1,windowSize/10);
foodX = 5+x*10;
foodY = 5+y*10;
for(int i = 0; i < snakeSize; i++){
if(x == snakesX[i] && y == snakesY[i]){
check = true;
i = snakeSize;
}else{
check = false;
}
}
}
rect(foodX-5, foodY-5, 10, 10);
}
void drawSnake(){
fill(col);
for(int i = 0; i < snakeSize; i++) {
int X = snakesX[i];
int Y = snakesY[i];
rect(X-5,Y-5,10,10);
}
for(int i = snakeSize; i > 0; i--){
snakesX[i] = snakesX[i-1];
snakesY[i] = snakesY[i-1];
}
}
void snakeMove(){
snakeX += moveX;
snakeY += moveY;
if(snakeX > windowSize-5 || snakeX < 5||snakeY > windowSize-5||snakeY < 5){
gameOver = true;
}
snakesX[0] = snakeX;
snakesY[0] = snakeY;
}
void keyPressed() {
if(keyCode == UP) { if(snakesY[1] != snakesY[0]-10){moveY = -10; moveX = 0;}}
if(keyCode == DOWN) { if(snakesY[1] != snakesY[0]+10){moveY = 10; moveX = 0;}}
if(keyCode == LEFT) { if(snakesX[1] != snakesX[0]-10){moveX = -10; moveY = 0;}}
if(keyCode == RIGHT) { if(snakesX[1] != snakesX[0]+10){moveX = 10; moveY = 0;}}
if(keyCode == 'R') {reset();}
}
(Publiée par Elodie)