C语言/C++ 之 打飞机游戏

news2024/11/15 7:34:24

【项目简介】

1、设计思想:本项目主要是为了实现打飞机游戏,主要包括5个函数模块,和1个主函数框架。分别是chu_shi_hua();、you_cao_zuo;、wu_cao_zuo();、show();、main();等。项目完成过程中主要运用了C/C++中的输入输出流、调用函数、for循环函数、“清屏”函数、随机函数、以及无限循环函数等基本知识点。其中最难的三个函数模块设计思想如下:

(1)、构建主函数:首先得确定一堆数据的初始值,然后利用无限循环刷新函数实现游戏的运行。其中包含四个函数模块分别为数据初始化、游戏界面显示、无操作时函数、有操作时函数(按键)以及结束游戏语句即剩余关卡为0时游戏胜利,剩余生命为0时游戏失败。

(2)、编写游戏界面函数:为了让界面动起来,我选择了刷新函数,然后通过定义行和列来确定游戏中物体的位置,并在刷新的过程中实现行或者列的递增。

(3)、编写无操作函数:该函数里包含了速度的递增和击中与未击中和随机生成敌人语句。其中没击中两个敌人则速度加1  是通过的分判断例如if(de_fen%2==0) {level++;sheng_yu-=1;}。而击中敌人则隐藏子弹并且重新生成敌人,未击中则在生命减一的条件下随机生成一个敌人。

本项目是由小组成员共同协作完成,其中数据初始化模块由林正燃完成,无按键操作函数模块由薛泽鹏完成,其余函数由曹晶完成。

2、设计框架

(1)总体设计及功能框架

(2)打飞机游戏流程图

【使用工具】

Dev-C++

【数据结构】

int gao_du;         //界面高度:20

int kuan_du;        //界面宽度:25

int diji_weizhi_j;  //敌机位置  列:rand()%宽度; 

int diji_weizhi_i;  //          行:0

int wo_weizhi_i;     //我的位置:列:宽度/2            

int wo_weizhi_j;    //          行:高度-1;

int zidan_weizhi_i; //子弹位置:列:我的位置的列      

int zidan_weihzi_j; //          行:-1;

int de_fen;         //得分:0

int level;          //速度等级:0

int speed=0;        //速度:0

int sheng_yu=9;     //剩余关卡:9

int sheng_ming=5;   //剩余生命:10

【最终程序】

#include<iostream>

#include <conio.h>

#include <cstdlib>

using namespace std;

int gao_du,kuan_du;                

int dij_weizhi_j,diji_weizhi_i;

int wo_weizhi_i ,wo_weizhi_j ;  

int zidan_weizhi_i,zidan_weihzi_j;

int de_fen,level;       

int speed=0,sheng_yu=9,sheng_ming=5;

void chu_shi_hua()//确定一堆初始值

{gao_du=20;                         kuan_du=25;

 dij_weizhi_j=4;                      diji_weizhi_i=0;

 wo_weizhi_i =gao_du-1;             wo_weizhi_j=kuan_du/2;

 zidan_weizhi_i=-1;                   zidan_weihzi_j=wo_weizhi_j;

 diji_weizhi_i=0;                      dij_weizhi_j=rand()%kuan_du;//随机生成敌机

 de_fen=0;                         level=0;}

void show()//显示画面

{system("cls");//就是执行命令清屏的意思。

 int i,j;

 for (i=0; i<=gao_du;i++)

{for (j=0; j<=kuan_du;j++)

{     if(i==wo_weizhi_i &&j==wo_weizhi_j)   cout<<"我";//weizhi_i,weizhi_j分别表示我所在位置的行和列

   else if(i==zidan_weizhi_i&&j==zidan_weihzi_j)       cout<<"凸";//同上

   else if(i==diji_weizhi_i&&j==dij_weizhi_j)       cout<<"敌机";

   else if(i==gao_du)                            cout<<'-';

   else if(j==kuan_du)                           cout<<'&';//输出边界

   else                                           cout<<' ';}

                                                  cout<<endl;}

 cout<<"得分: "<<de_fen<<"   "<<"剩余生命: "<<sheng_ming<<"   "<<endl;

 cout<<"剩余关卡:"<<sheng_yu<<"   "<<" speed:"<<speed<<"   "<<endl;

}

void  wu_cao_zuo()

{

 if(zidan_weizhi_i>-1)              zidan_weizhi_i--;//子弹向上移动

 if(speed<sheng_yu)      speed++;//速度增加

 if(speed==sheng_yu)    

 {

if(diji_weizhi_i<gao_du)        {diji_weizhi_i++;}//敌机向下移动

 else                        {diji_weizhi_i=0;dij_weizhi_j=rand()%kuan_du;}

speed=0;}

if(zidan_weizhi_i==diji_weizhi_i&&zidan_weihzi_j==dij_weizhi_j)//击中

  {zidan_weizhi_i=-1;//隐藏子弹

  diji_weizhi_i=0;//重新生成敌机

  dij_weizhi_j=rand()%kuan_du;

  de_fen++;

  if(de_fen%2==0) //每击中两个通过一关

  {level++;sheng_yu-=1;}}

if (wo_weizhi_i ==diji_weizhi_i&&wo_weizhi_j==dij_weizhi_j||diji_weizhi_i==gao_du-1) //击中

  {sheng_ming--;

  diji_weizhi_i=0;

  dij_weizhi_j=rand()%kuan_du;} //生命值减一并且在随机生成一个敌机

}

