hwang guihoon / Mbed OS poo_dino_game

Dependencies:   C12832 ESP-call

Revision:
0:bbff1149056a
Child:
1:f3da75b90f21
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Dino.cpp	Sun Jun 12 23:11:47 2022 +0000
@@ -0,0 +1,220 @@
+#include "Dino.h"
+
+Mutex dino_mutex;
+
+DigitalIn sw_center(D8, PullDown);
+DigitalIn sw_up(D6, PullDown);
+
+int treeX;
+int dinoX; 
+int dinoY; 
+
+int dino_tic;    //게임 내 시간 단위이자 점수 결정 요소
+int crash;  //충돌 체크
+int jump_difficulty; //점프 속도와 관련
+int tree_difficulty; //나무 오는 속도와 관련
+
+void dino_score(int tic) { //점수 출력
+    dino_mutex.lock();
+    putgoto(45, 1);
+    printf("score : %4d", tic / 5 * 10); // tic/5 당 10점     //필드 폭 4칸 확보 (n천점까지)
+    dino_mutex.unlock();
+}
+
+void dino_update_tic() {
+    while(1) {
+        dino_tic++;
+        dino_score(dino_tic);
+        thread_sleep_for(20);
+    }
+}
+
+void init_parameter() {
+    treeX = TREE_X;
+    dinoX = DINO_X;
+    dinoY = DINO_Y;
+    dino_tic = 0;  
+    crash = 0;
+    jump_difficulty = 1; 
+    tree_difficulty = 2; 
+}
+
+
+void run_dino_thread() {
+    putclear();
+    init_parameter(); 
+    dino_start();
+    green_led();
+    start_speaker();
+    
+    while (1) {
+        dino_tic = game(dino_tic);
+
+        //joystick 위로 올리면 점프
+        if (sw_up==1) {
+            jump();
+        }
+        crash = crashing();
+        if (crash == -1) //충돌 시 탈출
+            break;
+    }
+    popping_led();
+    dino_end_lcd(); 
+    end(dino_tic);
+    thread_sleep_for(1000);
+}
+
+int game(int dino_tic) { //게임화면 메인 요소
+    dino_score(dino_tic);
+    tree();
+    draw_dino(dino_tic);
+
+    thread_sleep_for(20); //0.02초      //딜레이 예상
+    dino_tic ++;
+    return dino_tic;
+}
+
+void games(int dino_tic) {
+    tree();
+    draw_dino(dino_tic);
+}
+
+void jump() {
+    if (dinoY - 15 == 0) { //'스페이스 바'가 눌리고 공룡이 바닥에 있을 때
+        int h = 0; //점프 높이 초기화
+        while (h < 8) { //y축으로 8칸 상승
+            earase_dino();
+            dinoY-=jump_difficulty;
+            crash = crashing();
+            if (crash == -1) {
+                break;
+            }
+            h+=jump_difficulty;
+            games(dino_tic);
+        }
+
+        while (h > 0) { //y축으로 8칸 하강
+            crash = crashing();
+            if (crash == -1)
+                break;
+            dinoY+=jump_difficulty;
+            earase_dino();
+            h-=jump_difficulty;
+            games(dino_tic);
+        }
+    }
+}
+
+int crashing() { //충돌 판정    //난이도 '하'
+    // (가로1 && 가로2) && 세로
+    // 가로1: 나무가 가로 11칸보다 뒤에 있음
+    // 가로2: 나무가 가로 15칸보다 앞에 있음
+    // 가로1 && 가로2: 나무가 가로 11칸과 15칸 사이에 있음
+    // 세로: 공룡 발 3칸이 나무 5칸 보다 높이가 같거나 낮을 때
+    if ((dinoX + 6 <= treeX + 2 && dinoX + 10 >= treeX + 2) && dinoY + 12 >= TREE_Y + 2) {
+        stop_speaker();
+        return -1;
+    } else
+        return 0;
+}
+
+void draw_dino(int dino_tic) { //공룡 그리기
+    int toc = dino_tic % 8;
+    dino_mutex.lock();
+    //몸통
+
+    putgoto(dinoX, dinoY);           
+    printf("              @@@@@@@@\r\n");
+    printf("             @@@@@@@@@@@\r\n");
+    printf("             @@@ @@@@@@@\r\n");
+    printf("             @@@@@@@@@@@\r\n");
+    printf("             @@@@@@\r\n");
+    printf("     *      @@@@@@@@@@\r\n");
+    printf("     @     @@@@@@\r\n");
+    printf("     @@  @@@@@@@@@@@@\r\n");
+    printf("     @@@@@@@@@@@@   @\r\n");
+    printf("     @@@@@@@@@@@@\r\n");
+    printf("      @@@@@@@@@@\r\n");
+    printf("       @@@@@@@@\r\n");
+    printf("         @@@@@@\r\n");  
+    
+
+    // 발 구르기 구현
+    if (toc >= 0 && toc <= 3) //4tic 동안 유지
+    {
+        //earase_foot();
+        putgoto(dinoX, dinoY + 13); //발 그리기
+        printf("         @    @@@\r\n");
+        printf("         @@      ");
+    }
+    else
+    {
+        //earase_foot();
+        putgoto(dinoX, dinoY + 13); //발 그리기
+        printf("         @@@  @  \r\n");
+        printf("              @@");
+    }
+    dino_mutex.unlock();
+}
+
+void earase_foot() { //발 지우기
+    dino_mutex.lock();
+    putgoto(dinoX, dinoY + 13);
+    printf("                 \n");
+    printf("                 ");
+    dino_mutex.unlock();
+}
+
+void earase_dino() { //공룡 지우기
+    dino_mutex.lock();
+    putclear();
+    dino_score(dino_tic);
+    dino_mutex.unlock();
+    earase_foot();
+}
+
+void draw_tree() { //나무 그리기
+    dino_mutex.lock();
+    putgoto(treeX + 2, TREE_Y);          printf("##\r\n");
+    putgoto(treeX, TREE_Y + 1);        printf("# ## #\r\n");
+    putgoto(treeX, TREE_Y + 2);        printf("######\r\n");
+    putgoto(treeX + 2, TREE_Y + 3);      printf("##\r\n");
+    putgoto(treeX + 2, TREE_Y + 4);      printf("##");
+    dino_mutex.unlock();
+}
+
+void erase_tree() { //나무 지우기
+    dino_mutex.lock();
+    putgoto(treeX + 3, TREE_Y);        printf("    \r\n");
+    putgoto(treeX + 1, TREE_Y + 1);  printf("        \r\n");
+    putgoto(treeX + 1, TREE_Y + 2);  printf("        \r\n");
+    putgoto(treeX + 3, TREE_Y + 3);    printf("    \r\n");
+    putgoto(treeX + 3, TREE_Y + 4);    printf("    ");
+    dino_mutex.unlock();
+}
+
+void tree() { //나무 오른쪽에서 왼쪽으로 이동
+    treeX-=tree_difficulty; //왼쪽으로 한 칸 이동
+    erase_tree(); //지우고
+    draw_tree(); //그리기
+
+    if (treeX == 0)
+        treeX = TREE_X; //나무가 왼쪽 끝으로 이동하면 초기화
+}
+
+void dino_start() { //시작 화면
+    while (1) { 
+        dino_mutex.lock();
+        putgoto(30, 10);
+        printf("Press 'Center Button' to start the game");
+        dino_mutex.unlock();
+        draw_dino(0);
+
+        if (sw_center==1) {
+            dino_setting_lcd();
+            dino_start_lcd();
+            putclear();
+            break;
+        }
+    }
+}
\ No newline at end of file