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

【项目简介】

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫是什么

网络爬虫又称网络蜘蛛、网络机器人&#xff0c;它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页&#xff0c;并将所需要的数据抓取下来。通过对抓取的数据进行处理&#xff0c;从而提取出有价值的信息。 认识爬虫 我们所熟悉的一系列…

3 python进阶篇

文章目录 面向对象类属性和类方法类属性类方法静态方法 单例模式__new__ 方法类实现单例模式 异常 、模块和包异常自定义异常 模块和包模块的搜索顺序包的init文件发布模块&#xff08;了解&#xff09; 文件seek文件/目录的常用管理操作eval函数 补充性知识位运算小技巧 参考我…

Python入门教程:掌握for循环、while循环、字符串操作、文件读写与异常处理等基础知识

文章目录 for循环while循环字符串操作访问字符串中的字符切片总结字符串拼接 文件读写try...except 异常处理函数模块和包类和面向对象编程完结 for循环 在 Python 中&#xff0c;for 循环用于遍历序列&#xff08;list、tuple、range 对象等&#xff09;或其他可迭代对象。for…

Java中反射机制,枚举,Lambda的使用

目录 一、反射机制 1、含义 2、作用 3、※反射相关的几个类 3.1、Class类&#xff08;Class对象是反射的基石&#xff09; 3.2、Class类中相关的方法 3.2.1 (※重要)常用获得类相关的方法 3.2.2 (※重要)常用获得类中属性、变量Field相关的方法 3.2.3 获得类中注解相…

N-Gram语言模型工具kenlm的详细安装教程

【本配置过程基于Linux系统】 下载源代码&#xff1a; wget -O - https://kheafield.com/code/kenlm.tar.gz |tar xz 编译&#xff1a; makdir kenlm/build cd kenlm/build cmake .. && make -j4 发现报错&#xff1a; 系统中没有cmake&#xff0c;按照错误提示&am…

ChatGPT 指南:角色扮演让回答问题更专业

让 ChatGPT 进行角色扮演 Act as ...&#xff0c;比如&#xff0c;律师、内科医生、心理医生、运动教练、哲学家、翻译、平面设计师、IT 工程师等等&#xff0c;从而才能让 ChatGPT 从这个角色角度来分析我们的问题&#xff0c;不然&#xff0c;它的回答可能会过于广泛。 下面以…

实在智能RPA亮相2023全球人工智能技术博览会,“能对话的数字员工”引领智能自动化新篇章

随着ChatGPT火爆全网&#xff0c;人工智能再次成为学术界和科技领域“新宠”&#xff0c;一场“智能革命”的序幕悄然掀开。 6月13日&#xff0c;“智能驱动 砥砺前行”为主题的2023全球人工智能技术博览会在杭州未来科技城学术交流中心圆满落下帷幕。此次博览会以展示智能科技…

51单片机 - 期末复习重要图

AT89S51片内硬件结构 1.内部硬件结构图 2.内部部件简单介绍 3. 26个特殊功能寄存器分类 按照定时器、串口、通用I/O口和CPU 中断相关寄存器&#xff1a;3IE - 中断使能寄存器IP - 中断优先级寄存器 定时器相关寄存器6TCON - 定时器/计数器控制寄存器TMOD - 定时器/计数器模…

【Leetcode60天带刷】day07哈希表——454.四数相加II , 383. 赎金信 ,15. 三数之和 , 18. 四数之和

题目&#xff1a;454.四数相加II 454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 …

神经网络:参数更新

在计算机视觉中&#xff0c;参数更新是指通过使用梯度信息来调整神经网络模型中的参数&#xff0c;从而逐步优化模型的性能。参数更新的作用、原理和意义如下&#xff1a; 1. 作用&#xff1a; 改进模型性能&#xff1a;参数更新可以使模型更好地适应训练数据&#xff0c;提高…

I/O多路复用+高性能网络模式

前言&#xff1a; 本篇文章将介绍客户端-服务端之间从最简单的Socket模型到I/O多路复用的模式演变过程&#xff0c;并介绍Reactor和Proactor两种高性能网络模式 文章内容摘自&#xff1a;小林Coding I/O多路复用高性能网络模式 . 传统Socket模型传统Socket模型的性能瓶颈多进程…

