经典实验--飞机大战小游戏

Posted 他乡一故知

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典实验--飞机大战小游戏相关的知识,希望对你有一定的参考价值。

·一、需求设计

  1.为检测C语言的学习成果,根据所学的C语言知识,设计程序:飞机大战小游戏;

  2.自行定义变量,函数或结构体,编写源代码并进行编译运行测试;

  3.根据编写的代码,自行攥写实验报告;

 ·二、系统设计

  1 实验题目:

  飞机大战小游戏

  2 游戏描述

  飞机大战是一款惊险刺激的射击游戏,通过控制飞机的上下左右移动,发射子弹,击退敌机并赢得分数,玩游戏既可以锻炼人的反应能力,也可以起到放松身心的作用.

  进行C语言面向对象程序设计课程设计主要是在学习C语言这门面向对象语言的基础上,并通过实践加深对 C语言面向对象程序设计语言特点的认识与理解。同时,可以提高运用C编程语言解决实际问题的能力;锻炼实际的编程能力;还能提高调查研究、查阅技术文   献、资料以及编写软件设计文档的能力。

  3 功能要求

  【1】 实现游戏难度的选择,飞机模型以及界面的外观设计等的功能。

  【2】 实现方向操移动的操作和敌机随机生成功能。

  【3】 分数计算功能。

  【4】 游戏的开始,暂停,结束以及分数显示的功能。

 

三、概要设计

  1 简要设计及所涉及的知识

  运用二维数组的加减和循环来设计游戏.通过下,xy的加减实现位置的移动;然后用一系列函数,实现各功能;

  2 功能描述

  (1)   难度选择:  1为困难,2为一般,3为简单,Enter开始游戏;

  (2)   操作:按1235控制飞机左下右上移动,空格发射子弹,按8暂停,按0停止游戏并输出分数;;

  (3)   游戏的测评方式为计分制,每击中一架敌机分数加1,无分数限制;

 

·四 详细设计

  1定义全局变量

  (1)   long long int speed = 0;//控制敌机的速度

  (2)   int position_x, position_y;//飞机的所在位置

  (3)   int high, width;//地图的大小

  (4)   int bullet_x, bullet_y;//子弹的位置

  (5)   int enemy_x, enemy_y;//敌人的位置

  (6)   int map[MAX][MAX];

  (7)   /*地图符号说明:0表示空白,1表示战机*的区域,2表示敌人战机的位置。

  (8)   3表示上下围墙,4表示左右围墙,5表示子弹的位置*/

  (9)   int score,time,degree,choice;//分数,时间,难度,重新开始

 

  2 定义功能函数

  (1)   void starup();//初始化所有的信息

  (2)   void startMap();//地图内容初始化

  (3)   void HideCursor();//隐藏光标 ,不会出现光标的闪烁

  (4)void gotoxy(int x, int y);//清理一部分屏幕

  (5)void updateWithoutInput();//与输入无关的更新

  (6)void updateWithInput();//与输入有关的更新

  (7)void show();//展示的内容

  (8)int menu();//菜单初始化

  (9)void showend();//结束菜单

  (10)void stop();//暂停游戏 

 

  3 制作流程

  飞机大战的主要实现的功能是让飞机移动,飞机的移动可以通过二维数组实现,首先对飞机的坐标设置初值为屏幕的中间位置,通过横纵坐标的加减实现左右移动,每移动一个单位清屏一次;

  第二个过程是随机产生敌机,我们可以定义一个随机数组[]0][y],y是随机产生的,通过x++实现敌机的前进;在定义一个void函数,当输入空格键时,在当前飞机所在的位置产生一个子弹[x][y],之后x递减,从而实现子弹的前进;

  第三,当敌机和子弹的坐标相同时,子弹击中敌机,此时将此刻的敌机和子弹同时清除,分数加1,并随机生成一架敌机,;或当飞机飞出规定区域后,清除该敌机并随机生成;

  实现这三个功能后即可完成基本的操作;之后需要考虑的是敌机速度的调控,在每次敌机x++之前添加一次循环.飞机前进的速度与循环的次数成正比;这样就实现了速度的快慢;

  剩下的问题就是完善其他简单的内容,如难度选择,分数的输出,界面设置及游戏的暂停和终止等;

 

 

五、系统实现与测试

5.1开始游戏测试

 

图5-1-1 游戏开始及难度选择界面

 

5.2难度选择

 

图5-2-1  难度1 困难模式

 

 

图5-2-2 难度2 一般模式

 

 

图5-2-3 难度3 简单模式

难度选择后,按Enter开始游戏

 

5.3游戏开始

 

图5-3-1 游戏开始界面

 

 

图5-3-2 游戏正在进行的截图

按1 2 3 5 进行←↓→↑移动,按 空格 发射子弹射击

 

 

5.4游戏暂停

 

