renhao dai / Mbed 2 deprecated Joystick_snake_game

Dependencies:   N5110 mbed

Revision:
8:b01f638d23b4
Parent:
7:69ae0585d11a
Child:
9:c8ea9b4af873
--- a/main.cpp	Tue May 05 14:34:44 2015 +0000
+++ b/main.cpp	Thu May 07 16:42:37 2015 +0000
@@ -7,14 +7,17 @@
 N5110 lcd(p7,p8,p9,p10,p11,p13,p26);
 
 // connections for joystick
-DigitalIn button(p17);
-AnalogIn buttonA(p19);
+//DigitalIn button(p17);
+//AnalogIn buttonA(p19);
+InterruptIn button(p17);
+DigitalIn buttonA(p19);
 AnalogIn xPot(p15);
 AnalogIn yPot(p16);
 PwmOut buzzer(p21);
 PwmOut blacklight(p26);
 PwmOut led1(p24);
 PwmOut led2(p23);
+BusOut leds(LED4,LED3,LED2,LED1);
 
 int i;
 int j;
@@ -54,15 +57,16 @@
 // create struct variable
 Joystick joystick;
 
-Ticker timer;
-int timerFlag=0;
+//int buttonA = 0;
+int pause = 0;
+int buttonAFlag=0;
 int buttonFlag = 0;
 int printFlag = 0;
 int nutFlag =1;
 int lifeFlag =0;
-//float frequency[]={659,554,659,554,550,494,554,587,494,659,554,440};
-//float beat[]={1,1,1,1,1,0.5,0.5,1,1,1,1,2};
-//int buttonFlag = 0;
+//float frequency=659;
+float frequency[]= {659,554,659,554,550,494,554,587,494,659,554,440};
+float beat[]= {1,1,1,1,1,0.5,0.5,1,1,1,1,2};
 // function prototypes
 //void setPixel(int x, int y);
 //void clearPixel(int x, int y);
@@ -91,37 +95,36 @@
     nut.X=rand()%84;
     nut.Y=rand()%48;
     //nutFlag=1;