void you_cao_zuo()

{char ch;

 if (_kbhit())//按键时 kbhit() 在执行时,检测是否有按键按下。

 {ch=_getch();

  if(ch=='a')    wo_weizhi_j--;

  if(ch=='d')    wo_weizhi_j++;

  if(ch=='w')    wo_weizhi_i--;

  if(ch=='s')    wo_weizhi_i++;

  if(ch==' ')    {zidan_weizhi_i=wo_weizhi_i -1;zidan_weihzi_j=wo_weizhi_j;}//子弹从我的位置发出

}}  

int main()

{ chu_shi_hua();  //确定一堆初始值

   while (true)    //无线循环以下操作

 { show();         //显示屏幕

   wu_cao_zuo();   //该函数是指在没有键盘输入时要做的

   you_cao_zuo();  //该函数时有键盘输入时要做的

   if(sheng_yu<=0)     {cout<<"你赢啦"<<endl;break;}  //剩余关卡为0时游戏胜利

   if(sheng_ming==0)   {cout<<"你失败了"<<endl;break;}//剩余生命为0时游戏失败

 }

 cout<<"******游戏结束啦*****"<<endl;

 return 0;}

【程序最终运行情况】

1.开始运行

代表游戏开始,空格键表示攻击。从“我”发出“凸”,“敌机”随机生成并从顶端下落。当“凸”遇到“敌机”时界面清除,子弹和飞机一起消失,得分加1,当“敌机”到达下边界时则生命减1,击中敌机两次后,敌机速度会提高。

2.暂停游戏

当鼠标左键点击界面时,点击处会变成白点然后游戏暂停,再次操作键盘游戏会继续进行。

3.游戏失败

如果剩余剩余生命为1时 敌机落入我方最后一行代表游戏失败,也可以理解为剩余生命为0时游戏失败。显示“你失败了”并且游戏结束。

4.游戏胜利

    如果剩余关卡为0时则代表游戏结束,显示“你赢了”并且游戏结束。

(注:可以更改初始化函数里的剩余生命以及剩余关卡或者更改if(de_fen%2==0)整除的数大小来改变每击中几个敌通过一关来改变关卡难度)

基础知识点:

谭浩强.C++面向对象程序设计(第三版)北京:清华出版社.2020

12for循环推广应用:

刘春茂,李琪.C语言程序设计案例(第一版)北京:清华出版社.2018

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/675081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蛋黄肉粽子

蛋黄肉粽子 一、蛋黄肉粽子 作为中国的传统美食之一&#xff0c;蛋黄肉粽子是端午节期间必不可少的特色食品。 我在今年的端午节期间品尝了这种美食&#xff0c;不仅让我感受到了它的美味&#xff0c;也让我领略到了它背后的历史和文化底蕴。 一、蛋黄肉粽子 首先&#xff0c;就…

第三方库介绍——nanomsg(高性能通信库)

一、nanomsg介绍 NanoMsg是一个Socket的通讯库&#xff0c;使用C语言编写实现的&#xff0c;这样就可以适用于多种操作系统&#xff0c;而且几乎不需要什么依赖&#xff0c;可扩展并且能易于使用。Nanomsg提供了几种常见的通信模式 &#xff08; 也称为“可扩展性协议” &#…

C++ 第一弹入门基础

目录 目录 1.关键字 2.命名空间 3.标准IO输入输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 1.关键字 c98的关键字一共有63个 在之后用的时候都会再次详细介绍 2.命名空间 2.1什么是命名空间&#xff0c;为什么要有他&#xff1f; 在c中为了避免相同名字的变量&am…

torchvision.utils.save_image()保存tensor显示图片异常问题解决

用torchvision.utils.save_image()保存图片时出现异常 有些像素点会显示为全黑&#xff08;灰度图&#xff09;&#xff0c;如下图所示&#xff0c;第一张和第三张图 刚开始以为是图像数据分布范围的问题&#xff0c;在保存之前输出图像tensor的最大max和最小min值&#xff0c;…

【Python 基础篇】Python 模块与包

文章目录 引言一、模块与包概述二、模块的导入和使用三、包的组织和导入四、实际应用场景五、总结 引言 在Python编程中&#xff0c;模块和包是组织和复用代码的重要工具。随着项目规模的增长&#xff0c;将代码按照功能模块化并组织成包&#xff0c;可以提高代码的可读性、可…

吴恩达ChatGPT《Building Systems with the ChatGPT API》笔记

