溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言怎么用封裝方法實現(xiàn)飛機大戰(zhàn)游戲

發(fā)布時間:2022-05-16 14:22:01 來源:億速云 閱讀:173 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細介紹“C語言怎么用封裝方法實現(xiàn)飛機大戰(zhàn)游戲”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“C語言怎么用封裝方法實現(xiàn)飛機大戰(zhàn)游戲”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、項目描述和最終的成果展示

項目描述:   在上一次的基礎(chǔ)上用函數(shù)進行了封裝,對于一些功能也進行了一些優(yōu)化。

最終效果圖如下:

C語言怎么用封裝方法實現(xiàn)飛機大戰(zhàn)游戲

二、用函數(shù)進行封裝

代碼如下:

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

//全局變量
int position_x,position_y;//飛機位置
int high,width;//游戲畫面尺寸

void startup()//數(shù)據(jù)的初始化
{
    high = 20;
    width = 30;
    position_x = high/2;//飛機的上下位置
    position_y = width/2;//飛機的左右·位置
}

void show()//顯示畫面
{
    system("cls");
    int i,j;
    for(i=0;i<high;i++)
    {
        for(j=0;j<width;j++)
        {
            if( (i == position_x) && (j== position_y))//輸出飛機
                printf("☆");
            else
                printf(" ");
        }
        printf("\n");
    }
}

void updateWithoutInput()//與用戶輸入無關(guān)的更新
{

}

void updateWithInput()//與用戶輸入有關(guān)的更新
{
    char input;
    if(kbhit())//判斷有無輸入
    {
        input=getch();
        if( input == 'a' || input == 'A')
            position_y--;//左移
        if( input == 'd' || input == 'D')
            position_y++;//右移
        if( input == 'w' || input == 'W')
            position_x--;//上移
        if( input == 's' || input == 'S')
            position_x++;//下移
    }
}


int main(void)
{
    startup();  //數(shù)據(jù)的初始化
    while(1)
    {
        show();//顯示畫面
        updateWithoutInput();//與用戶輸入無關(guān)的更新
        updateWithInput();//與用戶輸入有關(guān)的更新
    }
    return 0;
}

三、新型的發(fā)射子彈功能

代碼如下:

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

//全局變量
int position_x,position_y;//飛機位置
int high,width;//游戲畫面尺寸
int bullet_x,bullet_y;//子彈位置


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


void startup()//數(shù)據(jù)的初始化
{
    high = 120;
    width = 100;
    position_x = high/2;//飛機的上下位置
    position_y = width/2;//飛機的左右·位置
    bullet_x = 0;
    bullet_y = position_y;
}

void show()//顯示畫面
{
    system("cls");
    int i,j;
    for(i=0;i<high;i++)
    {
        for(j=0;j<width;j++)
        {
            if( (i == position_x) && (j== position_y))//輸出飛機
                printf("☆");
            else if( (i == bullet_x)&&(j == bullet_y))
                printf("|");//輸出子彈
            else
                printf(" ");
        }
        printf("\n");
    }
}

void updateWithoutInput()//與用戶輸入無關(guān)的更新
{
    if(bullet_x>-1)
        bullet_x--;
}

void updateWithInput()//與用戶輸入有關(guān)的更新
{
    char input;
    if(kbhit())
    {
        input=getch();
        if( input == 'a' || input == 'A')
            position_y--;//左移
        if( input == 'd' || input == 'D')
            position_y++;//右移
        if( input == 'w' || input == 'W')
            position_x--;//上移
        if( input == 's' || input == 'S')
            position_x++;//下移
        if( input == ' ')
        {
            bullet_x=position_x-1;
            bullet_y=position_y;
        }
    }
}


int main(void)
{
    startup();//數(shù)據(jù)的初始化
    while(1)
    {
        show();//顯示畫面
        HideCursor();//隱藏光標,防止光標亂閃。
        updateWithoutInput();//與用戶輸入無關(guān)的更新
        updateWithInput();//與用戶輸入有關(guān)的更新
    }
    return 0;
}

效果圖如下:

