Jogo da Cobra – SNAKE

snake-game

 

Snake, tradução de cobra para português, é o mítico jogo que fazia furor nos finais dos anos 90 por ser um jogo viciante. O jogo consistia no jogador  controlar uma cobra, que no início começava por ser pequena mas que ia aumentando o seu tamanho conforme a “comida” que apanhasse. Não podia colidir com o próprio corpo ou com as “paredes” que cercavam a área de jogo. Cada vez que a serpente comia um pedaço de comida, o corpo crescia, aumentando a dificuldade do jogo. O usuário controlava a direção da cabeça da serpente (para cima, para baixo, esquerda e direita) enquanto o resto do corpo seguia os mesmos movimentos.

 

Hoje vamos elaborar um projeto onde vai ser possível executar o jogo numa matriz LED 8×8.

Material:

1 LED Matriz 8×8;
2 Resistências 10k;
2 Botões de pressão.

Montagem:

montagem

Código Arduino:

#include
#include
#include

const int buttonRightPin = 2;
const int buttonLeftPin = 3;
const int RIGHTBUTTON = 0;
const int LEFTBUTTON = 1;
const int TOP = 0;
const int RIGHT = 1;
const int BOTTOM = 2;
const int LEFT = 3;
const int MAX_SNAKE_LENGTH = 10;
Adafruit_8x8matrix matrix = Adafruit_8x8matrix();
int direction = TOP;
int snakeX[MAX_SNAKE_LENGTH];
int snakeY[MAX_SNAKE_LENGTH];
int snakeLength = 1;
boolean buttonRead = false;
unsigned long prevTime = 0;
unsigned long delayTime = 500;
int fruitX, fruitY;
unsigned long fruitPrevTime = 0;
unsigned long fruitBlinkTime = 1000/250;
int fruitLed = LED_ON;
void setup(){
Serial.begin(9600);
Serial.println(“Snake is started”);
randomSeed(analogRead(0));

matrix.begin(0x70);

int buttonpins[] = {buttonRightPin, buttonLeftPin};
initButtons(buttonpins, 2);

snakeX[0] = 4;
snakeY[0] = 7;
for(int i=1; i<max_snake_length; i++){="“”" snakex[i]="“snakeY[i]”" =="“”" –1;="“”" }="“”" makefruit();="“”" void="“”" loop(){="“”" checkbuttons();="“”" unsigned="“”" long="“”" currenttime="“millis();”" if(currenttime="“”" -="“”" prevtime="“”">= delayTime){
nextstep();
buttonRead = false;
prevTime = currentTime;
}
draw();
}
void checkButtons(){
if(!buttonRead){
int currentDirection = direction;
if(buttonClicked(LEFTBUTTON)){
direction—;
if(direction < 0){
direction = LEFT;
}
}
else if(buttonClicked(RIGHTBUTTON)){
direction++;
if(direction > 3){
direction = TOP;
}
}
buttonRead = (currentDirection != direction);
}
}
void draw(){
matrix.clear();
drawSnake();
drawFruit();
matrix.writeDisplay();
}
void drawSnake(){
for(int i=0; i<snakelength; i++){="“”" matrix.drawpixel(snakex[i],="“”" snakey[i],="“”" led_on);="“”" }="“”" void="“”" drawfruit(){="“”" if(inplayfield(fruitx,="“”" fruity)){="“”" unsigned="“”" long="“”" currenttime="“millis();”" if(currenttime="“”" -="“”" fruitprevtime="“”">= fruitBlinkTime){
fruitLed = (fruitLed == LED_ON) ? LED_OFF : LED_ON;
fruitPrevTime = currenttime;
}
matrix.drawPixel(fruitX, fruitY, fruitLed);
}
}
boolean inPlayField(int x, int y){
return (x>=0) && (x<8) && (y>=0) && (y<8);
}
void nextstep(){
for(int i=snakeLength–1; i>0; i—){
snakeX[i] = snakeX[i–1];
snakeY[i] = snakeY[i–1];
}
switch(direction){
case TOP:
snakeY[0] = snakeY[0]–1;
break;
case RIGHT:
snakeX[0] = snakeX[0]+1;
break;
case BOTTOM:
snakeY[0] = snakeY[0]+1;
break;
case LEFT:
snakeX[0]=snakeX[0]–1;
break;
}
if((snakeX[0] == fruitX) && (snakeY[0] == fruitY)){
snakeLength++;
if(snakeLength < MAX_SNAKE_LENGTH){
makeFruit();
}
else {
fruitX = fruitY = –1;
}
}
}
void makeFruit(){
int x, y;
x = random(0, 8);
y = random(0, 8);
while(isPartOfSnake(x, y)){
x = random(0, 8);
y = random(0, 8);
}
fruitX = x;
fruitY = y;
}

Observações: Para download da biblioteca Adafruit, clique aqui. É só colocar na pasta IDE do Arduino.

Se ainda não tens o material necessário para este projeto, acede à nossa loja Boxelectronica. Ou então dá uma vista de olhos na lista: