天天看點

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

開飛機打飛機

極度簡陋版,做着玩

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

/20.3.27/

基本描述

  1. 玩家控制一架飛機,用

    *

    表示;
  2. 敵機隻有一架,随機位置飛來,用

    @

    表示;
  3. 子彈能發一顆 ,用

    |

    表示;//暫且叫做子彈吧,要不然叫飛彈?感覺叫啥都行
  4. 子彈擊中敵機後,子彈和敵機消失,得一分;
  5. 被敵機撞到後,遊戲結束
  6. 上下左右由

    W

    S

    A

    D

    控制,

    空格

    發射子彈;

存在缺陷

  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);
}


           

參考

  • 河海大學童晶老師的課程(做遊戲,學程式設計)