C語言怎么用封裝方法實現(xiàn)飛機大戰(zhàn)游戲

發(fā)射子彈的功能和上次有了明顯的改進,有了一個動態(tài)發(fā)射的一個效果。

四、實現(xiàn)移動的敵機功能和更正屏幕閃爍,清除光標功能

代碼如下;

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

//全局變量
int position_x,position_y;//飛機位置
int high,width;//游戲畫面尺寸
int bullet_x,bullet_y;//子彈位置
int enemy_x,enemy_y;//敵機的位置
int score;//得分


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

void gotoxy(int x,int y)//將光標移動到(x,y)位置
{
    HANDLE handle =GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}
void startup()//數(shù)據(jù)的初始化
{
    system("color 09");
    high = 30;
    width =50;
    position_x = high/2;//飛機的上下位置
    position_y = width/2;//飛機的左右位置
    bullet_x = 0;
    bullet_y = position_y;
    enemy_x=0;
    enemy_y=position_y;
    score=0;
}

void show()//顯示畫面
{
    //system("cls");
    gotoxy(0,0);
    int i,j;
    for(i=0;i<high;i++)
    {
        for(j=0;j<width;j++)
        {
            if( (i == position_x) && (j== position_y))//輸出飛機
                printf("☆");
            else if( (i == bullet_x)&&(j == bullet_y))
                printf("|");//輸出子彈
            else if( (i== enemy_x) && ( j==enemy_y))
                printf("*");//輸出敵機
            else
                printf(" ");//輸出空格
        }
        printf("\n");
    }
    printf("得分:%d\n",score);
}

void updateWithoutInput()//與用戶輸入無關(guān)的更新
{
    static int speed=0;
    if(bullet_x>-1)
        bullet_x--;
     if( (bullet_x == enemy_x) && (bullet_y ==enemy_y) )//子彈擊中飛機
     {
         score++;//分數(shù)無效
         enemy_x=-1;//產(chǎn)生新的敵機
         enemy_y=rand()%width;
         bullet_x=-2;//子彈無效
     }
    // 用來控制敵機向下移動的速度,每隔幾次循環(huán)才移動一次敵機
    // 這樣修改,雖然用戶按鍵的交互速度還是很快,但是NPC的移動顯示可以降速
    if(speed<10)
        speed++;
    if(speed == 10 )
    {
        enemy_x++;
        speed = 0;
    }
}

void updateWithInput()//與用戶輸入有關(guān)的更新
{
    char input;
    if(kbhit())
    {
        input=getch();
        if( input == 'a' || input == 'A')
            position_y--;//左移
        if( input == 'd' || input == 'D')
            position_y++;//右移
        if( input == 'w' || input == 'W')
            position_x--;//上移
        if( input == 's' || input == 'S')
            position_x++;//下移
        if( input == ' ')
        {
            bullet_x=position_x-1;
            bullet_y=position_y;
        }
    }
}


int main(void)
{
    startup();//數(shù)據(jù)的初始化
    while(1)
    {
        show();//顯示畫面
        HideCursor();//隱藏光標,防止光標亂閃。
        updateWithoutInput();//與用戶輸入無關(guān)的更新
        updateWithInput();//與用戶輸入有關(guān)的更新
    }
    return 0;
}

效果圖如下:

C語言怎么用封裝方法實現(xiàn)飛機大戰(zhàn)游戲

五、訂正一些BUG和完成一些美化

我們的項目基本是已經(jīng)完成了。但是還有很多的漏洞。
比如:  飛機控制越界問題,以及敵機越界問題。
而且界面不夠好看我們要再美化一下。
以及增加游戲暫停功能。
游戲結(jié)束功能。

代碼如下:

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

//全局變量
int position_x,position_y;//飛機位置
int high,width;//游戲畫面尺寸
int bullet_x,bullet_y;//子彈位置
int enemy_x,enemy_y;//敵機的位置
int score;//得分


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

void gotoxy(int x,int y)//將光標移動到(x,y)位置
{
    HANDLE handle =GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}
