27

Dependencies:   N5110

Monster/monster.cpp

Committer:
cbs27
Date:
2021-04-09
Revision:
1:48a028c4089e
Parent:
0:ef959ad27a16
Child:
2:9a31febe6d2f

File content as of revision 1:48a028c4089e:

#include "monster.h"

Monster::Monster() {}
/*
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;
    monster_y0 = 19;
    
    //设置反派位置
    monster_x1 = 23;
    monster_y1 = 19;
    turn1 = 0;
    
    monster_x2 = 18;
    monster_y2 = 37;
    turn2 = 0;
    
    monster_x3 = 68;
    monster_y3 = 37;
    turn3 = 0;
    
    //开启宝石
    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) {
        
        lcd.clear();
        
        //画背景
        this->drawbackground1(lcd);
        this->drawscores(lcd);
        
        //画宝石和反派
        this->draw_jewels(lcd);
        this->draw_blackmonsters(lcd);
        
        //画人物
        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(15); 
    }
    
    //游戏结束
    this->game_over(lcd,button_A);
    
}


void Monster::drawbackground1(N5110 &lcd) {
    
    lcd.drawLine(0,8,84,8,2);
    lcd.drawRect(23,26,26,4,FILL_BLACK);
    lcd.drawRect(0,44,84,4,FILL_BLACK);
    lcd.drawRect(28,40,26,4,FILL_BLACK);
    lcd.drawRect(67,22,17,11,FILL_TRANSPARENT);
       
}

//画生命
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;
    }
    
}

void Monster::drawscores(N5110 &lcd) {
    
    char score_buffer[14];
    sprintf(score_buffer,"%d",score);
    lcd.printString(score_buffer,60,0);
    
}

//画反派
void Monster::draw_blackmonsters(N5110 &lcd) {
    
    
    //画反派1
    if (turn1 == 0) {
        
        monster_x1 += 1;
        lcd.drawSprite(monster_x1,monster_y1,7,7,(int *)blackMonster);
        
        if (monster_x1 >= 43) {
           turn1 = 1;
        }
           
    }
    
    if (turn1 == 1) {
        
        monster_x1 -= 1;
        lcd.drawSprite(monster_x1,monster_y1,7,7,(int *)blackMonster);
        
        if (monster_x1 <= 23) {
           turn1 = 0;
        }
           
    }
    
    //画反派2
    if (turn2 == 0) {
        
        monster_x2 += 1;
        lcd.drawSprite(monster_x2,monster_y2,7,7,(int *)blackMonster);
        
        if (monster_x2 >= 20) {
           turn2 = 1;
        }
           
    }
    
    if (turn2 == 1) {
        
        monster_x2 -= 1;
        lcd.drawSprite(monster_x2,monster_y2,7,7,(int *)blackMonster);
        
        if (monster_x2 <= 1) {
           turn2 = 0;
        }
           
    }
    
    //画反派3
    if (turn3 == 0) {
        
        monster_x3 += 1;
        lcd.drawSprite(monster_x3,monster_y3,7,7,(int *)blackMonster);
        
        if (monster_x3 >= 75) {
           turn3 = 1;
        }
           
    }
    
    if (turn3 == 1) {
        
        monster_x3 -= 1;
        lcd.drawSprite(monster_x3,monster_y3,7,7,(int *)blackMonster);
        
        if (monster_x3 <= 56) {
           turn3 = 0;
        }
           
    }
    
}

//画宝石
void Monster::draw_jewels(N5110 &lcd) {
    
    for (int i=0; i<7; i++) {
        
        if (jewels_on[i] == 1) {
             lcd.drawSprite(jewels_x[i],jewels_y[i],3,3,(int *)shapStar);
        }
          
    }
       
}

//画人物
void Monster::draw_monster(N5110 &lcd, DigitalIn &button_A, DigitalIn &button_B, DigitalIn &button_C, DigitalIn &button_D) {
    
    if (button_A.read() == 1) {
        monster_x0 += 1;  
    }
    else if (button_B.read() == 1) {
        monster_y0 -= 1;  
    }
    else if (button_C.read() == 1) {
        monster_x0 -= 1;  
    }
    else if (button_D.read() == 1) {
        monster_y0 += 1;  
    }
    
    //向右超出
    if (monster_x0 > 84) {
       level += 1;
    }
    //向左限定
    if (monster_x0 < 0) {
       monster_x0 = 0;
    }
    //向上限定
    if (monster_y0 < 9) {
       monster_y0 = 9;
    }
    //向下限定
    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);
    
    //是否碰到宝石
    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();
       
}