-    }
-   
+}
+
 void drawNut()
 {
     //int X = rand()%84;
     //int Y = rand()%48;
-    if(nutFlag==1){
-    lcd.drawCircle(nut.X,nut.Y,1,1);    
+    if(nutFlag==1) {
+        lcd.drawCircle(nut.X,nut.Y,1,1);
     }
 }
 
 void moveSnake()
 {
-  
-    if(joystick.direction == CENTRE){
+
+    if(joystick.direction == CENTRE) {
         //snake.snakeX[0]+=1;
         joystick.direction = CENTRE;
     }
     //else if(joystick.button == button){
-      //  snake.snakeX[i]=snake.snakeX[i];
-       // snake.snakeY[i]=snake.snakeY[i];
-       // }
-    else if(joystick.direction == UNKNOWN){
-           joystick.direction = UNKNOWN;
-           }
-    else if(joystick.direction != UNKNOWN&&joystick.direction != CENTRE) {
+    //  snake.snakeX[i]=snake.snakeX[i];
+    // snake.snakeY[i]=snake.snakeY[i];
+    // }
+    else if(joystick.direction == UNKNOWN) {
+        joystick.direction = UNKNOWN;
+    } else if(joystick.direction != UNKNOWN&&joystick.direction != CENTRE) {
 
         if((joystick.direction == DOWN)&&(snake.direction!=LEFT)) {
             snake.direction= RIGHT;
             //snake.snakeX[0]+=1;
-   
+
         } else if((joystick.direction == UP)&&(snake.direction!=RIGHT)) {
             snake.direction=LEFT;
             //snake.snakeX[0]-=1;
@@ -134,12 +137,12 @@
         }
 
     }
-    
+
 }
 
 void initSnake()
 {
-    
+
     snake.snakeX[0] = 16; //coordinate of head
     snake.snakeY[0] = 10;
     snake.snakeX[1] = 14;
@@ -150,204 +153,197 @@
     snake.snakeY[3] = 10;
     snake.node = 6; //node of snake
     snake.direction = RIGHT;
-      
+
 }
-                    
-    
+
+
 void drawSnake()
-{   
-            
-     for(i=0; i<snake.node-1; i++) {
+{
+
+    for(i=0; i<snake.node-1; i++) {
         lcd.drawCircle(snake.snakeX[i],snake.snakeY[i],1,1);
         //lcd.setPixel(snake.snakeX[i],snake.snakeY[i]);
-        
-    } 
-    
+
+    }
+
 }
 
 void startGmae()
 {
-        //nutFlag = 1;
+    //nutFlag = 1;
     //lifeFlag = 0;
     //snake.direction=LEFT;
-        
+
     if((snake.snakeX[0]==nut.X)&&(snake.snakeY[0]==nut.Y)) { // if snake got nut ||(snake.snakeX[0]==nut.X-1)&&(snake.snakeY[0]==nut.Y-1)||(snake.snakeY[0]==nut.Y+1)&&(snake.snakeY[0]==nut.Y+1
-        snake.node+=10;
-        nutFlag=0; 
-        //if(timerFlag){
-               //timerFlag=0;    
-          // new nut appear        
+        snake.node+=1;
+        nutFlag=0; // new nut appear
+        buzzer.period(1/frequency[1]); // set PWM period
+        buzzer=0.1; // set duty cycle
     }
-    
+
+    if((snake.snakeX[0]!=nut.X)||(snake.snakeY[0]!=nut.Y)) {
+        buzzer=0;
+    }
+
     if(nutFlag==0) { //set nut randomly
         nut.X = rand()%83;
         nut.Y = rand()%47;
         nutFlag = 1;
     }
 
-    
-       for(i=3; i<snake.node; i++) { //if snake collide itself snake die
-           if(snake.snakeX[i]==snake.snakeX[0] && snake.snakeY[i]==snake.snakeY[0]) {
-               lifeFlag=1;
-           }      
-      }
-      
-      
-        for(i=snake.node-1; i>0; i--) { //move snake
-           if(snake.snakeX[0]>1||snake.snakeX[0]<83||snake.snakeY[0]>1||snake.snakeY[0]<47){   
-           snake.snakeX[i]=snake.snakeX[i-1];
-           snake.snakeY[i]=snake.snakeY[i-1];
-           }
-           else{
-               snake.snakeX[i]=snake.snakeX[i];
-               snake.snakeY[i]=snake.snakeY[i];
-           }
+
+    for(i=3; i<snake.node; i++) { //if snake collide itself snake die
+        if(snake.snakeX[i]==snake.snakeX[0] && snake.snakeY[i]==snake.snakeY[0]) {
+            lifeFlag=1;
         }
-     
+    }
+
+
+    for(i=snake.node-1; i>0; i--) { //move snake
+        if(snake.snakeX[0]>1||snake.snakeX[0]<83||snake.snakeY[0]>1||snake.snakeY[0]<47) {
+            snake.snakeX[i]=snake.snakeX[i-1];
+            snake.snakeY[i]=snake.snakeY[i-1];
+        } else {
+            snake.snakeX[i]=snake.snakeX[i];
+            snake.snakeY[i]=snake.snakeY[i];
+        }
+    }
+
 
     if(snake.snakeX[0]<1||snake.snakeX[0]>83||snake.snakeY[0]<1||snake.snakeY[0]>47) {
         lifeFlag=1; // snake collide the corrider snake die
     }
-    
+
 }
 
-void printScore(){
+void printScore()
+{
     lcd.printString("Your Score is",0,0);
     int score=snake.node-6;
     int length = sprintf(buffer," SCORE=%2d ",score);
-    lcd.printString(buffer,0,2 ); 
+    lcd.printString(buffer,0,2 );
     lcd.printString("Press to start",0,4);
-    }
-  
-//void buttonAPressed(){
-    //buttonAFlag=1;
-    //}
+}
 
-void pauseGame(){
-        if(button==1){
-            buttonFlag = 1;
-            }
-      }
-         
-void timerExpired(){
-    timerFlag = 1;
+void buttonPressed()
+{
+    buttonFlag =1;
 }
 
-void promptVoice(){
+void snakeModel()
+{
+    for(int i=0; i<25; i+=5) {
+        lcd.clear();
+        lcd.printString("Press to start",1,1);
+
+        lcd.drawRect(44-i,21,1,1,1);
+        lcd.drawRect(46-i,21,1,1,1);
+        lcd.drawRect(48-i,21,1,1,1);
+
+        lcd.drawRect(42-i,23,1,1,1);
+        lcd.drawRect(44-i,23,1,1,1);
+        lcd.drawRect(46-i,23,1,1,1);
+        lcd.drawRect(48-i,23,1,1,1);
+
+        lcd.drawRect(40-i,25,1,1,1);
+        lcd.drawRect(42-i,25,1,1,1);
+        lcd.drawRect(44-i,25,1,1,1);
+        lcd.drawRect(46-i,25,1,1,1);
+        lcd.drawRect(48-i,25,1,1,1);
+        lcd.drawRect(50-i,25,1,1,1);
+
+        lcd.drawRect(40-i,27,1,1,1);
+        lcd.drawRect(42-i,27,1,1,1);
+        lcd.drawRect(44-i,27,1,1,1);
+        lcd.drawRect(46-i,27,1,1,1);
+        lcd.drawRect(48-i,27,1,1,1);
+        lcd.drawRect(50-i,27,1,1,1);//head
+
+        lcd.drawRect(38-i,29,1,1,0); //tougue
+        lcd.drawRect(40-i,31,1,1,0);
+
+        lcd.drawRect(46-i,29,1,1,1);
+        lcd.drawRect(48-i,29,1,1,1);
+        lcd.drawRect(50-i,29,1,1,1);
+
+        lcd.drawRect(46-i,31,1,1,1);
+        lcd.drawRect(48-i,31,1,1,1);
+        lcd.drawRect(50-i,31,1,1,1);
+
+        lcd.drawRect(44-i,33,1,1,1);
+        lcd.drawRect(46-i,33,1,1,1);
+        lcd.drawRect(48-i,33,1,1,1);
+
+        lcd.drawRect(44-i,35,1,1,1);
+        lcd.drawRect(46-i,35,1,1,1);
+        lcd.drawRect(48-i,35,1,1,1);
+
+        lcd.drawRect(42-i,37,1,1,1);
+        lcd.drawRect(44-i,37,1,1,1);
+        lcd.drawRect(46-i,37,1,1,1);
 
-        buzzer.period(0.0020); // set PWM period
-         buzzer.pulsewidth(0.001); // set duty cycle
+        lcd.drawRect(42-i,39,1,1,1);
+        lcd.drawRect(44-i,39,1,1,1);
+        lcd.drawRect(46-i,39,1,1,1);
+
+        lcd.drawRect(44-i,41,1,1,1);
+        lcd.drawRect(46-i,41,1,1,1);
+        lcd.drawRect(48-i,41,1,1,1);
+        lcd.drawRect(50-i,41,1,1,1);//neck
+
+        lcd.drawRect(80-i,41,1,1,1);//tail
+        lcd.drawRect(82-i,41,1,1,1);
+        lcd.drawRect(84-i,41,1,1,1);
+
+        lcd.drawRect(82-i,39,1,1,1);
+        lcd.drawRect(84-i,39,1,1,1);
+
+        lcd.drawRect(82-i,37,1,1,1);
+
+        lcd.drawRect(80-i,35,1,1,1);//tail
+
+        lcd.drawRect(46-i,43,1,1,1);
+        lcd.drawRect(48-i,43,1,1,1);
+        lcd.drawRect(50-i,43,1,1,1);
+        lcd.drawRect(52-i,43,1,1,1);
+        lcd.drawRect(54-i,43,1,1,1);
+        lcd.drawRect(56-i,43,1,1,1);
+        lcd.drawRect(58-i,43,1,1,1);
+        lcd.drawRect(60-i,43,1,1,1);
+        lcd.drawRect(62-i,43,1,1,1);
+        lcd.drawRect(64-i,43,1,1,1);
+        lcd.drawRect(66-i,43,1,1,1);
+        lcd.drawRect(68-i,43,1,1,1);
+        lcd.drawRect(70-i,43,1,1,1);
+        lcd.drawRect(72-i,43,1,1,1);
+        lcd.drawRect(74-i,43,1,1,1);
+        lcd.drawRect(76-i,43,1,1,1);
+        lcd.drawRect(78-i,43,1,1,1);
+        lcd.drawRect(80-i,43,1,1,1);
+        lcd.drawRect(82-i,43,1,1,1);
+
+        lcd.drawRect(48-i,45,1,1,1);
+        lcd.drawRect(50-i,45,1,1,1);
+        lcd.drawRect(52-i,45,1,1,1);
+        lcd.drawRect(54-i,45,1,1,1);
+        lcd.drawRect(56-i,45,1,1,1);
+        lcd.drawRect(58-i,45,1,1,1);
+        lcd.drawRect(60-i,45,1,1,1);
+        lcd.drawRect(62-i,45,1,1,1);
+        lcd.drawRect(64-i,45,1,1,1);
+        lcd.drawRect(66-i,45,1,1,1);
+        lcd.drawRect(68-i,45,1,1,1);
+        lcd.drawRect(70-i,45,1,1,1);
+        lcd.drawRect(72-i,45,1,1,1);
+        lcd.drawRect(74-i,45,1,1,1);
+        lcd.drawRect(76-i,45,1,1,1);
+        lcd.drawRect(78-i,45,1,1,1);
+        lcd.drawRect(80-i,45,1,1,1);
         wait(0.5);
-        lcd.printString("Your Score is",0,0);
-      
-        }
-        
-void snakeModel(){
-        lcd.drawRect(24,21,1,1,1);
-        lcd.drawRect(26,21,1,1,1);
-        lcd.drawRect(28,21,1,1,1);
-        
-        lcd.drawRect(22,23,1,1,1);
-        lcd.drawRect(24,23,1,1,1);
-        lcd.drawRect(26,23,1,1,1);
-        lcd.drawRect(28,23,1,1,1);
-        
-        lcd.drawRect(20,25,1,1,1);  
-        lcd.drawRect(22,25,1,1,1);
-        lcd.drawRect(24,25,1,1,1);
-        lcd.drawRect(26,25,1,1,1);
-        lcd.drawRect(28,25,1,1,1);
-        lcd.drawRect(30,25,1,1,1);
-        
-        lcd.drawRect(20,27,1,1,1);  
-        lcd.drawRect(22,27,1,1,1);
-        lcd.drawRect(24,27,1,1,1);
-        lcd.drawRect(26,27,1,1,1);
-        lcd.drawRect(28,27,1,1,1);
-        lcd.drawRect(30,27,1,1,1);//head
-        
-        lcd.drawRect(18,29,1,1,0); //tougue
-        lcd.drawRect(20,31,1,1,0);  
-        
-        lcd.drawRect(26,29,1,1,1);
-        lcd.drawRect(28,29,1,1,1);
-        lcd.drawRect(30,29,1,1,1);
-        
-        lcd.drawRect(26,31,1,1,1);
-        lcd.drawRect(28,31,1,1,1);
-        lcd.drawRect(30,31,1,1,1);
-        
-        lcd.drawRect(24,33,1,1,1);
-        lcd.drawRect(26,33,1,1,1);
-        lcd.drawRect(28,33,1,1,1);
-        
-        lcd.drawRect(24,35,1,1,1);
-        lcd.drawRect(26,35,1,1,1);
-        lcd.drawRect(28,35,1,1,1);
-        
-        lcd.drawRect(22,37,1,1,1);
-        lcd.drawRect(24,37,1,1,1);
-        lcd.drawRect(26,37,1,1,1);
-        
-        lcd.drawRect(22,39,1,1,1);
-        lcd.drawRect(24,39,1,1,1);
-        lcd.drawRect(26,39,1,1,1);
-        
-        lcd.drawRect(24,41,1,1,1);
-        lcd.drawRect(26,41,1,1,1);
-        lcd.drawRect(28,41,1,1,1);
-        lcd.drawRect(30,41,1,1,1);//neck
-        
-        lcd.drawRect(60,41,1,1,1);//tail
-        lcd.drawRect(62,41,1,1,1);
-        lcd.drawRect(64,41,1,1,1);
-        
-        lcd.drawRect(62,39,1,1,1);
-        lcd.drawRect(64,39,1,1,1);
-        
-        lcd.drawRect(62,37,1,1,1);
-        
-        lcd.drawRect(60,35,1,1,1);//tail
-        
-        lcd.drawRect(26,43,1,1,1);
-        lcd.drawRect(28,43,1,1,1);
-        lcd.drawRect(30,43,1,1,1);
-        lcd.drawRect(32,43,1,1,1);
-        lcd.drawRect(34,43,1,1,1);
-        lcd.drawRect(36,43,1,1,1);
-        lcd.drawRect(38,43,1,1,1);
-        lcd.drawRect(40,43,1,1,1);
-        lcd.drawRect(42,43,1,1,1);
-        lcd.drawRect(44,43,1,1,1);
-        lcd.drawRect(46,43,1,1,1);
-        lcd.drawRect(48,43,1,1,1);
-        lcd.drawRect(50,43,1,1,1);
-        lcd.drawRect(52,43,1,1,1);
-        lcd.drawRect(54,43,1,1,1);
-        lcd.drawRect(56,43,1,1,1);
-        lcd.drawRect(58,43,1,1,1);
-        lcd.drawRect(60,43,1,1,1);
-        lcd.drawRect(62,43,1,1,1);
-        
-        lcd.drawRect(28,45,1,1,1);
-        lcd.drawRect(30,45,1,1,1);
-        lcd.drawRect(32,45,1,1,1);
-        lcd.drawRect(34,45,1,1,1);
-        lcd.drawRect(36,45,1,1,1);
-        lcd.drawRect(38,45,1,1,1);
-        lcd.drawRect(40,45,1,1,1);
-        lcd.drawRect(42,45,1,1,1);
-        lcd.drawRect(44,45,1,1,1);
-        lcd.drawRect(46,45,1,1,1);
-        lcd.drawRect(48,45,1,1,1);
-        lcd.drawRect(50,45,1,1,1);
-        lcd.drawRect(52,45,1,1,1);
-        lcd.drawRect(54,45,1,1,1);
-        lcd.drawRect(56,45,1,1,1);
-        lcd.drawRect(58,45,1,1,1);
-        lcd.drawRect(60,45,1,1,1);
-        
+        //lcd.refresh();
     }
+
+}
 //switch(snake.direction)
 //{
 // case RIGHT:snake.X[0]+=1;
@@ -413,7 +409,7 @@
         //LED1
         if(snake.snakeX[0]<1) {
             snake.snakeX[0]=1;
-            
+
         }//will stop at the top edge
 
     }
@@ -438,12 +434,12 @@
         }//will stop at the right edge
 
     }
-    if(snake.direction == CENTRE){
+    if(snake.direction == CENTRE) {
         snake.snakeX[0]+=1;
-        }
-    if(snake.direction == UNKNOWN){
+    }
+    if(snake.direction == UNKNOWN) {
         snake.snakeX[0]+=1;
-        }
+    }
 }
 
 
@@ -458,57 +454,75 @@
     lcd.refresh();
     initNut();
     initSnake();
-    timer.attach(&timerExpired,0.05);
-    //buzzer.period(0.020);   // a 20ms period
-    //buttonA.rise(&buttonAPressed);      
-
+    button.rise(&buttonPressed);
+    buttonA.mode(PullDown);
+    //pauseGame();
     //printScore();
 
 //infinite while loop
     while(1) {
-       
-       if(buttonFlag==1){
+
+        if(buttonFlag==0) { //joystick button unpressed
+            lcd.printString("Press to start",1,1);
+            snakeModel();
+        } else {
+
+            leds = 0;
+
+            if(buttonA) { // if button pressed, toggle pause
+                wait_ms(50);
+                pause = !pause;
+                leds = 15;
+            }
+
+            while(pause) {
+                leds = 3;
+                if(buttonA) { // if button pressed, toggle pause
+                    wait_ms(50);
+                    pause = 0;
+                    leds = 1;
+
+                }
+            }
+        }
+
+
         lcd.clear();
-        buttonFlag=0;
         lifeFlag=0;
         updateSnake();
         drawSnake();
         drawNut();
         moveSnake();
         startGmae();
-        pauseGame();
-                if (buttonFlag==1){
-               while(1){
-                buttonFlag =0;
-               if(buttonFlag ==1)
-               break;
-               }
-               }
-          if(lifeFlag==1){
-             lcd.clear();
-             lcd.refresh();
-             printScore();
-             //for(int i=0; i<=11; i++){ 
-              // buzzer.period(1/(frequency[i])); // set PWM period
-              // buzzer=0.1; // set duty cycle
-             // wait(0.5*beat[i]);
-               //}
-             lifeFlag=0;
-             wait(1);
-           }
-//        if (buttonFlag==1){
-//              while(1){
-//               buttonFlag =0;
-//               if(buttonFlag ==1)
-//               break;
-//               }
-//               }
-               lcd.refresh();
-               wait(0.02);      
-            }             
-       else 
-       lcd.printString("Press to start",1,1);
-       snakeModel();
-       }
+        lcd.refresh();
+        wait(0.08);
+        //pauseGame();
+        //if (buttonFlag==1){
+        //while(1){
+        // buttonFlag =0;
+        //if(buttonFlag ==1)
+        // break;
+        //}
+        // }
+        if(lifeFlag==1) {
+            lcd.clear();
+            lcd.refresh();
+            printScore();
+            for(int i=0; i<=11; i++) {
+                buzzer.period(1/(frequency[i])); // set PWM period
+                buzzer=0.1; // set duty cycle
+                wait(0.5*beat[i]);
+            }
+        }
+
+
+        if (buttonFlag==1) {
+            lifeFlag =0;
+        }
+
+
+    }
+
+
 }