void startup()//數(shù)據(jù)的初始化
{
    system("color 09");
    high = 30;
    width =50;
    position_x = high/2;//飛機的上下位置
    position_y = width/2;//飛機的左右位置
    bullet_x = 0;
    bullet_y = position_y;
    enemy_x=0;
    enemy_y=position_y;
    score=0;
}

void show()//顯示畫面
{
    //system("cls");
    gotoxy(0,0);
    int i,j;
    for(i=0;i<high;i++)
    {
        for(j=0;j<width;j++)
        {
            if( (i == position_x) && (j== position_y))//輸出飛機
                printf("☆");
            else if( (i == bullet_x)&&(j == bullet_y))
                printf("|");//輸出子彈
            else if( (i== enemy_x) && ( j==enemy_y))
                printf("*");//輸出敵機
            else if(j==width-1&&i==position_x)
                //飛機那一行,因為有飛機多占一格,所以要刪除前面的一個空格
                printf("\b+");
            else if(j==width-1)
                printf("+");
            else if(i==high-1)
                printf("-");
            else
                printf(" ");//輸出空格
        }
        printf("\n");
    }
    printf("得分:%d\n",score);
    printf("按1鍵游戲暫停\n");
}

void updateWithoutInput()//與用戶輸入無關(guān)的更新
{
    static int speed=0;
    if(bullet_x>-1)
        bullet_x--;
     if( (bullet_x == enemy_x) && (bullet_y ==enemy_y) )//子彈擊中飛機
     {
         score++;//分數(shù)無效
         enemy_x=-1;//產(chǎn)生新的敵機
         enemy_y=rand()%width+1;
         bullet_x=-2;//子彈無效
     }
    // 用來控制敵機向下移動的速度,每隔幾次循環(huán)才移動一次敵機
    // 這樣修改,雖然用戶按鍵的交互速度還是很快,但是NPC的移動顯示可以降速
    if(speed<6)
        speed++;
    if(speed == 6 )
    {
        enemy_x++;
        if(enemy_x==high-1)//如果飛機越界再次生成
        {
            enemy_x=-1;//產(chǎn)生新的敵機
            enemy_y=rand()%width+1;
        }
        if( enemy_x==position_x-1)//撞機了 游戲結(jié)束
        {
            system("cls");
            printf("飛機墜毀了,游戲結(jié)束\n");
            printf("分數(shù)為:%d\n",score);
            printf("請重啟再開始新的一局\n");
            while(1)
            {

            }
        }
        speed = 0;
    }
}

void updateWithInput()//與用戶輸入有關(guān)的更新
{
    char input;
    if(kbhit())
    {
        input=getch();
        if( input == 'a' || input == 'A')
        {
            position_y--;//左移
            if(position_y==0)//判斷是否越界
            {
                position_y++;
            }
        }
        if( input == 'd' || input == 'D')
        {
            position_y++;//右移
            if(position_y==width-2)//判斷是否越界
            {
                position_y--;
            }
        }
        if( input == 'w' || input == 'W')
        {
            position_x--;//上移
            if(position_x==1)//判斷是否越界
            {
                position_x++;
            }
        }
        if( input == 's' || input == 'S')
        {
            position_x++;//下移
            if(position_x==high-1)//判斷是否越界
            {
                position_x--;
            }
        }
        if( input == ' ')//發(fā)射子彈
        {
            bullet_x=position_x-1;
            bullet_y=position_y;
        }
        if( input == '1')//按1鍵游戲暫停
        {
            while(1)
            {
                input=getch();
                if(input == '1')//再按1鍵游戲繼續(xù)
                    break;
            }
        }
    }
}


int main(void)
{
    startup();//數(shù)據(jù)的初始化
    while(1)
    {
        show();//顯示畫面
        HideCursor();//隱藏光標,防止光標亂閃。
        updateWithoutInput();//與用戶輸入無關(guān)的更新
        updateWithInput();//與用戶輸入有關(guān)的更新
    }
    return 0;
}

效果圖如下:

C語言怎么用封裝方法實現(xiàn)飛機大戰(zhàn)游戲

讀到這里,這篇“C語言怎么用封裝方法實現(xiàn)飛機大戰(zhàn)游戲”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI