hwang guihoon / Mbed OS poo_dino_game

Dependencies:   C12832 ESP-call

Committer:
guihoon
Date:
Mon Jun 13 00:20:10 2022 +0000
Revision:
2:5b7da2619c44
Parent:
1:f3da75b90f21
project;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
guihoon 0:bbff1149056a 1 #include "Dino.h"
guihoon 0:bbff1149056a 2
guihoon 0:bbff1149056a 3 Mutex dino_mutex;
guihoon 0:bbff1149056a 4
guihoon 2:5b7da2619c44 5 DigitalIn sw_up(D4, PullDown);
guihoon 0:bbff1149056a 6
guihoon 0:bbff1149056a 7 int treeX;
guihoon 0:bbff1149056a 8 int dinoX;
guihoon 0:bbff1149056a 9 int dinoY;
guihoon 0:bbff1149056a 10
guihoon 0:bbff1149056a 11 int dino_tic; //게임 내 시간 단위이자 점수 결정 요소
guihoon 0:bbff1149056a 12 int crash; //충돌 체크
guihoon 0:bbff1149056a 13 int jump_difficulty; //점프 속도와 관련
guihoon 0:bbff1149056a 14 int tree_difficulty; //나무 오는 속도와 관련
guihoon 0:bbff1149056a 15
guihoon 0:bbff1149056a 16 void dino_score(int tic) { //점수 출력
guihoon 0:bbff1149056a 17 dino_mutex.lock();
guihoon 0:bbff1149056a 18 putgoto(45, 1);
guihoon 0:bbff1149056a 19 printf("score : %4d", tic / 5 * 10); // tic/5 당 10점 //필드 폭 4칸 확보 (n천점까지)
guihoon 0:bbff1149056a 20 dino_mutex.unlock();
guihoon 0:bbff1149056a 21 }
guihoon 0:bbff1149056a 22
guihoon 0:bbff1149056a 23 void dino_update_tic() {
guihoon 0:bbff1149056a 24 while(1) {
guihoon 0:bbff1149056a 25 dino_tic++;
guihoon 0:bbff1149056a 26 dino_score(dino_tic);
guihoon 0:bbff1149056a 27 thread_sleep_for(20);
guihoon 0:bbff1149056a 28 }
guihoon 0:bbff1149056a 29 }
guihoon 0:bbff1149056a 30
guihoon 0:bbff1149056a 31 void init_parameter() {
guihoon 0:bbff1149056a 32 treeX = TREE_X;
guihoon 0:bbff1149056a 33 dinoX = DINO_X;
guihoon 0:bbff1149056a 34 dinoY = DINO_Y;
guihoon 0:bbff1149056a 35 dino_tic = 0;
guihoon 0:bbff1149056a 36 crash = 0;
guihoon 0:bbff1149056a 37 jump_difficulty = 1;
guihoon 0:bbff1149056a 38 tree_difficulty = 2;
guihoon 0:bbff1149056a 39 }
guihoon 0:bbff1149056a 40
guihoon 0:bbff1149056a 41
guihoon 0:bbff1149056a 42 void run_dino_thread() {
guihoon 0:bbff1149056a 43 putclear();
guihoon 0:bbff1149056a 44 init_parameter();
guihoon 0:bbff1149056a 45 dino_start();
guihoon 0:bbff1149056a 46 green_led();
guihoon 0:bbff1149056a 47 start_speaker();
guihoon 0:bbff1149056a 48
guihoon 0:bbff1149056a 49 while (1) {
guihoon 0:bbff1149056a 50 dino_tic = game(dino_tic);
guihoon 0:bbff1149056a 51
guihoon 0:bbff1149056a 52 //joystick 위로 올리면 점프
guihoon 0:bbff1149056a 53 if (sw_up==1) {
guihoon 0:bbff1149056a 54 jump();
guihoon 0:bbff1149056a 55 }
guihoon 0:bbff1149056a 56 crash = crashing();
guihoon 0:bbff1149056a 57 if (crash == -1) //충돌 시 탈출
guihoon 0:bbff1149056a 58 break;
guihoon 0:bbff1149056a 59 }
guihoon 0:bbff1149056a 60 popping_led();
guihoon 0:bbff1149056a 61 dino_end_lcd();
guihoon 0:bbff1149056a 62 end(dino_tic);
guihoon 0:bbff1149056a 63 thread_sleep_for(1000);
guihoon 0:bbff1149056a 64 }
guihoon 0:bbff1149056a 65
guihoon 0:bbff1149056a 66 int game(int dino_tic) { //게임화면 메인 요소
guihoon 0:bbff1149056a 67 dino_score(dino_tic);
guihoon 0:bbff1149056a 68 tree();
guihoon 0:bbff1149056a 69 draw_dino(dino_tic);
guihoon 0:bbff1149056a 70
guihoon 0:bbff1149056a 71 thread_sleep_for(20); //0.02초 //딜레이 예상
guihoon 0:bbff1149056a 72 dino_tic ++;
guihoon 0:bbff1149056a 73 return dino_tic;
guihoon 0:bbff1149056a 74 }
guihoon 0:bbff1149056a 75
guihoon 0:bbff1149056a 76 void games(int dino_tic) {
guihoon 0:bbff1149056a 77 tree();
guihoon 0:bbff1149056a 78 draw_dino(dino_tic);
guihoon 0:bbff1149056a 79 }
guihoon 0:bbff1149056a 80
guihoon 0:bbff1149056a 81 void jump() {
guihoon 0:bbff1149056a 82 if (dinoY - 15 == 0) { //'스페이스 바'가 눌리고 공룡이 바닥에 있을 때
guihoon 0:bbff1149056a 83 int h = 0; //점프 높이 초기화
guihoon 0:bbff1149056a 84 while (h < 8) { //y축으로 8칸 상승
guihoon 0:bbff1149056a 85 earase_dino();
guihoon 0:bbff1149056a 86 dinoY-=jump_difficulty;
guihoon 0:bbff1149056a 87 crash = crashing();
guihoon 0:bbff1149056a 88 if (crash == -1) {
guihoon 0:bbff1149056a 89 break;
guihoon 0:bbff1149056a 90 }
guihoon 0:bbff1149056a 91 h+=jump_difficulty;
guihoon 0:bbff1149056a 92 games(dino_tic);
guihoon 0:bbff1149056a 93 }
guihoon 0:bbff1149056a 94
guihoon 0:bbff1149056a 95 while (h > 0) { //y축으로 8칸 하강
guihoon 0:bbff1149056a 96 crash = crashing();
guihoon 0:bbff1149056a 97 if (crash == -1)
guihoon 0:bbff1149056a 98 break;
guihoon 0:bbff1149056a 99 dinoY+=jump_difficulty;
guihoon 0:bbff1149056a 100 earase_dino();
guihoon 0:bbff1149056a 101 h-=jump_difficulty;
guihoon 0:bbff1149056a 102 games(dino_tic);
guihoon 0:bbff1149056a 103 }
guihoon 0:bbff1149056a 104 }
guihoon 0:bbff1149056a 105 }
guihoon 0:bbff1149056a 106
guihoon 0:bbff1149056a 107 int crashing() { //충돌 판정 //난이도 '하'
guihoon 0:bbff1149056a 108 // (가로1 && 가로2) && 세로
guihoon 0:bbff1149056a 109 // 가로1: 나무가 가로 11칸보다 뒤에 있음
guihoon 0:bbff1149056a 110 // 가로2: 나무가 가로 15칸보다 앞에 있음
guihoon 0:bbff1149056a 111 // 가로1 && 가로2: 나무가 가로 11칸과 15칸 사이에 있음
guihoon 0:bbff1149056a 112 // 세로: 공룡 발 3칸이 나무 5칸 보다 높이가 같거나 낮을 때
guihoon 0:bbff1149056a 113 if ((dinoX + 6 <= treeX + 2 && dinoX + 10 >= treeX + 2) && dinoY + 12 >= TREE_Y + 2) {
guihoon 0:bbff1149056a 114 stop_speaker();
guihoon 0:bbff1149056a 115 return -1;
guihoon 0:bbff1149056a 116 } else
guihoon 0:bbff1149056a 117 return 0;
guihoon 0:bbff1149056a 118 }
guihoon 0:bbff1149056a 119
guihoon 0:bbff1149056a 120 void draw_dino(int dino_tic) { //공룡 그리기
guihoon 0:bbff1149056a 121 int toc = dino_tic % 8;
guihoon 0:bbff1149056a 122 dino_mutex.lock();
guihoon 0:bbff1149056a 123 //몸통
guihoon 0:bbff1149056a 124
guihoon 0:bbff1149056a 125 putgoto(dinoX, dinoY);
guihoon 0:bbff1149056a 126 printf(" @@@@@@@@\r\n");
guihoon 0:bbff1149056a 127 printf(" @@@@@@@@@@@\r\n");
guihoon 0:bbff1149056a 128 printf(" @@@ @@@@@@@\r\n");
guihoon 0:bbff1149056a 129 printf(" @@@@@@@@@@@\r\n");
guihoon 0:bbff1149056a 130 printf(" @@@@@@\r\n");
guihoon 0:bbff1149056a 131 printf(" * @@@@@@@@@@\r\n");
guihoon 0:bbff1149056a 132 printf(" @ @@@@@@\r\n");
guihoon 0:bbff1149056a 133 printf(" @@ @@@@@@@@@@@@\r\n");
guihoon 0:bbff1149056a 134 printf(" @@@@@@@@@@@@ @\r\n");
guihoon 0:bbff1149056a 135 printf(" @@@@@@@@@@@@\r\n");
guihoon 0:bbff1149056a 136 printf(" @@@@@@@@@@\r\n");
guihoon 0:bbff1149056a 137 printf(" @@@@@@@@\r\n");
guihoon 0:bbff1149056a 138 printf(" @@@@@@\r\n");
guihoon 0:bbff1149056a 139
guihoon 0:bbff1149056a 140
guihoon 0:bbff1149056a 141 // 발 구르기 구현
guihoon 0:bbff1149056a 142 if (toc >= 0 && toc <= 3) //4tic 동안 유지
guihoon 0:bbff1149056a 143 {
guihoon 0:bbff1149056a 144 //earase_foot();
guihoon 0:bbff1149056a 145 putgoto(dinoX, dinoY + 13); //발 그리기
guihoon 0:bbff1149056a 146 printf(" @ @@@\r\n");
guihoon 0:bbff1149056a 147 printf(" @@ ");
guihoon 0:bbff1149056a 148 }
guihoon 0:bbff1149056a 149 else
guihoon 0:bbff1149056a 150 {
guihoon 0:bbff1149056a 151 //earase_foot();
guihoon 0:bbff1149056a 152 putgoto(dinoX, dinoY + 13); //발 그리기
guihoon 0:bbff1149056a 153 printf(" @@@ @ \r\n");
guihoon 0:bbff1149056a 154 printf(" @@");
guihoon 0:bbff1149056a 155 }
guihoon 0:bbff1149056a 156 dino_mutex.unlock();
guihoon 0:bbff1149056a 157 }
guihoon 0:bbff1149056a 158
guihoon 0:bbff1149056a 159 void earase_foot() { //발 지우기
guihoon 0:bbff1149056a 160 dino_mutex.lock();
guihoon 0:bbff1149056a 161 putgoto(dinoX, dinoY + 13);
guihoon 0:bbff1149056a 162 printf(" \n");
guihoon 0:bbff1149056a 163 printf(" ");
guihoon 0:bbff1149056a 164 dino_mutex.unlock();
guihoon 0:bbff1149056a 165 }
guihoon 0:bbff1149056a 166
guihoon 0:bbff1149056a 167 void earase_dino() { //공룡 지우기
guihoon 0:bbff1149056a 168 dino_mutex.lock();
guihoon 0:bbff1149056a 169 putclear();
guihoon 0:bbff1149056a 170 dino_score(dino_tic);
guihoon 0:bbff1149056a 171 dino_mutex.unlock();
guihoon 0:bbff1149056a 172 earase_foot();
guihoon 0:bbff1149056a 173 }
guihoon 0:bbff1149056a 174
guihoon 0:bbff1149056a 175 void draw_tree() { //나무 그리기
guihoon 0:bbff1149056a 176 dino_mutex.lock();
guihoon 0:bbff1149056a 177 putgoto(treeX + 2, TREE_Y); printf("##\r\n");
guihoon 0:bbff1149056a 178 putgoto(treeX, TREE_Y + 1); printf("# ## #\r\n");
guihoon 0:bbff1149056a 179 putgoto(treeX, TREE_Y + 2); printf("######\r\n");
guihoon 0:bbff1149056a 180 putgoto(treeX + 2, TREE_Y + 3); printf("##\r\n");
guihoon 0:bbff1149056a 181 putgoto(treeX + 2, TREE_Y + 4); printf("##");
guihoon 0:bbff1149056a 182 dino_mutex.unlock();
guihoon 0:bbff1149056a 183 }
guihoon 0:bbff1149056a 184
guihoon 0:bbff1149056a 185 void erase_tree() { //나무 지우기
guihoon 0:bbff1149056a 186 dino_mutex.lock();
guihoon 0:bbff1149056a 187 putgoto(treeX + 3, TREE_Y); printf(" \r\n");
guihoon 0:bbff1149056a 188 putgoto(treeX + 1, TREE_Y + 1); printf(" \r\n");
guihoon 0:bbff1149056a 189 putgoto(treeX + 1, TREE_Y + 2); printf(" \r\n");
guihoon 0:bbff1149056a 190 putgoto(treeX + 3, TREE_Y + 3); printf(" \r\n");
guihoon 0:bbff1149056a 191 putgoto(treeX + 3, TREE_Y + 4); printf(" ");
guihoon 0:bbff1149056a 192 dino_mutex.unlock();
guihoon 0:bbff1149056a 193 }
guihoon 0:bbff1149056a 194
guihoon 0:bbff1149056a 195 void tree() { //나무 오른쪽에서 왼쪽으로 이동
guihoon 0:bbff1149056a 196 treeX-=tree_difficulty; //왼쪽으로 한 칸 이동
guihoon 0:bbff1149056a 197 erase_tree(); //지우고
guihoon 0:bbff1149056a 198 draw_tree(); //그리기
guihoon 0:bbff1149056a 199
guihoon 0:bbff1149056a 200 if (treeX == 0)
guihoon 0:bbff1149056a 201 treeX = TREE_X; //나무가 왼쪽 끝으로 이동하면 초기화
guihoon 0:bbff1149056a 202 }
guihoon 0:bbff1149056a 203
guihoon 0:bbff1149056a 204 void dino_start() { //시작 화면
guihoon 0:bbff1149056a 205 while (1) {
guihoon 0:bbff1149056a 206 dino_mutex.lock();
guihoon 0:bbff1149056a 207 putgoto(30, 10);
guihoon 0:bbff1149056a 208 printf("Press 'Center Button' to start the game");
guihoon 0:bbff1149056a 209 dino_mutex.unlock();
guihoon 0:bbff1149056a 210 draw_dino(0);
guihoon 0:bbff1149056a 211
guihoon 2:5b7da2619c44 212 if (sw_up==1) {
guihoon 0:bbff1149056a 213 dino_setting_lcd();
guihoon 0:bbff1149056a 214 dino_start_lcd();
guihoon 0:bbff1149056a 215 putclear();
guihoon 0:bbff1149056a 216 break;
guihoon 0:bbff1149056a 217 }
guihoon 0:bbff1149056a 218 }
guihoon 0:bbff1149056a 219 }