SpringCloud Alibaba入门5之使用OpenFegin调用服务

我们继续在上一章的基础上进行开发 SpringCloud Alibaba入门4之nacos注册中心管理_qinxun2008081的博客-CSDN博客 Feign是一种声明式、模板化的HTTP客户端。使用Feign&#xff0c;可以做到声明式调用。Feign是在RestTemplate和Ribbon的基础上进一步封装&#xff0c;使用RestT…

链路追踪SkyWalking整合项目以及数据持久化

1. 微服务整合SkyWalking 1.1 通过jar包方式整合 首先我们将一个简单的springboot服务打成jar包。 将其上传到Linux服务器中。 准备一个启动脚本&#xff0c;脚本内容如下&#xff1a; #!/bin/sh # SkyWalking Agent配置 export SW_AGENT_NAMEskywalking‐test #Agent名字,一…

【MQTT 5.0】协议 ——发布订阅模式、Qos、keepalive、连接认证、消息结构

一、前言1.1 MQTT 协议概述1.2 MQTT规范 二、MQTT 协议基本概念2.1 发布/订阅模式2.11 MQTT 发布/订阅模式2.12 MQTT 发布/订阅中的消息路由2.13 MQTT 与 HTTP 对比2.14 MQTT 与消息队列 2.2 服务质量&#xff1a;QoS2.21 QoS 0 最多分发一次2.22 QoS1 至少分发一次2.23 QoS 2 …

Windows远程桌面(mstsc)不能复制粘贴的解决办法

最近突然发现Windows远程桌面(mstsc)不能在远程端和本地端之间自由的复制和粘贴了&#xff0c;这还是非常影响使用体验的&#xff1b;因此记录一下解决方法&#xff0c;以便后续再遇到此类问题时查看如何解决&#xff1b; 文章目录 一、背景二、解决办法2.1 方法1 重启rdpclip.…

Java并发编程学习16-线程池的使用(中)

线程池的使用&#xff08;中&#xff09; 引言1. 配置 ThreadPoolExecutor1.1 线程的创建与销毁1.2 管理队列任务1.3 饱和策略1.4 线程工厂1.5 定制 ThreadPoolExecutor 2. 扩展 ThreadPoolExecutor总结 引言 上篇分析了在使用任务执行框架时需要注意的各种情况&#xff0c;并…

OpenCV 笔记_1

笔记_1 文章目录 笔记_1Mat类数据类型读取Mat类支持的运算图像读取&#xff0c;显示&#xff0c;保存imread 图像读取namedWindow 创建要显示的窗口imshow 窗口显示imwrite 图像保存 视频加载与摄像头的使用VideoCapture 加载视频或摄像头get 获取属性VideoWriter 保存视频 图像…

【五子棋实战】第6章 调用接口进行联调

【五子棋实战】第6章 调用接口进行联调 Ajax调用接口 调用五子棋接口 点击优化 尾声 更多待开发的功能 Ajax调用接口 引入Jquery&#xff0c;使用JQ封装的ajax&#xff0c;demo如下&#xff1a; <script src"jquery-3.5.0.min.js"></script> <…

Python 操作 Excel 全攻略 | 包括读取、写入、表格操作、图像输出和字体设置

文章目录 前言Python 操作 Excel 教程1. Excel 文件的读取与写入2. Excel 表格的操作2.1 插入和删除行和列2.2 遍历表格中的单元格并修改值 3. 图像的输出3.1 输出柱状图 4. 字体的设置4.1 设置单元格的字体大小和颜色4.2 设置单元格的加粗和斜体4.3 设置单元格的边框和填充颜色…

CSS弹性布局常用设置

目录 一、单位元素 二、弹性容器 三、常用属性 三、项目实战效果 一、单位元素 vm 1vm 为视口的1% vh 视口高的1% vmin 参照长边 vmax 参照长边 rem 等比缩放 需要设置最外层盒子html设置vw 根字号html的--- font-- 1vm 去适配 初始化 //初始化*{padding: 0;margin: 0}//…