Snake snake; char [][] pix; int gridUnit = 3; int gridSize = 40; int xc,yc; int xEgg,yEgg,xBigEgg,yBigEgg,bigEgg; int bestScore = 10; boolean gameOver = true; void setup(){ size(120,120); newGame(); framerate(24); xc = (width>>1)-60; yc = (height>>1)-60; } void draw(){ background(255); noFill(); stroke(0); rect(xc,yc,gridSize*gridUnit,gridSize*gridUnit); noStroke(); fill(0); if(!gameOver){ snake.move(); snake.draw(); fill(255,0,0); drawEgg(); if(bigEgg > 0){ checkBigEgg(); fill(0,0,255); drawBigEgg(); } else if (random(200) == 0){ spawnBigEgg(); } } else{ gameOver(); } } void keyPressed(){ if(!gameOver){ switch(key){ case '6': if(snake.d != 2){ snake.d = 0; } break; case '8': if(snake.d != 3){ snake.d = 1; } break; case '4': if(snake.d != 0){ snake.d = 2; } break; case '2': if(snake.d != 1){ snake.d = 3; } break; } switch(keyCode){ case 5: if(snake.d != 2){ snake.d = 0; } break; case 6: if(snake.d != 3){ snake.d = 1; } break; case 2: if(snake.d != 0){ snake.d = 2; } break; case 1: if(snake.d != 1){ snake.d = 3; } break; } } else{ newGame(); gameOver = false; } } void hiScore(){ if(snake.len > bestScore){ bestScore = snake.len; } } void gameOver(){ for(int i = 0; i < bestScore; i++){ if(i > snake.len){ fill(255,0,0); } else{ fill(0); } rect(xc+(i%gridSize)*gridUnit,yc+(i/gridSize)*gridUnit,gridUnit,gridUnit); } } void newGame(){ pix = new char[gridSize][gridSize]; snake = new Snake(10); spawnEgg(); bigEgg = 0; } void drawEgg(){ rect(xc+xEgg*gridUnit,yc+yEgg*gridUnit,gridUnit,gridUnit); } void drawBigEgg(){ rect(xc+xBigEgg*gridUnit,yc+yBigEgg*gridUnit,gridUnit,gridUnit); } void checkBigEgg(){ if(bigEgg > 0){ bigEgg--; } else if(bigEgg == 1){ pix[xBigEgg][yBigEgg] = 0; } } void spawnEgg(){ while(true){ xEgg = random(0,gridSize-1); yEgg = random(0,gridSize-1); if(pix[xEgg][yEgg] == 0){ break; } } pix[xEgg][yEgg] = 2; } void spawnBigEgg(){ while(true){ xBigEgg = random(0,gridSize-1); yBigEgg = random(0,gridSize-1); if(pix[xBigEgg][yBigEgg] == 0 ){ break; } } bigEgg = random(35,50); pix[xBigEgg][yBigEgg] = 3; } class Snake{ int [] x,y;//snake body array int d,len;//direction and length Snake(int len){ this.len = len; x = new int[len]; y = new int[len]; d = 0; for(int i = 0; i < len; i++){ x[i] = (gridSize>>1)-10; y[i] = gridSize>>1; } for(int i = 0; i < len; i++){ move(); } } void move(){ //shift values along one pix[x[0]][y[0]] = 0; for (int i = 1; i < len; i++){ x[i-1] = x[i]; y[i-1] = y[i]; } switch(d){ case 0: x[len-1]++; break; case 1: y[len-1]++; break; case 2: x[len-1]--; break; case 3: y[len-1]--; break; } //check for own body, walls and eggs if(x[len-1] < gridSize && x[len-1] > -1 && y[len-1] < gridSize && y[len-1] > -1){ switch(pix[x[len-1]][y[len-1]]){ case 1: hiScore(); gameOver = true; break; case 2: for(int i = 0; i < random(1,6); i++){ x = append(x, x[len-1]); y = append(y, y[len-1]); len++; pix[x[len-1]][y[len-1]] = 1; } spawnEgg(); break; case 3: for(int i = 0; i < random(7,15); i++){ x = append(x, x[len-1]); y = append(y, y[len-1]); len++; pix[x[len-1]][y[len-1]] = 1; } bigEgg = 0; default: pix[x[len-1]][y[len-1]] = 1; break; } } else{ hiScore(); gameOver = true; } } void draw(){ for(int i = 0; i < len; i++){ rect(xc+x[i]*gridUnit,yc+y[i]*gridUnit,gridUnit,gridUnit); } } }