hwang guihoon / Mbed OS poo_dino_game

Dependencies:   C12832 ESP-call

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