Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dino.cpp@0:bbff1149056a, 2022-06-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |