code:
Snake snake; int rate=1; int bodySize=20; //grandezza del corpo del serpente PVector direction=new PVector(0,bodySize); //direzione iniziale verso il basso (scelta a caso) static boolean running=true; //la variabile booleana fa vedere se il gioco è in corso o menp void setup(){ size(600,600); snake=new Snake(bodySize); frameRate(rate); smooth(); } void draw(){ if (running){ //il gioco in corso disegna il primo sfondo e fa muovere il serpente, il resto sarà gestito a parte background(loadImage("back.jpg")); snake.move(direction); } else //se no viene disegnata la schermata di perdita { background(loadImage("nelson.jpg")); textFont(loadFont("Arial-Black-48.vlw") , 40); fill(255); text("You Lose!",width-275,200); textFont(loadFont("Arial-Black-48.vlw"),20); text("Press n",width-200,height-100); text("for a new game", width-200,height-70); } } void keyPressed(){ //cambia direzione al serpente if (keyCode==UP) direction.set(0,-bodySize,0); if (keyCode==DOWN) direction.set(0,bodySize,0); if (keyCode==LEFT) direction.set(-bodySize,0,0); if (keyCode==RIGHT) direction.set(bodySize,0,0); if (key=='n') newGame(); } static void gameFinished(){ //se invocato ferma il gioco running=false; } void newGame(){ //ripristina lo stato iniziale snake=new Snake(bodySize); running=true; direction=new PVector(0,bodySize); }
code:
class Snake{ ArrayList snakeBody=new ArrayList(); Snake(int bodySize){ //crea un serpente con 5 pezzi int scala=0; for (int i=0; i<5; i++){ snakeBody.add(new SnakeBodyPart(new PVector(300-scala,10),bodySize)); scala+=bodySize; } } void move(PVector direction){ //la direzione influisce solo sul movimento della testa SnakeBodyPart head=(SnakeBodyPart)snakeBody.get(0); head.move(direction); head.display(); //il resto viene fatto in modo che un pezzo successivo prenda il posto del pezzo precedente int count=1; while(count<snakeBody.size()){ SnakeBodyPart part=(SnakeBodyPart)snakeBody.get(count); SnakeBodyPart previous=(SnakeBodyPart)snakeBody.get(count-1); part.setNewPos(previous.getOldPos()); part.display(); count=count+1; } } }
code:
class SnakeBodyPart{ PVector pos,oldPos; int bodySize; float scala; SnakeBodyPart(PVector pos,int bodySize){ this.pos=pos.get(); this.oldPos=pos.get(); this.bodySize=bodySize; this.scala=bodySize/2; } void display(){ //disegna un rettangolo il cui centro viene letto dal vettore posizione rectMode(CENTER); fill(0,255,0); rect(pos.x,pos.y,bodySize,bodySize); } PVector getOldPos(){ return oldPos.get(); } PVector getPos(){ return pos.get(); } void setNewPos(PVector newPos){ pos.set(newPos.get()); } void move(PVector direction){ oldPos=pos.get(); pos.add(direction); //se la posizione esce dalla finestra si perde if (((pos.x-scala<0)||(pos.x+scala>width)) || ((pos.y-scala/2<0)||(pos.y+scala/2>height))) SnakeGame.gameFinished(); } }