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

·一、需求设计

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
#include<string.h>
#include//清屏所需头文件
#include//清屏所需头文件
#include

//*定义全局变量*

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 1; i++)
    {
        map[i][1] = 4;
        for (j = 2; j 1; j++)
            map[i][j] = 0;
        map[i][width] = 4;
    }
    //下方围墙的初始化
    i = high;
    for (j = 1; 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 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();//与输入无关的更新

undefined

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

undefined

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 )
    {
        for (j = 1; 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);

 }

Original: https://www.cnblogs.com/zhang-a-d/p/14846105.html
Author: 他乡一故知
Title: 经典实验–飞机大战小游戏

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616938/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Jenkins移动指定目录文件到指定tomcat,并启动tomcat

    一.安装Jenkins(略),请自行百度 二.任务创建 1.新建任务 2.进入任务内,选择构建 写入脚本 脚本如下: Xcopy D:\bioknowshell64\apache-…

    Java 2023年6月6日
    074
  • PgSQL-to_char-保留小数位、格式时间格式

    to_char 1.保留小数 格式必须是9。小数点位数前保留位数不足则####;to_char中的第二个参数的小数点后面位数高于第一个参数,会用0补齐;to_char中的第二个参数…

    Java 2023年6月9日
    096
  • Java-异常初步练习

    案例一: package com.esandinfo; /** * 自定义一个Exception类 */ class MyCustomException extends Runti…

    Java 2023年5月29日
    086
  • iOS macOS 回到主线程的三种方式

    简单说将代码同步到主线程执行的三种方法如下:// 1.NSThread [self performSelectorOnMainThread:@selector(updateUI) …

    Java 2023年5月29日
    098
  • 带研发团队的日常思考2-项目老是延期该怎么处理

    这个问题老生常谈了,大部分互联网公司的项目都可能会遇到这样的问题,这里并不能给到大家一个具体的、彻底的、完美的解决方案,具体的项目、团队情况需要具体的分析,我这里记录一下遇到这种问…

    Java 2023年6月5日
    093
  • 跟我学Python图像处理丨带你掌握傅里叶变换原理及实现

    摘要:傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪、图像增强等处理。 本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用—…

    Java 2023年6月15日
    064
  • Java实现抽奖模块的相关分享

    最近进行的项目中,有个抽奖的需求,今天就把相关代码给大家分享一下。 一、DAO层 /** * &#x83B7;&#x53D6;&#x5956;&#x…

    Java 2023年6月15日
    0121
  • IO(异常处理)

    程序的异常:Throwable* 严重问题:Error 我们不处理。这种问题一般都是很严重的,比如说内存溢出。* 问题:ExceptionA:编译期问题:不是RuntimeExce…

    Java 2023年6月5日
    093
  • Nginx核心知识100讲学习笔记(陶辉)Nginx架构基础(三)

    一、Nginx如何通过连接池处理网络请求 1、连接池 1、预分配的connections_n 个链接 bash;gutter:true; http://nginx.org/en/d…

    Java 2023年5月30日
    082
  • 2022-8-27 vue 第一天

    什么是vue? Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建…

    Java 2023年6月13日
    094
  • Java反射机制

    概述 Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以…

    Java 2023年6月7日
    081
  • nginx重新整理——————nginx 模块[十]

    前言 简单介绍一下nginx的模块。 正文 https://nginx.org/en/docs/ 这里面可以看到官方模块。 比如打开这个模块: https://nginx.org/…

    Java 2023年5月30日
    075
  • JavaWeb-数据库连接

    ​ 环境 JDK 1.8 Eclipse Mysql 数据库连接类 package com.star.db; import java.sql.Connection; import …

    Java 2023年6月8日
    089
  • 【已解决】wordpress 修改固定链接 伪静态URL出现nginx 404错误

    一、站点设置 打开站点设置,选择伪静态,选择wordpress 二、wordpress设置 打开wordpress后台,选择 设置 —》固定链接 选择一个你喜欢的格式点…

    Java 2023年6月15日
    079
  • 动力节点Springboot教程学习笔记整理

    一丶概述 去年年底转后台不久,就接手了公司后台项目,虽然暂无开发需求,IDEA运行跑通程序,解决业务反馈问题断点跟近,打包发布都是问题,然而动力节点这个springboot视频帮了…

    Java 2023年6月7日
    084
  • Mysql 计算地址经纬度距离实时位置

    前言 最近在做项目时候,遇到一个这样子的需求, 点到卡包里面卡券使用使用,需要展示卡券使用附近门店, 思路 数据库地址表设计 通用的区域街道地址表 tz_sys_area 字段名称…

    Java 2023年6月13日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球