27

Dependencies:   N5110

Committer:
cbs27
Date:
Fri Apr 09 06:34:43 2021 +0000
Revision:
1:48a028c4089e
Parent:
0:ef959ad27a16
Child:
2:9a31febe6d2f
..;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cbs27 0:ef959ad27a16 1 #include "monster.h"
cbs27 0:ef959ad27a16 2
cbs27 0:ef959ad27a16 3 Monster::Monster() {}
cbs27 1:48a028c4089e 4 /*
cbs27 1:48a028c4089e 5 void Monster::monster_main(N5110 &lcd, DigitalIn &button_A, DigitalIn &button_B, DigitalIn &button_C, DigitalIn &button_D,
cbs27 1:48a028c4089e 6 DigitalOut led1, DigitalOut led2, DigitalOut led3) {
cbs27 1:48a028c4089e 7
cbs27 1:48a028c4089e 8 }
cbs27 1:48a028c4089e 9 */
cbs27 1:48a028c4089e 10 void Monster::monster_main(N5110 &lcd, DigitalIn &button_A, DigitalIn &button_B, DigitalIn &button_C, DigitalIn &button_D,
cbs27 1:48a028c4089e 11 DigitalOut led1, DigitalOut led2, DigitalOut led3) {
cbs27 0:ef959ad27a16 12
cbs27 0:ef959ad27a16 13 //设置人物初始位置
cbs27 0:ef959ad27a16 14 monster_x0 = 4;
cbs27 0:ef959ad27a16 15 monster_y0 = 19;
cbs27 0:ef959ad27a16 16
cbs27 0:ef959ad27a16 17 //设置反派位置
cbs27 0:ef959ad27a16 18 monster_x1 = 23;
cbs27 0:ef959ad27a16 19 monster_y1 = 19;
cbs27 0:ef959ad27a16 20 turn1 = 0;
cbs27 0:ef959ad27a16 21
cbs27 0:ef959ad27a16 22 monster_x2 = 18;
cbs27 0:ef959ad27a16 23 monster_y2 = 37;
cbs27 0:ef959ad27a16 24 turn2 = 0;
cbs27 0:ef959ad27a16 25
cbs27 0:ef959ad27a16 26 monster_x3 = 68;
cbs27 0:ef959ad27a16 27 monster_y3 = 37;
cbs27 0:ef959ad27a16 28 turn3 = 0;
cbs27 0:ef959ad27a16 29
cbs27 0:ef959ad27a16 30 //开启宝石
cbs27 1:48a028c4089e 31 int temp_jewels_x[7] = {41,46,2,7,12,38,43};
cbs27 1:48a028c4089e 32 int temp_jewels_y[7] = {21,21,39,39,39,36,36};
cbs27 1:48a028c4089e 33
cbs27 1:48a028c4089e 34 for (int i=0; i<7; i++) {
cbs27 1:48a028c4089e 35 jewels_on[i] = 1;
cbs27 1:48a028c4089e 36 jewels_x[i] = temp_jewels_x[i];
cbs27 1:48a028c4089e 37 jewels_y[i] = temp_jewels_y[i];
cbs27 1:48a028c4089e 38 }
cbs27 0:ef959ad27a16 39
cbs27 0:ef959ad27a16 40 while(1) {
cbs27 0:ef959ad27a16 41
cbs27 0:ef959ad27a16 42 lcd.clear();
cbs27 0:ef959ad27a16 43
cbs27 0:ef959ad27a16 44 //画背景
cbs27 0:ef959ad27a16 45 this->drawbackground1(lcd);
cbs27 0:ef959ad27a16 46 this->drawscores(lcd);
cbs27 0:ef959ad27a16 47
cbs27 0:ef959ad27a16 48 //画宝石和反派
cbs27 0:ef959ad27a16 49 this->draw_jewels(lcd);
cbs27 0:ef959ad27a16 50 this->draw_blackmonsters(lcd);
cbs27 0:ef959ad27a16 51
cbs27 0:ef959ad27a16 52 //画人物
cbs27 0:ef959ad27a16 53 this->draw_monster(lcd, button_A, button_B, button_C, button_D);
cbs27 0:ef959ad27a16 54
cbs27 1:48a028c4089e 55 //失去生命
cbs27 1:48a028c4089e 56 this->loss_life(lcd);
cbs27 1:48a028c4089e 57
cbs27 1:48a028c4089e 58 //画生命
cbs27 1:48a028c4089e 59 this->drawlifes(lcd, led1, led2, led3);
cbs27 1:48a028c4089e 60
cbs27 0:ef959ad27a16 61 lcd.refresh();
cbs27 1:48a028c4089e 62
cbs27 1:48a028c4089e 63 if (monster_x0 >84) {
cbs27 1:48a028c4089e 64 this->monster_main(lcd, button_A, button_B, button_C, button_D, led1, led2, led3);
cbs27 1:48a028c4089e 65 }
cbs27 1:48a028c4089e 66
cbs27 1:48a028c4089e 67 if (lifes <= 0) {
cbs27 1:48a028c4089e 68 break;
cbs27 1:48a028c4089e 69 }
cbs27 0:ef959ad27a16 70
cbs27 1:48a028c4089e 71 thread_sleep_for(15);
cbs27 0:ef959ad27a16 72 }
cbs27 1:48a028c4089e 73
cbs27 1:48a028c4089e 74 //游戏结束
cbs27 1:48a028c4089e 75 this->game_over(lcd,button_A);
cbs27 1:48a028c4089e 76
cbs27 0:ef959ad27a16 77 }
cbs27 0:ef959ad27a16 78
cbs27 0:ef959ad27a16 79
cbs27 0:ef959ad27a16 80 void Monster::drawbackground1(N5110 &lcd) {
cbs27 0:ef959ad27a16 81
cbs27 0:ef959ad27a16 82 lcd.drawLine(0,8,84,8,2);
cbs27 0:ef959ad27a16 83 lcd.drawRect(23,26,26,4,FILL_BLACK);
cbs27 0:ef959ad27a16 84 lcd.drawRect(0,44,84,4,FILL_BLACK);
cbs27 0:ef959ad27a16 85 lcd.drawRect(28,40,26,4,FILL_BLACK);
cbs27 0:ef959ad27a16 86 lcd.drawRect(67,22,17,11,FILL_TRANSPARENT);
cbs27 0:ef959ad27a16 87
cbs27 0:ef959ad27a16 88 }
cbs27 0:ef959ad27a16 89
cbs27 1:48a028c4089e 90 //画生命
cbs27 1:48a028c4089e 91 void Monster::drawlifes(N5110 &lcd, DigitalOut led1, DigitalOut led2, DigitalOut led3) {
cbs27 0:ef959ad27a16 92
cbs27 0:ef959ad27a16 93 for(int i=1; i<=lifes; i++) {
cbs27 0:ef959ad27a16 94
cbs27 0:ef959ad27a16 95 lcd.drawSprite(7*i-4,2,4,5,(int *)shapHeart);
cbs27 0:ef959ad27a16 96
cbs27 0:ef959ad27a16 97 }
cbs27 1:48a028c4089e 98 switch (lifes) {
cbs27 1:48a028c4089e 99 case 3:
cbs27 1:48a028c4089e 100 led1 = 1;
cbs27 1:48a028c4089e 101 led2 = 1;
cbs27 1:48a028c4089e 102 led3 = 1;
cbs27 1:48a028c4089e 103 break;
cbs27 1:48a028c4089e 104
cbs27 1:48a028c4089e 105 case 2:
cbs27 1:48a028c4089e 106 led1 = 1;
cbs27 1:48a028c4089e 107 led2 = 1;
cbs27 1:48a028c4089e 108 led3 = 0;
cbs27 1:48a028c4089e 109 break;
cbs27 1:48a028c4089e 110
cbs27 1:48a028c4089e 111 case 1:
cbs27 1:48a028c4089e 112 led1 = 1;
cbs27 1:48a028c4089e 113 led2 = 0;
cbs27 1:48a028c4089e 114 led3 = 0;
cbs27 1:48a028c4089e 115 break;
cbs27 1:48a028c4089e 116
cbs27 1:48a028c4089e 117 default:
cbs27 1:48a028c4089e 118 led1 = 0;
cbs27 1:48a028c4089e 119 led2 = 0;
cbs27 1:48a028c4089e 120 led3 = 0;
cbs27 1:48a028c4089e 121 break;
cbs27 1:48a028c4089e 122 }
cbs27 0:ef959ad27a16 123
cbs27 0:ef959ad27a16 124 }
cbs27 0:ef959ad27a16 125
cbs27 0:ef959ad27a16 126 void Monster::drawscores(N5110 &lcd) {
cbs27 0:ef959ad27a16 127
cbs27 0:ef959ad27a16 128 char score_buffer[14];
cbs27 0:ef959ad27a16 129 sprintf(score_buffer,"%d",score);
cbs27 0:ef959ad27a16 130 lcd.printString(score_buffer,60,0);
cbs27 0:ef959ad27a16 131
cbs27 0:ef959ad27a16 132 }
cbs27 0:ef959ad27a16 133
cbs27 0:ef959ad27a16 134 //画反派
cbs27 0:ef959ad27a16 135 void Monster::draw_blackmonsters(N5110 &lcd) {
cbs27 0:ef959ad27a16 136
cbs27 0:ef959ad27a16 137
cbs27 0:ef959ad27a16 138 //画反派1
cbs27 0:ef959ad27a16 139 if (turn1 == 0) {
cbs27 0:ef959ad27a16 140
cbs27 0:ef959ad27a16 141 monster_x1 += 1;
cbs27 0:ef959ad27a16 142 lcd.drawSprite(monster_x1,monster_y1,7,7,(int *)blackMonster);
cbs27 0:ef959ad27a16 143
cbs27 0:ef959ad27a16 144 if (monster_x1 >= 43) {
cbs27 0:ef959ad27a16 145 turn1 = 1;
cbs27 0:ef959ad27a16 146 }
cbs27 0:ef959ad27a16 147
cbs27 0:ef959ad27a16 148 }
cbs27 0:ef959ad27a16 149
cbs27 0:ef959ad27a16 150 if (turn1 == 1) {
cbs27 0:ef959ad27a16 151
cbs27 0:ef959ad27a16 152 monster_x1 -= 1;
cbs27 0:ef959ad27a16 153 lcd.drawSprite(monster_x1,monster_y1,7,7,(int *)blackMonster);
cbs27 0:ef959ad27a16 154
cbs27 0:ef959ad27a16 155 if (monster_x1 <= 23) {
cbs27 0:ef959ad27a16 156 turn1 = 0;
cbs27 0:ef959ad27a16 157 }
cbs27 0:ef959ad27a16 158
cbs27 0:ef959ad27a16 159 }
cbs27 0:ef959ad27a16 160
cbs27 0:ef959ad27a16 161 //画反派2
cbs27 0:ef959ad27a16 162 if (turn2 == 0) {
cbs27 0:ef959ad27a16 163
cbs27 0:ef959ad27a16 164 monster_x2 += 1;
cbs27 0:ef959ad27a16 165 lcd.drawSprite(monster_x2,monster_y2,7,7,(int *)blackMonster);
cbs27 0:ef959ad27a16 166
cbs27 0:ef959ad27a16 167 if (monster_x2 >= 20) {
cbs27 0:ef959ad27a16 168 turn2 = 1;
cbs27 0:ef959ad27a16 169 }
cbs27 0:ef959ad27a16 170
cbs27 0:ef959ad27a16 171 }
cbs27 0:ef959ad27a16 172
cbs27 0:ef959ad27a16 173 if (turn2 == 1) {
cbs27 0:ef959ad27a16 174
cbs27 0:ef959ad27a16 175 monster_x2 -= 1;
cbs27 0:ef959ad27a16 176 lcd.drawSprite(monster_x2,monster_y2,7,7,(int *)blackMonster);
cbs27 0:ef959ad27a16 177
cbs27 0:ef959ad27a16 178 if (monster_x2 <= 1) {
cbs27 0:ef959ad27a16 179 turn2 = 0;
cbs27 0:ef959ad27a16 180 }
cbs27 0:ef959ad27a16 181
cbs27 0:ef959ad27a16 182 }
cbs27 0:ef959ad27a16 183
cbs27 0:ef959ad27a16 184 //画反派3
cbs27 0:ef959ad27a16 185 if (turn3 == 0) {
cbs27 0:ef959ad27a16 186
cbs27 0:ef959ad27a16 187 monster_x3 += 1;
cbs27 0:ef959ad27a16 188 lcd.drawSprite(monster_x3,monster_y3,7,7,(int *)blackMonster);
cbs27 0:ef959ad27a16 189
cbs27 0:ef959ad27a16 190 if (monster_x3 >= 75) {
cbs27 0:ef959ad27a16 191 turn3 = 1;
cbs27 0:ef959ad27a16 192 }
cbs27 0:ef959ad27a16 193
cbs27 0:ef959ad27a16 194 }
cbs27 0:ef959ad27a16 195
cbs27 0:ef959ad27a16 196 if (turn3 == 1) {
cbs27 0:ef959ad27a16 197
cbs27 0:ef959ad27a16 198 monster_x3 -= 1;
cbs27 0:ef959ad27a16 199 lcd.drawSprite(monster_x3,monster_y3,7,7,(int *)blackMonster);
cbs27 0:ef959ad27a16 200
cbs27 0:ef959ad27a16 201 if (monster_x3 <= 56) {
cbs27 0:ef959ad27a16 202 turn3 = 0;
cbs27 0:ef959ad27a16 203 }
cbs27 0:ef959ad27a16 204
cbs27 0:ef959ad27a16 205 }
cbs27 0:ef959ad27a16 206
cbs27 0:ef959ad27a16 207 }
cbs27 0:ef959ad27a16 208
cbs27 0:ef959ad27a16 209 //画宝石
cbs27 0:ef959ad27a16 210 void Monster::draw_jewels(N5110 &lcd) {
cbs27 0:ef959ad27a16 211
cbs27 1:48a028c4089e 212 for (int i=0; i<7; i++) {
cbs27 1:48a028c4089e 213
cbs27 1:48a028c4089e 214 if (jewels_on[i] == 1) {
cbs27 1:48a028c4089e 215 lcd.drawSprite(jewels_x[i],jewels_y[i],3,3,(int *)shapStar);
cbs27 1:48a028c4089e 216 }
cbs27 1:48a028c4089e 217
cbs27 0:ef959ad27a16 218 }
cbs27 0:ef959ad27a16 219
cbs27 0:ef959ad27a16 220 }
cbs27 0:ef959ad27a16 221
cbs27 0:ef959ad27a16 222 //画人物
cbs27 0:ef959ad27a16 223 void Monster::draw_monster(N5110 &lcd, DigitalIn &button_A, DigitalIn &button_B, DigitalIn &button_C, DigitalIn &button_D) {
cbs27 0:ef959ad27a16 224
cbs27 0:ef959ad27a16 225 if (button_A.read() == 1) {
cbs27 0:ef959ad27a16 226 monster_x0 += 1;
cbs27 0:ef959ad27a16 227 }
cbs27 0:ef959ad27a16 228 else if (button_B.read() == 1) {
cbs27 0:ef959ad27a16 229 monster_y0 -= 1;
cbs27 0:ef959ad27a16 230 }
cbs27 0:ef959ad27a16 231 else if (button_C.read() == 1) {
cbs27 0:ef959ad27a16 232 monster_x0 -= 1;
cbs27 0:ef959ad27a16 233 }
cbs27 0:ef959ad27a16 234 else if (button_D.read() == 1) {
cbs27 0:ef959ad27a16 235 monster_y0 += 1;
cbs27 0:ef959ad27a16 236 }
cbs27 0:ef959ad27a16 237
cbs27 0:ef959ad27a16 238 //向右超出
cbs27 0:ef959ad27a16 239 if (monster_x0 > 84) {
cbs27 1:48a028c4089e 240 level += 1;
cbs27 0:ef959ad27a16 241 }
cbs27 0:ef959ad27a16 242 //向左限定
cbs27 0:ef959ad27a16 243 if (monster_x0 < 0) {
cbs27 0:ef959ad27a16 244 monster_x0 = 0;
cbs27 0:ef959ad27a16 245 }
cbs27 0:ef959ad27a16 246 //向上限定
cbs27 0:ef959ad27a16 247 if (monster_y0 < 9) {
cbs27 0:ef959ad27a16 248 monster_y0 = 9;
cbs27 0:ef959ad27a16 249 }
cbs27 0:ef959ad27a16 250 //向下限定
cbs27 0:ef959ad27a16 251 if (monster_y0 > 37) {
cbs27 0:ef959ad27a16 252 monster_y0 = 37;
cbs27 0:ef959ad27a16 253 }
cbs27 1:48a028c4089e 254 //障碍限定
cbs27 0:ef959ad27a16 255 if (monster_x0 > 20 && monster_x0 < 56 && monster_y0 > 33) {
cbs27 0:ef959ad27a16 256 monster_y0 = 33;
cbs27 0:ef959ad27a16 257 }
cbs27 0:ef959ad27a16 258
cbs27 1:48a028c4089e 259 if (monster_x0 > 16 && monster_x0 < 49) {
cbs27 1:48a028c4089e 260 if (monster_y0 > 19 && monster_y0 < 29) {
cbs27 1:48a028c4089e 261 monster_y0 = 19;
cbs27 1:48a028c4089e 262 }
cbs27 1:48a028c4089e 263 if (monster_y0 == 29) {
cbs27 1:48a028c4089e 264 monster_y0 = 30;
cbs27 1:48a028c4089e 265 }
cbs27 1:48a028c4089e 266 }
cbs27 1:48a028c4089e 267
cbs27 1:48a028c4089e 268
cbs27 0:ef959ad27a16 269 lcd.drawSprite(monster_x0,monster_y0,6,7,(int *)whiteMonster);
cbs27 0:ef959ad27a16 270
cbs27 1:48a028c4089e 271 //是否碰到宝石
cbs27 1:48a028c4089e 272 for (int i=0; i<7; i++) {
cbs27 1:48a028c4089e 273 if (abs(monster_x0-jewels_x[i]+2) <= 4 && abs(monster_y0-jewels_y[i]+2) <= 4) {
cbs27 1:48a028c4089e 274 score += 1;
cbs27 1:48a028c4089e 275 jewels_x[i] = 100;
cbs27 1:48a028c4089e 276 jewels_y[i] = 100;
cbs27 1:48a028c4089e 277 }
cbs27 1:48a028c4089e 278 }
cbs27 1:48a028c4089e 279 }
cbs27 1:48a028c4089e 280 //失去生命
cbs27 1:48a028c4089e 281 void Monster::loss_life(N5110 &lcd) {
cbs27 1:48a028c4089e 282
cbs27 1:48a028c4089e 283 if (abs(monster_x0-monster_x1) < 7 && abs(monster_y0-monster_y1) < 6) {
cbs27 1:48a028c4089e 284 lifes -= 1;
cbs27 1:48a028c4089e 285 turn1 = 0;
cbs27 1:48a028c4089e 286 monster_x1 = 100;
cbs27 1:48a028c4089e 287 monster_y1 = 100;
cbs27 1:48a028c4089e 288 thread_sleep_for(100);
cbs27 1:48a028c4089e 289 }
cbs27 1:48a028c4089e 290 else if (abs(monster_x0-monster_x2) < 7 && abs(monster_y0-monster_y2) < 6) {
cbs27 1:48a028c4089e 291 lifes -= 1;
cbs27 1:48a028c4089e 292 turn1 = 0;
cbs27 1:48a028c4089e 293 monster_x2 = 100;
cbs27 1:48a028c4089e 294 monster_y2 = 100;
cbs27 1:48a028c4089e 295 thread_sleep_for(100);
cbs27 1:48a028c4089e 296 }
cbs27 1:48a028c4089e 297 else if (abs(monster_x0-monster_x3) < 7 && abs(monster_y0-monster_y3) < 6) {
cbs27 1:48a028c4089e 298 lifes -= 1;
cbs27 1:48a028c4089e 299 turn1 = 0;
cbs27 1:48a028c4089e 300 monster_x3 = 100;
cbs27 1:48a028c4089e 301 monster_y3 = 100;
cbs27 1:48a028c4089e 302 thread_sleep_for(100);
cbs27 1:48a028c4089e 303 }
cbs27 1:48a028c4089e 304 }
cbs27 1:48a028c4089e 305
cbs27 1:48a028c4089e 306 //游戏结束
cbs27 1:48a028c4089e 307 void Monster::game_over(N5110 &lcd, DigitalIn &button_A) {
cbs27 1:48a028c4089e 308
cbs27 1:48a028c4089e 309 //最高分数
cbs27 1:48a028c4089e 310 if (score > best_score) {
cbs27 1:48a028c4089e 311 best_score = score;
cbs27 1:48a028c4089e 312 }
cbs27 1:48a028c4089e 313
cbs27 1:48a028c4089e 314 //结束界面
cbs27 1:48a028c4089e 315 thread_sleep_for(100);
cbs27 1:48a028c4089e 316 lcd.clear();
cbs27 1:48a028c4089e 317 lcd.printString("GAME OVER",16,1);
cbs27 1:48a028c4089e 318 lcd.printString("PRESS A OUT",0,5);
cbs27 1:48a028c4089e 319 lcd.refresh();
cbs27 1:48a028c4089e 320
cbs27 1:48a028c4089e 321 while (button_A == 0) {
cbs27 1:48a028c4089e 322
cbs27 1:48a028c4089e 323 }
cbs27 1:48a028c4089e 324 main();
cbs27 0:ef959ad27a16 325
cbs27 0:ef959ad27a16 326 }
cbs27 0:ef959ad27a16 327
cbs27 0:ef959ad27a16 328