图5-4-1 暂停界面

按8 暂停游戏 ,再次输入8 继续游戏

 

5.5游戏结束

 

图5-5-1 游戏结束界面

按0结束游戏,并会输出游戏得分,按任意键退出游戏;

5.6 综合说明

游戏开始后,先进行难度选择.1 2 3依次为困难,一般和简单,玩家可根据自身喜好进行难度选择;难度选择好后按Enter开始游戏,进入游戏后,按1 2 3 5 进行←↓→↑移动,按 空格 发射子弹射击,对准敌机进行射击,

 

六、结论与心得

通过这段时间学习的C语言课程设计,学会了很多同时也收获了很多,学会了如何根据根据问题去思考解决的思路,和编写代码;虽然这个过程有点枯燥乏味,有时半天都没思路,想不出该怎么写怎么算,但是等到真的想到思路的时候,会发现自己之前的付出是值得的,那种喜悦感非常棒;

而且还收获了好多知识,不光有上学期学到的C语言知识,还有还有好多编程方面的技巧和经验,这些东西对以后的学习和工作会有很大的帮助;最后通过本次大作业可有让自己对所学过的知识加以整理和检验,既可以整理C语言和编程知识,还可以检验自己的一些缺点和不足,为以后的学习和工作打下基础;

 

七、源代码

1、int main();//主函数

#include<stdio.h>
#include<string.h>
#include<conio.h>//清屏所需头文件
#include<windows.h>//清屏所需头文件
#include<stdlib.h>

//*********定义全局变量*********

long long int speed = 0;//控制敌机的速度

int position_x, position_y;//飞机的所在位置

int high, width;//地图的大小

int bullet_x, bullet_y;//子弹的位置

int enemy_x, enemy_y;//敌人的位置

int map[MAX][MAX];

/*地图符号说明:0表示空白,1表示战机*的区域,2表示敌人战机的位置。

3表示上下围墙,4表示左右围墙,5表示子弹的位置*/

int score,time,degree,choice;//分数,时间,难度,重新开始


//********定义功能函数*********

void starup();//初始化所有的信息

void startMap();//地图内容初始化

void HideCursor();//隐藏光标 ,不会出现光标的闪烁

void gotoxy(int x, int y);//清理一部分屏幕

void updateWithoutInput();//与输入无关的更新

void updateWithInput();//与输入有关的更新

void show();//展示的内容

int menu();//菜单初始化

void showend();//结束菜单

void stop();//暂停游戏

#define MAX 100
int main()
{    
    int a;
    if(menu())
        starup();
        while (1)
        {
            HideCursor();
            startMap();
            show();
            updateWithoutInput();
            updateWithInput();
        }      
    return 0;
}

2、void starup();//初始化所有的信息

void starup()//初始化所有的信息 
{
    high = 20;
    width = 30;
    position_x = high / 2;
    position_y = width / 2;
    bullet_x = 0;
    bullet_y = position_y;
    enemy_x = 2;
    enemy_y = position_y - 1;
    score = 0;

}

 

3、void startMap();//地图内容初始化

void startMap()//地图内容初始化 
{
    int i, j;
    for (i = 1; i <= high -1; i++)
    {
        map[i][1] = 4;
        for (j = 2; j <= width - 1; j++)
            map[i][j] = 0;
        map[i][width] = 4;
    }
    //下方围墙的初始化 
    i = high;
    for (j = 1; j <= width; j++)
        map[i][j] = 3;

    map[bullet_x][bullet_y] = 5;
    /*这里是战机大小的初始化开始*/
    map[position_x - 1][position_y] = 1;
    i = position_x;
    for (j = position_y - 2; j <= position_y + 2; j++)
        map[i][j] = 1;
    map[position_x + 1][position_y - 1] = 1;
    map[position_x + 1][position_y + 1] = 1;
    /***      初始化结束         **/

    /* 敌人战机的初始化 */
    map[enemy_x][enemy_y] = 2;
    map[enemy_x - 1][enemy_y - 1] = 2;
    map[enemy_x - 1][enemy_y + 1] = 2;
    /* 敌人战机初始化结束*/
}

 

4、void HideCursor();//隐藏光标 ,不会出现光标的闪烁

void HideCursor()//隐藏光标 ,不会出现光标的闪烁 
{
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}    

 

5、void gotoxy(int x, int y);//清理一部分屏幕

void gotoxy(int x, int y)//清理一部分屏幕 
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}

 

6、void updateWithoutInput();//与输入无关的更新


