The classic game of snake. Control using a joystick and displayed on a VGA screen

Dependencies:   4DGL direction draw game list mbed

Revision:
0:1ca938e58b91
Child:
1:aa27e5ef379b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Oct 11 19:00:03 2012 +0000
@@ -0,0 +1,135 @@
+#include "mbed.h"
+#include "direction.h"
+#include "list.h"
+#include "draw.h"
+#include "game.h"
+
+DigitalOut myled(LED1);
+DigitalOut myled2(LED2);
+DigitalIn  pb(p17);
+
+int main() {
+    pb.mode(PullUp);
+    myled2 = 1;
+    SDirection direction, newDirection;
+    List snake = {NULL,NULL};
+    Apple apple;
+    int points;
+    int tempRow, tempCol;
+    int draw_yes = 0;
+    int i;
+    State game = start;
+    drawSetup();
+
+    while(1) {
+    wait(0.016666667);
+    myled = !myled;
+        switch(game) {
+            case start:
+                if((direction = getDirection(none)) != none) {
+                    deleteList(&snake);
+                    clearscr();
+                    for(i = -1; i < ROW + 2; i++) {                      
+                        drawPixel(i,-1,0xFFFFFF);
+                        drawPixel(i,COL+1,0xFFFFFF);
+                    }
+                    for(i = -1; i < COL + 2; i++){
+                        drawPixel(-1,i,0xFFFFFF);
+                        drawPixel(ROW+1,i,0xFFFFFF);
+                    }
+                    addToHead(&snake, 5, 5);
+                    addToHead(&snake, 5, 6);
+                    addToHead(&snake, 5, 7);
+                    apple.row = rand() % (ROW - 1) + 1;
+                    apple.col = rand() % (COL - 3) + 3;
+                    points = 0;
+                    game = run;
+                }
+                break;
+            case run:
+                // control
+                newDirection = getDirection(newDirection);
+                draw_yes++;
+                if(draw_yes == 14) game = draw;
+                break;
+           
+           case draw:     
+                //model
+                draw_yes = 0;
+                game = run;
+                //left
+                if(newDirection == left && direction != right || newDirection == none && direction == left || direction == left && newDirection == right) {
+                    direction = left;
+                    //pc.printf("left\n\r");
+                    addToHead(&snake, snake.head->row, snake.head->col - 1);
+                    if (snake.head->row == apple.row && snake.head->col == apple.col) {
+                        tempRow = -1;
+                        tempCol = -1;
+                        score(&apple, &points);
+                    } else {
+                        tempRow = snake.tail->row;
+                        tempCol = snake.tail->col;
+                        removeFromTail(&snake);
+                    }
+                //right    
+                } else if (newDirection == right && direction != left || newDirection == none && direction == right || direction == right && newDirection == left) {
+                    addToHead(&snake, snake.head->row, snake.head->col + 1);
+                    direction = right;
+                    //pc.printf("right\n\r");                    
+                    if (snake.head->row == apple.row && snake.head->col == apple.col) {
+                        tempRow = -1;
+                        tempCol = -1;
+                        score(&apple, &points);
+                    } else {
+                        tempRow = snake.tail->row;
+                        tempCol = snake.tail->col;
+                        removeFromTail(&snake);
+                    }
+                //up    
+                } else if (newDirection == up && direction != down || newDirection == none && direction == up|| direction == up && newDirection == down) {
+                    addToHead(&snake, snake.head->row - 1, snake.head->col);
+                    direction = up;
+                    //pc.printf("up\n\r");                    
+                    if (snake.head->row == apple.row && snake.head->col == apple.col) {
+                        tempRow = -1;
+                        tempCol = -1;
+                        score(&apple, &points);
+                    } else {
+                        tempRow = snake.tail->row;
+                        tempCol = snake.tail->col;
+                        removeFromTail(&snake);
+                    }
+                //down    
+                } else if (newDirection == down && direction != up || newDirection == none && direction == down|| direction == down&& newDirection == up) {
+                    addToHead(&snake, snake.head->row + 1, snake.head->col);
+                    direction = down;
+                    //pc.printf("down\n\r");
+                    if (snake.head->row == apple.row && snake.head->col == apple.col) {
+                        tempRow = -1;
+                        tempCol = -1;
+                        score(&apple, &points);
+                    } else {
+                        tempRow = snake.tail->row;
+                        tempCol = snake.tail->col;
+                        removeFromTail(&snake);
+                    }
+                }
+                
+               if(!checkGameOver(&snake)){
+                    game = end;
+                }
+                
+                //view
+                if(tempRow >= 0) {
+                    drawBlank(tempRow, tempCol);
+                }
+                drawApple(apple.row, apple.col);
+                drawSnake(snake.head->row, snake.head->col);
+                drawScore(points);
+                break;
+            case end:            
+                if(!pb) game = start;
+                break;
+        }                
+    }
+}