27

Dependencies:   N5110

Revision:
1:48a028c4089e
Parent:
0:ef959ad27a16
Child:
2:9a31febe6d2f
--- a/Monster/monster.cpp	Thu Apr 08 02:09:25 2021 +0000
+++ b/Monster/monster.cpp	Fri Apr 09 06:34:43 2021 +0000
@@ -1,8 +1,14 @@
 #include "monster.h"
 
 Monster::Monster() {}
-
-void Monster::monster_main(N5110 &lcd, DigitalIn &button_A, DigitalIn &button_B, DigitalIn &button_C, DigitalIn &button_D) {
+/*
+void Monster::monster_main(N5110 &lcd, DigitalIn &button_A, DigitalIn &button_B, DigitalIn &button_C, DigitalIn &button_D,
+                           DigitalOut led1, DigitalOut led2, DigitalOut led3) {
+    
+}
+*/
+void Monster::monster_main(N5110 &lcd, DigitalIn &button_A, DigitalIn &button_B, DigitalIn &button_C, DigitalIn &button_D,
+                           DigitalOut led1, DigitalOut led2, DigitalOut led3) {
     
     //设置人物初始位置
     monster_x0 = 4;
@@ -22,13 +28,14 @@
     turn3 = 0;
     
     //开启宝石
-    jewels_on1 = 1;
-    jewels_on2 = 1;
-    jewels_on3 = 1;
-    jewels_on4 = 1;
-    jewels_on5 = 1;
-    jewels_on6 = 1;
-    jewels_on7 = 1;
+    int temp_jewels_x[7] = {41,46,2,7,12,38,43};
+    int temp_jewels_y[7] = {21,21,39,39,39,36,36};
+    
+    for (int i=0; i<7; i++) {
+        jewels_on[i] = 1;
+        jewels_x[i] = temp_jewels_x[i];
+        jewels_y[i] = temp_jewels_y[i];
+    }
     
     while(1) {
         
@@ -36,7 +43,6 @@
         
         //画背景
         this->drawbackground1(lcd);
-        this->drawlifes(lcd);
         this->drawscores(lcd);
         
         //画宝石和反派
@@ -46,11 +52,28 @@
         //画人物
         this->draw_monster(lcd, button_A, button_B, button_C, button_D);
         
+        //失去生命
+        this->loss_life(lcd);
+        
+        //画生命
+        this->drawlifes(lcd, led1, led2, led3);
+        
         lcd.refresh();
+        
+        if (monster_x0 >84) {
+            this->monster_main(lcd, button_A, button_B, button_C, button_D, led1, led2, led3);   
+        }
+        
+        if (lifes <= 0) {
+            break;
+        }
     
-        thread_sleep_for(20);
-        
+        thread_sleep_for(15); 
     }
+    
+    //游戏结束
+    this->game_over(lcd,button_A);
+    
 }
 
 
@@ -64,13 +87,39 @@
        
 }
 