1. 课程介绍 使用ChatGPT搭建端到端的LLM系统 本课程将演示使用ChatGPT API搭建一个端到端的客户服务辅助系统&#xff0c;其将多个调用链接到语言模型&#xff0c;根据前一个调用的输出来决定使用不同的指令&#xff0c;有时也可以从外部来源查找信息。 课程链接&#xff1a…

设计模式之桥接模式笔记

设计模式之桥接模式笔记 说明Bridge(桥接)目录桥接模式示例类图视频文件接口avi视频文件类rmvb视频文件类抽象的操作系统类windows类mac类测试类 说明 记录下学习设计模式-桥接模式的写法。JDK使用版本为1.8版本。 Bridge(桥接) 意图:将抽象部分与其实现部分分离&#xff0c…

用微分方程描述的连续时间滤波器举例

用微分方程描述的连续时间滤波器举例 在许多应用中&#xff0c;频率选择性滤波器是用线性常系数微分或差分方程描述的线性时不变系统来实现的。这有许多理由&#xff0c;例如很多具有滤波作用的物理系统都是由微分或差分方程表征的。这方面的一个很好的例子就是在后续将研究的汽…

消息中间件相关知识简介

一、消息中间件相关知识 1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&am…

Python 基础(十五):模块

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、什么是模块二、自定义模块三、引用其它模块3.1、使用 import 引用模块3.2、使用 f…

揭秘Java 8的新特性:Stream API的使用和实践

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 集合处理数据的弊端 2. Stream流式思想概述…

VN8911/VN8912(A)/VN8914/VN8910(A)上安装驱动

问题&#xff1a; 如何在 VN8911、VN8912(A) 或 VN8914 设备上安装驱动程序&#xff1f; 背景&#xff1a; VN8911、VN8912(A) 或 VN8914 设备 [下面概括为 VN8900 系列&#xff0c;不包括 VN8910(A)] 与 CANoe 一起使用时作为分布式实时系统运行 [参见下面的 CANoe 11.0 和 V…

vue插槽概念解释

官方文档 https://cn.vuejs.org/guide/introduction.html 什么是插槽 在 Vue.js 中&#xff0c;插槽&#xff08;Slots&#xff09;是一项非常有效的功能&#xff0c;它允许我们在组件中预留一个占位符&#xff0c;供父组件插入自定义的内容。 具体来说&#xff0c;当一个组件…

Linux和Shell:开源力量与命令行之美

目录 一、概述二、Linux的简单介绍三、Shell的简单介绍四、Linux和Shell的应用领域五、Shell编程结语&#xff1a; 一、概述 Linux和Shell是开源世界中不可或缺的两个重要组成部分。Linux作为一种自由和开放的操作系统&#xff0c;以其稳定性、安全性和可定制性而备受推崇。而S…

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统;实现NoC的RTL设计

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统&#xff1b;实现NoC的RTL设计 0. NoC多核片上网络生成器ProNoCProNoC的功能实现 1. 生成一个叫做Mor1kx SoC的单个Tile&#xff08;包含NI网络接口&#xff09;1.1 打开ProNoC用于生成Tile的GUI界面1.2 为Tile添加时钟…

Python基础篇(四):基本数据类型的学习和示例

Python基础篇(三)&#xff1a;基本语句的示例和说明 基本数据类型的学习和操作 1. 数值类型1.1 整数&#xff08;int&#xff09;1.2 浮点数&#xff08;float&#xff09;1.3 复数&#xff08;complex&#xff09; 2. 字符串类型2.1 字符串的定义2.2 转义字符2.3 多行字符串2…

Vue-几种插槽(slot)的使用

插槽(slot) 插槽在vue中是一种很常见的写法&#xff0c;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式 一共有三种分类&#xff1a;默认插槽、具名插槽、作用域插槽&#xff0c;下面一一根据案例改造说明 1 基本案例 首先编写一个基本的案…

12.1 物业管理项目中的新知识点

1.RESTful 2.雪花ID 3.mybatis的动态sql 很多时候需要实现多条件查询&#xff0c;手动判断拼接sql有些麻烦 mybatis提供了一个动态sql实现多条件查询的方法 3.1 if元素 使用if元素可以根据条件来包含或排除某个SQL片段 <select id"search" resultType"Hous…

OpenCV——实验结果输出《图像金字塔》和《图像轮廓》

1.高斯金字塔 img cv2.imread(./AM.png) print(img.shape) upcv2.pyrUp(img) cv_show(up,up)#只是将图片的大小改变了,并且是2倍2倍的增长。 print (up.shape) downcv2.pyrDown(img) cv_show(down,down) print(down.shape) up_downcv2.pyrDown(up) cv_show(up_down,np.hstack…

SSMP整合案例(4) Spring Boot整合MyBatis-Plus实现分页查询

文章 SSMP整合案例(3) 创建数据层并在测试类中运行数据库增删查改操作我们编写了MyBatis-Plus以Druid为数据源的方式 做了数据库的增删查改操作 那么 下面我们继续写 分页查询 我们 先写这样一段代码 bookDao.selectPage()selectPage就是BaseMapper提供给我们的分页查询函数 但…