import java.util.Vector; Snake snake,versus; Egg egg, big_egg; AStar astar; Tile [][] grid; int grid_unit = 5; int grid_size = 40; int xc,yc; int best_score = 10; int last_score = 10; final int TITLE = 0; final int GAME = 1; final int GAME_OVER = 2; int state = 0; PFont font; int debug = 0; int versus_col = #0A9632; int versus_guide = #54B970; int versus_square = #3E674A; int snake_col = #464646; int snake_guide = #B7B7B7; int snake_square = #1A1A1A; int best_col = #FA1900; int best_guide = #F0695A; int best_square = #AD1E27; int last_col = #006CED; int last_guide = #7DADE5; int last_square = #335986; long mills; int mills_per_frame = 83; void setup(){ size(200,200); font = loadFont(); textFont(font); newSplash(); //framerate(12); xc = (width >> 1) - 100; yc = (height >> 1) - 100; String [] temp = loadStrings("snakeAI2.txt"); if(temp.length > 0){ best_score = int(join(temp, "")); } mills = System.currentTimeMillis(); } void draw(){ switch(state){ case GAME: if(System.currentTimeMillis() - mills >= mills_per_frame){ drawBackground(); updateClock(); snake.main(); versus.main(); egg.draw(); if(big_egg != null){ big_egg.draw(); } else if (random(200) == 0){ spawnBigEgg(); } if(!snake.alive){ hiScore(); state = GAME_OVER; newSplash(); } if(!versus.alive){ //erase invisible snake body for(int i = 0; i < versus.len; i++) if(versus.y[i] >= 0 && versus.y[i] < grid_size && versus.x[i] >= 0 && versus.x[i] < grid_size) grid[versus.y[i]][versus.x[i]].walkable = true; newVersus(); } } break; case TITLE: drawBackground(); title(); fill(0); text("SNAKE AI",xc+10, yc + 30); text("BEST: "+best_score,xc+10, yc + 80); text("LAST: "+last_score,xc+10, yc + 100); break; case GAME_OVER: fill(0); text("GAME OVER", xc+10, height>>1); break; } //printWalls(); } void updateClock(){ mills = System.currentTimeMillis(); } void drawBackground(){ background(240); fill(210); stroke(0); rect(xc-10, yc-10, 20 + grid_size * grid_unit, 20 + grid_size * grid_unit); fill(245); rect(xc, yc, grid_size * grid_unit, grid_size * grid_unit); } void keyPressed(){ switch(state){ case GAME: int old_d = snake.d; switch(key){ case '6': if(snake.d != Snake.LEFT) snake.d = Snake.RIGHT; break; case '8': if(snake.d != Snake.UP) snake.d = Snake.DOWN; break; case '4': if(snake.d != Snake.RIGHT) snake.d = Snake.LEFT; break; case '2': if(snake.d != Snake.DOWN) snake.d = Snake.UP; break; } switch(keyCode){ case 5: if(snake.d != Snake.LEFT) snake.d = Snake.RIGHT; break; case 6: if(snake.d != Snake.UP) snake.d = Snake.DOWN; break; case 2: if(snake.d != Snake.RIGHT) snake.d = Snake.LEFT; break; case 1: if(snake.d != Snake.DOWN) snake.d = Snake.UP; break; } switch(old_d){ case RIGHT: if(snake.d == LEFT) snake.d = RIGHT; break; case DOWN: if(snake.d == UP) snake.d = DOWN; break; case LEFT: if(snake.d == RIGHT) snake.d = LEFT; break; case UP: if(snake.d == DOWN) snake.d = UP; break; } break; case TITLE: newGame(); state = GAME; updateClock(); break; case GAME_OVER: if(keyCode == 8) state = TITLE; break; } } void printWalls(){ stroke(255, 0, 0); noFill(); for(int r = 0; r < grid_size; r++){ for(int c = 0; c < grid_size; c++){ if(!grid[r][c].walkable){ ellipse(xc + c * grid_unit, yc + r * grid_unit, grid_unit, grid_unit); } } } } void hiScore(){ last_score = snake.len; if(last_score > best_score){ best_score = last_score; String [] temp = {""+best_score}; saveStrings("snakeAI2.txt", temp); } } void title(){ //draw a snake for current score and one for previous score; snake.main(); versus.main(); egg.draw(); //erase invisible snake body if(!snake.alive){ for(int i = 0; i < snake.len; i++) if(snake.y[i] >= 0 && snake.y[i] < grid_size && snake.x[i] >= 0 && snake.x[i] < grid_size) grid[snake.y[i]][snake.x[i]].walkable = true; snake = new Snake(Snake.LEFT, last_score, last_col, last_guide, last_square, grid_size-1, grid_size-1, true); } //erase invisible snake body if(!versus.alive){ for(int i = 0; i < versus.len; i++) if(versus.y[i] >= 0 && versus.y[i] < grid_size && versus.x[i] >= 0 && versus.x[i] < grid_size) grid[versus.y[i]][versus.x[i]].walkable = true; versus = new Snake(Snake.RIGHT, best_score, best_col, best_guide, best_square, 0, 0, true); } } void newGame(){ newGrid(); spawnEgg(); snake = new Snake(Snake.RIGHT, 10, snake_col, snake_guide, snake_square, (grid_size>>1)-10, grid_size>>1, false); newVersus(); big_egg = null; } //make new bad snake void newVersus(){ int corner = random(4); int x = 0; int y = 0; int d = Snake.RIGHT; switch(corner){ case 0: d = random(2) == 1 ? RIGHT : DOWN; break; case 1: x = grid_size-1; y = 0; d = random(2) == 1 ? LEFT : DOWN; break; case 2: x = grid_size-1; y = grid_size-1; d = random(2) == 1 ? LEFT : UP; break; case 3: x = 0; y = grid_size-1; d = random(2) == 1 ? RIGHT : UP; break; } versus = new Snake(d, 10, versus_col, versus_guide, versus_square, x, y, true); } void newSplash(){ newGrid(); spawnEgg(); versus = new Snake(Snake.RIGHT, best_score, best_col, best_guide, best_square, 0, 0, true); snake = new Snake(Snake.LEFT, last_score, last_col, last_guide, last_square, grid_size-1, grid_size-1, true); big_egg = null; } void newGrid(){ grid = new Tile[grid_size][grid_size]; for(int r = 0; r < grid_size; r++){ for(int c = 0; c < grid_size; c++){ grid[r][c] = new Tile(c, r); } } astar = new AStar(grid); } void spawnEgg(){ egg = new Egg(); } void spawnBigEgg(){ big_egg = new Egg(true); }