test test test

Dependencies:   mbed

Revision:
0:e4c5e6ec922e
diff -r 000000000000 -r e4c5e6ec922e snake-test/ELEC2645_ProjecT/Snake/SnakeEngine.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/snake-test/ELEC2645_ProjecT/Snake/SnakeEngine.cpp	Mon May 25 19:06:11 2020 +0000
@@ -0,0 +1,296 @@
+#include "SnakeEngine.h"
+SnakeEngine::SnakeEngine(Gamepad &pad, N5110 &display):gamePad(pad), lcd(display){
+    
+}
+SnakeEngine::~SnakeEngine(){
+
+}
+
+void SnakeEngine::drawSnake(){
+    for(int i=0;i<snakeSize;i++)
+        lcd.drawRect(snake[i].X,snake[i].Y,gameObjectSize,gameObjectSize,FILL_BLACK);
+
+}
+
+void SnakeEngine::drawFood(){
+    lcd.drawRect(food.X,food.Y,gameObjectSize,gameObjectSize,FILL_BLACK);
+
+}
+
+void SnakeEngine::drawScore(){
+    char buffer1[14];
+    sprintf(buffer1,"S:%2d      H:%2d",gameScore,gameLife);
+    lcd.printString(buffer1,0,0);
+}
+
+void SnakeEngine::drawGameFrame(){
+    lcd.clear();
+    drawScore();
+    lcd.drawLine(0,10,83,10,1);
+    drawSnake();
+    drawFood();
+    lcd.refresh();
+}
+
+void SnakeEngine::regenFood(){
+    do{
+        food.X = rand() % (AREA_X + 1 - 12) + 12;//random(2,AREA_X);
+    } while(food.X % gameObjectSize != 0);
+    do {
+        food.Y = rand() % (AREA_Y + 1 - 12) + 12;//random(2,AREA_Y);
+    } while(food.Y % gameObjectSize != 0);
+}
+
+void SnakeEngine::isColliding(){
+    //if snake is eating food
+    if((snake[0].X == food.X) && (snake[0].Y == food.Y)){
+        //turn on LEDs momentarily when eating food
+        gamePad.leds_on();
+        wait(0.1);
+        gamePad.leds_off();
+        //LED effect off
+        snakeSize++; // grow snake
+        gameScore++; //increase score
+        regenFood(); // recreate snake food
+    }
+    else{ // snake is eating himself
+        for(int i=1; i<snakeSize;i++){
+            if((snake[0].X == snake[i].X) && (snake[0].Y == snake[i].Y)){
+                gamePad.tone(1000.0,0.1);
+                gameLife--;
+                if(gameLife == 0)
+                    state = GAMEOVER;
+                else
+                    state = NEWLIFE;
+            }
+        }
+    }
+/*
+    //snake is going to hit a wall
+    if((snake[0].X < AREA_X_min) || (snake[0].Y < AREA_Y_min) || (snake[0].X>AREA_X) || (snake[0].Y > AREA_Y)){
+        gamePad.tone(1000.0,1);
+        gameLife--;
+        if(gameLife == 0)
+            state = GAMEOVER;
+        else
+            state = NEWLIFE;
+    }
+    */
+    /*******************update********************/
+    //start
+    if (snake[0].X <= AREA_X_min)
+        snake[0].X = AREA_X;
+    else if (snake[0].X >= AREA_X)
+        snake[0].X = AREA_X_min;
+
+    if (snake[0].Y <= AREA_Y_min)
+        snake[0].Y = AREA_Y;
+    else if (snake[0].Y >= AREA_Y)
+        snake[0].Y = AREA_Y_min;
+    //end
+
+    /*******************update********************/
+}
+
+
+
+void SnakeEngine::setupGame(){
+    snakeSize = 3; // initial size of the snake
+    dirSnake = 1; // initialize snake direction
+    //initialize snake body
+    for(int i=1;i<snakeSize;i++){
+        snake[i].X = 0;
+        snake[i].Y = 0;
+    }
+    snake[0].X = 12;//head_x;
+    snake[0].Y = AREA_Y_min;//head_y;
+
+    // decide where the body of the sanke goes
+
+    for(int i=1;i<snakeSize;i++){
+        int dir = 0;//rand() % 4;//random(0,3);
+
+        if(dir == 0){ // if the snake is facing left
+            snake[i].X = snake[i-1].X - gameObjectSize;
+            snake[i].Y = snake[i-1].Y;
+        }
+        else if(dir == 1){ // if the snake is facing right
+            snake[i].X = snake[i-1].X + gameObjectSize;
+            snake[i].Y = snake[i-1].Y;
+        }
+        else if(dir == 2){ // if snake is facing up
+            snake[i].X = snake[i-1].X;
+            snake[i].Y = snake[i-1].Y - gameObjectSize;
+        }
+        else if(dir == 3){
+            snake[i].X = snake[i-1].X;
+            snake[i].Y = snake[i-1].Y + gameObjectSize;
+        }
+    }
+
+    //regenerate snake food
+    regenFood();
+
+    state = PAUSE; //  change the game state once setup
+}
+
+void SnakeEngine::readUserInput(){
+    // read left button
+    bLeft = gamePad.Y_pressed();
+    //read right button
+    bRight = gamePad.A_pressed();
+    //read up button
+    bUp = gamePad.X_pressed();
+    //read down button
+    bDown = gamePad.B_pressed();
+}
+
+void SnakeEngine::handleUserInput() {
+    
+    readUserInput();
+
+    if((bLeft != false) && (dirSnake != 1))
+        dirSnake = 0;
+    if((bRight != false) && (dirSnake != 0))
+        dirSnake = 1;
+    if((bDown != false) && (dirSnake != 3))
+        dirSnake = 2;
+    if((bUp != false) && (dirSnake != 2))
+        dirSnake = 3;
+}
+
+void SnakeEngine::updateGame(){
+    //update body of the snake
+    for(int i= snakeSize-1;i>0;i--){
+        snake[i].X = snake[i-1].X;
+        snake[i].Y = snake[i-1].Y;
+    }
+
+    // snake is moving left
+    if(dirSnake == 0)
+        snake[0].X -= gameObjectSize;
+    else if(dirSnake == 1) // snake is moving right
+        snake[0].X += gameObjectSize;
+    else if(dirSnake == 2) // snake is moving up
+        snake[0].Y += gameObjectSize; 
+    else if(dirSnake == 3) // snake is moving down
+        snake[0].Y -= gameObjectSize;
+}
+
+void SnakeEngine::playGame(){
+    isColliding();
+    if(state != NEWLIFE && state != GAMEOVER){
+        handleUserInput();
+        updateGame();
+        drawGameFrame();
+    }
+
+    //clear game
+    
+}
+
+void SnakeEngine::gameIsPaused(){
+    readUserInput();
+
+    // if paused, wait for a user input
+    if((bLeft != false) || (bRight != false) || (bDown != false) || (bUp != false))
+        state = INGAME;
+
+    //redraw
+    drawGameFrame();
+}
+void SnakeEngine::gameIsLost(){
+    //redraw
+    lcd.clear();
+    lcd.printString("Game Over",0,1);
+    char buffer1[14];
+    sprintf(buffer1,"Score is %2d",gameScore);
+    lcd.printString(buffer1,0,4);
+    lcd.refresh();
+    wait(5);
+    state = SETUP;
+    gameLife = 3;
+    gameScore = 0;
+}
+void SnakeEngine::init() {
+    dirSnake = 1;
+    gameScore = 0;
+    gameLife = 3;
+    gameObjectSize = 4;
+    snakeSize = 3;
+
+    state = SETUP;
+
+    bLeft = false;
+    bRight = false;
+    bDown = false;
+    bUp = false;
+
+    AREA_X = 82;
+    AREA_Y = 46;
+    AREA_X_min = 1;
+    AREA_Y_min = 12;
+
+    gameSpeed = 1;
+}
+void SnakeEngine::runGameEngine(){
+    switch(state){
+        case SETUP : setupGame(); break;
+        case PAUSE: gameIsPaused(); break;
+        case INGAME: playGame(); break;
+        case NEWLIFE: setupGame(); break;
+        case GAMEOVER:  gameIsLost(); 
+                        welcome();
+                        break;
+    }
+}
+
+void SnakeEngine::welcome(){
+    lcd.printString(" Great Snakes ",0,1);  
+    lcd.printString("  Press Start ",0,4);
+    lcd.refresh();
+     
+    // wait flashing LEDs until start button is pressed 
+    while ( gamePad.start_pressed() == false) {
+        lcd.setContrast( gamePad.read_pot1());
+        gamePad.leds_on();
+        wait(0.1);
+        gamePad.leds_off();
+        wait(0.1);
+    }
+    lcd.clear();
+    char buffer1[14];
+    sprintf(buffer1,"Speed: %2d",gameSpeed);
+    lcd.printString(buffer1,5,1);
+    lcd.printString("  Press Start ",0,5);
+    lcd.refresh();
+    
+    //set snake speed menu 
+    while ( gamePad.start_pressed() == false) {
+        
+        if(gamePad.B_pressed()){
+            if(gameSpeed<4)
+                gameSpeed++;
+            lcd.clear();
+            char buffer1[14];
+            sprintf(buffer1,"Speed: %2d",gameSpeed);
+            lcd.printString(buffer1,5,1);
+            lcd.printString("  Press Start ",0,5);
+            lcd.refresh();
+        }
+        if(gamePad.X_pressed()){
+            if(gameSpeed !=1)
+                gameSpeed--;
+            lcd.clear();
+            char buffer1[14];
+            sprintf(buffer1,"Speed: %2d",gameSpeed);
+            lcd.printString(buffer1,5,1);
+            lcd.printString("  Press Start ",0,5);
+            lcd.refresh();
+        }
+        wait(0.1);
+    }
+}
+int SnakeEngine::getGameSpeed(){
+    return gameSpeed;
+}
\ No newline at end of file