void updateWithoutInput()//与输入无关的更新 
{    
    if (bullet_x > 0)//实现子弹的前进 
        bullet_x--;
    if (((bullet_x == enemy_x) && (bullet_y == enemy_y))||((bullet_x == enemy_x-1) && (bullet_y == enemy_y-1))||((bullet_x == enemy_x+1) && (bullet_y == enemy_y+1)))//当敌人的飞机被击中时,同时清子弹和飞机 
    {
        score++;
    
        enemy_x = 0;
        enemy_y = rand() % width;//随机产生新敌机 
        bullet_x = 0;
    }
    else if (enemy_x > high)//当飞机超出区域 
    {     
        enemy_x = 0;
        enemy_y = rand() % width;//随机产生新敌机 
       
    } 
    if (speed == 1)
        for (int i = 1; i <=10*(15*degree-10); i++)//用来控制敌机的速度 ,通过循环的次数实现 
        {
            for (int j = 1; j <=10000; j++)
            {
                speed = 1;
            }
        }
    speed = 0;
    if (speed == 0)
    {
        enemy_x++;
        speed = 1;
    }
}
 

 

7、void updateWithInput();//与输入有关的更新

void updateWithInput()//与输入有关的更新 
{
    char input;
    if (kbhit())
    {
        input = getch();
        if (input == \'1\')
           position_y--;
        if (input == \'2\')
            position_x++;
        if (input == \'3\')
            position_y++;
        if (input == \'5\')
            position_x--;
       if (input ==\'8\')
               stop();
           if( input==\'0\')
               showend();
        if (input == \' \')
        {
               bullet_x = position_x - 1;
               bullet_y = position_y;
        }
        
    }
}

 

8、void show();//展示的内容

void show()//展示的内容 
{
    gotoxy(0, 0);
    int i, j;
    for (i = 1; i <= high; i++)
    {
        for (j = 1; j <= width; j++)
        {
            if (map[i][j] == 0)
                printf(" ");// 活动空间 
            if (map[i][j] == 1)
                printf("*");//控制的飞机 
            if (map[i][j] == 2)
                printf("#");//敌方飞机 
            if (map[i][j] == 3)
                printf("~");//下边界 
            if (map[i][j] == 4)
                printf("|");//左右边界 
            if (map[i][j] == 5)
                printf(":");//子弹 
               
        }
        printf("\\n");
    }
    printf("\\n你的得分:%d\\n\\n", score);
    printf("操作说明: 1235分别操作 左下右上四个的移动\\n");
    printf("**空格是发出子弹**\\n");
}

 

9、int menu();//菜单初始化

int menu()
{    

    printf("******************************\\n") ;
    printf("*                            *\\n") ;
    printf("*     欢迎来到飞机大战       *\\n") ;
    printf("*                            *\\n") ;    
    printf("*         Hard  == 1         *\\n") ;
    printf("*        Normal == 2         *\\n") ;
    printf("*        Easy   == 3         *\\n") ;
    printf("*                            *\\n") ;
    printf("*       Enter开始游戏        *\\n") ;
    printf("*                            *\\n") ;
    printf("*                            *\\n") ;
    printf("******************************\\n") ;
    scanf("%d",&degree);
    system("cls");
    return degree;
    
}

 

10、void showend();//结束菜单

void showend()
{    
    int s;
    system("cls");
       printf("******************************\\n") ;
    printf("*                            *\\n") ;
      printf("*          Gime Over !       *\\n") ;
    printf("*                            *\\n") ;
    printf("*     Your scores are %d!     *\\n",score);
    printf("*                            *\\n") ;
    printf("*          Very Good !       *\\n") ;
    printf("*                            *\\n") ;
    printf("*         按任意键退出       *\\n") ;
    printf("*                            *\\n") ;
    printf("*                            *\\n") ;
    printf("*                            *\\n") ;
    printf("******************************\\n") ;
    exit(0);              
 } 

 

 

11、void stop();//暂停游戏

void stop()
{    
    int s;
    system("cls");
       printf("******************************\\n") ;
    printf("*                            *\\n") ;
      printf("*          Gime Pause !      *\\n") ;
    printf("*                            *\\n") ;
    printf("*     Your scores are %d!     *\\n",score);
    printf("*                            *\\n") ;
    printf("*         按8继续游戏        *\\n") ;
    printf("*                            *\\n") ;
    printf("*         按任意键退出       *\\n") ;
    printf("*                            *\\n") ;
    printf("*                            *\\n") ;
    printf("*                            *\\n") ;
    printf("******************************\\n") ;
    scanf("%d",&s); 
    if(s!=8)
    exit(0);         
       
 } 

 

以上是关于经典实验--飞机大战小游戏的主要内容,如果未能解决你的问题,请参考以下文章

python入门到精通,一篇就够。40个python游戏经典开源项目(开源分享:俄罗斯方块魂斗罗植物大战僵尸飞机大战超级玛丽...)

有啥好玩的飞机游戏

飞机大战的操作指南

重温经典:Python版飞机大战源码 神器 玩游戏就玩自己开发的

第十六周第四次实验设计报告

一文教你实现「飞机大战」里战机的控制逻辑