C語言控制檯小遊戲 | 打飛機

開飛機打飛機

極度簡陋版,做着玩
在這裏插入圖片描述
/20.3.27/

基本描述

  1. 玩家控制一架飛機,用 * 表示;
  2. 敵機只有一架,隨機位置飛來,用 @ 表示;
  3. 子彈能發一顆 ,用 | 表示;//暫且叫做子彈吧,要不然叫導彈?感覺叫啥都行
  4. 子彈擊中敵機後,子彈和敵機消失,得一分;
  5. 被敵機撞到後,遊戲結束
  6. 上下左右由WSAD控制,空格 發射子彈;

存在缺陷

  1. 只有一架飛機,飛完就沒了
  2. 只有一顆子彈,打完了再打,之前的就沒了
  3. 有機率打不中,飛機和子彈恰好遇到,下一個循環恰好錯過時,miss

C語言源代碼

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

int high, wid;  //遊戲場景的高和寬
int plane_h, plane_w;   //飛機位置
int bullet_h, bullet_w;     //子彈位置
int enemy_h, enemy_w;  //敵機位置
int interval; //同個計次來模擬時間間隔
int itv_enemy; //敵機移動的時間間隔
int score;  //分數


void Startup();   //遊戲數值初始化
void Show();    //遊戲界面輸出
void UpdateInput();    //與輸入無關的遊戲狀態更新
void UpdateNormal();    //因輸入導致的遊戲狀態更新


int main()
{
    Startup();  //初始化
    while(1){   //遊戲循環
        Show();
        UpdateInput();
        UpdateNormal();
    }
    return 0;
}

void Startup(){
    score=0;
    high=25;   //初始化場景高度
    wid=60;    //初始化場景寬度
    plane_h=15;    //初始化飛機豎直座標
    plane_w=10;     //初始化飛機水平座標
    bullet_h=-1;    //初始化子彈豎直座標
    bullet_w=10;    //初始化子彈水平座標
    enemy_h=-1;     //初始化敵機豎直座標
    srand(time(NULL));
    enemy_w=rand()%wid;    //初始化敵機水平座標
    interval=0;      //初始化時間間隔計數
    itv_enemy=5;	//初始化敵機移動時間間隔
}
void Show(){
    HideCursor();   //隱藏光標
    gotoxy(1,1);    //回調光標、刷新畫面
    for(int i=0;i<high;i++){
        for(int j=0;j<wid;j++){
            if( i==plane_h && j==plane_w ){ //當前位置爲飛機位置
                printf("*");
            }
            else if( i==bullet_h && j==bullet_w ){  //當前位置爲子彈位置
                printf("|");
            }
            else if( i==enemy_h && j==enemy_w ){  //當前位置爲敵機位置
                printf("@");
            }
            else if( i<high && j<wid ){  //當前位置無物,且在邊界內
                printf(" ");
            }
        }
        printf("|\n");  //輸出右邊界
    }
    for(int i=0;i<wid;i++){ //輸出下邊界
        printf("-");
    }
    printf("*\n\n得分:%d",score);
}
void UpdateInput(){
    char key;  //檢測按下的鍵
    if(kbhit()){ //當鍵按下
       key=getch(); //獲取鍵值
       if(key=='w'||key=='W'){  //當按下w鍵,上移
            if(plane_h>0)plane_h--;
       }
       if(key=='s'||key=='S'){  //當按下s鍵,下移
            if(plane_h<high-1)plane_h++;
       }
       if(key=='a'||key=='A'){  //當按下a鍵,左移
            if(plane_w>0)plane_w--;
       }
       if(key=='d'||key=='D'){  //當按下d鍵,右移
            if(plane_w<wid-1)plane_w++;
       }
       if(key==' '){            //當按下空格鍵,發射子彈
            bullet_h=plane_h-1;
            bullet_w=plane_w;
       }

    }
}
void UpdateNormal(){

    if(bullet_h>-1&&bullet_h<high){ //子彈未到邊界時,向上移動
        bullet_h--;
    }
    if(enemy_h<high && interval%itv_enemy==0){ //敵機未到下邊界時,向下移動,
    /////////////////////////////////////////////每次移動的時間間隔爲itv_enemy
        enemy_h++;
    }
    if(bullet_h==enemy_h && enemy_w==bullet_w){ //子彈打到敵機,兩兩消失
        enemy_h=high;
        bullet_h=-1;
        printf("\a"); //擊中響鈴
        score++;
    }
    if(plane_h==enemy_h && plane_w==enemy_w){ //敵機撞到玩家飛機,遊戲結束
        printf("\t遊戲結束!");
        exit(0);
    }
    if(interval<=100){  //時間間隔計次
        interval++;
    }
    else{
        interval=0;
    }
}
void gotoxy(int x,int y){ //回調光標
    COORD pos;
    pos.X=x-1;
    pos.Y=y-1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

void HideCursor(){ //隱藏光標函數
	CONSOLE_CURSOR_INFO cursor;
	cursor.bVisible = FALSE;
	cursor.dwSize = sizeof(cursor);
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(handle, &cursor);
}


參考

  • 河海大學童晶老師的課程(做遊戲,學編程)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章