-void Monster::drawlifes(N5110 &lcd) {
+//画生命
+void Monster::drawlifes(N5110 &lcd, DigitalOut led1, DigitalOut led2, DigitalOut led3) {
     
     for(int i=1; i<=lifes; i++) {
         
         lcd.drawSprite(7*i-4,2,4,5,(int *)shapHeart);
         
     }
+    switch (lifes) {
+     case 3:
+        led1 = 1;
+        led2 = 1;
+        led3 = 1;
+        break;
+        
+    case 2: 
+        led1 = 1;
+        led2 = 1;
+        led3 = 0;
+        break;
+        
+    case 1: 
+        led1 = 1;
+        led2 = 0;
+        led3 = 0;
+        break;
+        
+    default:
+        led1 = 0;
+        led2 = 0;
+        led3 = 0;
+        break;
+    }
     
 }
 
@@ -160,30 +209,13 @@
 //画宝石
 void Monster::draw_jewels(N5110 &lcd) {
     
-    if (jewels_on1 == 1) {
-        lcd.drawSprite(41,21,3,3,(int *)shapStar);
-    }
-    if (jewels_on2 == 1) {
-        lcd.drawSprite(46,21,3,3,(int *)shapStar);
-    }
-    
-    if (jewels_on3 == 1) {
-        lcd.drawSprite(2,39,3,3,(int *)shapStar);
+    for (int i=0; i<7; i++) {
+        
+        if (jewels_on[i] == 1) {
+             lcd.drawSprite(jewels_x[i],jewels_y[i],3,3,(int *)shapStar);
+        }
+          
     }
-    if (jewels_on4 == 1) {
-        lcd.drawSprite(7,39,3,3,(int *)shapStar);
-    }
-    if (jewels_on5 == 1) {
-        lcd.drawSprite(12,39,3,3,(int *)shapStar);
-    }
-    
-    if (jewels_on6 == 1) {
-        lcd.drawSprite(38,36,3,3,(int *)shapStar);
-    }
-    if (jewels_on7 == 1) {
-        lcd.drawSprite(43,36,3,3,(int *)shapStar);
-    }
-    
        
 }
 
@@ -205,7 +237,7 @@
     
     //向右超出
     if (monster_x0 > 84) {
-       
+       level += 1;
     }
     //向左限定
     if (monster_x0 < 0) {
@@ -219,14 +251,77 @@
     if (monster_y0 > 37) {
         monster_y0 = 37;   
     }
-    
+    //障碍限定
     if (monster_x0 > 20 && monster_x0 < 56 && monster_y0 > 33) {
         monster_y0 = 33;   
     }
     
+    if (monster_x0 > 16 && monster_x0 < 49) {
+        if (monster_y0 > 19 && monster_y0 < 29) {
+            monster_y0 = 19;   
+        }
+        if (monster_y0 == 29) {
+            monster_y0 = 30;
+        }
+    }
+    
+    
     lcd.drawSprite(monster_x0,monster_y0,6,7,(int *)whiteMonster);
     
-    if (abs(monster_x0-41+2) <= 4 
+    //是否碰到宝石
+    for (int i=0; i<7; i++) {
+        if (abs(monster_x0-jewels_x[i]+2) <= 4 && abs(monster_y0-jewels_y[i]+2) <= 4) {
+            score += 1;
+            jewels_x[i] = 100;
+            jewels_y[i] = 100;   
+        }
+    }   
+}
+//失去生命
+void Monster::loss_life(N5110 &lcd) {
+    
+    if (abs(monster_x0-monster_x1) < 7 && abs(monster_y0-monster_y1) < 6) {
+        lifes -= 1;
+        turn1 = 0;
+        monster_x1 = 100;
+        monster_y1 = 100;
+        thread_sleep_for(100);
+    }
+    else if (abs(monster_x0-monster_x2) < 7 && abs(monster_y0-monster_y2) < 6) {
+        lifes -= 1;
+        turn1 = 0;
+        monster_x2 = 100;
+        monster_y2 = 100;
+        thread_sleep_for(100);
+    }
+    else if (abs(monster_x0-monster_x3) < 7 && abs(monster_y0-monster_y3) < 6) {
+        lifes -= 1;
+        turn1 = 0;
+        monster_x3 = 100;
+        monster_y3 = 100;
+        thread_sleep_for(100);
+    }
+}
+
+//游戏结束
+void Monster::game_over(N5110 &lcd, DigitalIn &button_A) {
+    
+    //最高分数
+    if (score > best_score) {
+        best_score = score;
+    }
+    
+    //结束界面
+    thread_sleep_for(100);
+    lcd.clear();
+    lcd.printString("GAME OVER",16,1);
+    lcd.printString("PRESS A    OUT",0,5);
+    lcd.refresh();
+    
+    while (button_A == 0) {
+        
+    }
+    main();
        
 }