C语言 - 坦克动荡https://www.zhihu.com/video/1249782665081425920

分享18级同学大一上学期用C语言实现的坦克动荡。分步骤代码、图片音乐素材、可执行程序可从百度网盘下载:

提取码:0shb

一、设计思路

坦克动荡这个游戏与传统的坦克大战游戏不同,坦克动荡是通过子弹的碰墙之后多次反弹实现击中敌方坦克,并取得胜利的一款游戏。游戏的性质决定了地图对这个游戏的进行非常重要,所以制作这个游戏的第一步就是设计出一个或多个地图,这样才能增加游戏的趣味性。在设计出不同的地图后下一步便是实现坦克的行走与转向,以及碰到障碍物时的判定。随后要实现的便是子弹的发射以及碰墙之后的反弹。反弹实现之后,要攻克的就是子弹击中坦克时的死亡判定这个问题,当这些功能都完善之后,整个游戏就基本完成了,最后要做的就是整个游戏的优化,比如说音效,爆炸图片的添加等等细节上的完善。这些都完成后,坦克动荡这款游戏就彻底完成了。

二、功能描述

2.1 游戏整体功能描述

进入游戏时,玩家可以选择新游戏或游戏存档来进入玩家之间的对战,游戏有四个地图,玩家可以根据自身的喜好来选择游戏地图。游戏通过坦克的移动,反射子弹,以及子弹的反弹来实现摧毁敌方坦克并取得胜利的最终目的。

2.2 加载及显示地图

通过定义一个大的二维数组(比所有地图都要大)来储存地图信息,然后通过easy_x绘图功能,绘制出相应的地图(绘制出地图后可以选择自己将相应的地图截图,每次循环引用设计好的地图的图片加快游戏的运行)

2.3 两个坦克及子弹的相应功能实现

1.实现坦克的转向,前进后退以及坦克碰墙的判定。

2.并实现子弹的发射及发射子弹反弹。

3.坦克被子弹击中后的死亡判定及被击中后返回初始位置,每个坦克3条命,三条命打完后显示获胜方,并返回主菜单

2.4 初始及暂停菜单

初始菜单中可以选择游戏帮助,查看具体的游戏规则。玩家可在菜单中选择自己想进行的地图,或者读取游戏存档,也可以选择退出游戏结束游戏运行。

在游戏过程中也可以打开暂停菜单,进行相关的一些选择。

2.5 添加素材,完善细节

在相应界面添加背景图片和游戏中的一些音效以完善游戏细节,提高游戏体验。

三、各个部分的重点及难点

3.1 地图的加载与显示

地图是整个游戏进行的一个非常重要的部分,所以要对这个部分十分重视,最好先在纸上将地图画下来然后再用对应的二维数组表示出来(障碍物为1,空白为0),然后进行判断,如果是障碍物则打印一个方块,但是如果每次运行都要进行一次这个操作的话会严重拖慢程序运行,这时可以选择将地图的图片截图下来方便下次使用,或者可以选择缩小整个二维数组(将原来的5个单位化一个)。

因为有多个地图,所以二维数组应该设计的比所有地图都要大。而这样操作后控制地图的初始位置就成了另一个问题,可以定义一个变量为初始位置,然后每个地图的初始显示位置都根据地图本身大小而设置不同,再以这个初始位置为起点,在画布中显示地图,坦克和子弹。

3.2 坦克的移动旋转及撞墙判定

首先坦克的初始位置要合理,不能直接卡在墙体里面。在坦克的移动中使用可支持多键同时输入的方式使其可在移动过程中旋转,同时也支持多个玩家同时输入。撞墙判断编写两个函数,在输入坦克移动指令时以坦克的上下左右四道边界为对象分别判断该坦克是否在当前位置以当前角度进行前进或者后退。

坦克在空白处的移动应该是没有问题,这里的主要难点是碰到障碍物之后的判定该如何实现,大体就是对上下左右四个方向都进行判定,看看如果执行了前进或后退操作后是否会碰到墙壁,如果会碰到障碍物则不能移动,如果没有障碍物则可以前进,这个方法要求你了解坦克的实际尺寸(长度宽度),以坦克的四条边为对象判断是否将会撞到墙,当然这种判定方法还是不够精细的,这个判定实际判定的是这个图片的四条边,但是坦克旋转后,四条边位置也会随之发生相应角度的变化。

坦克的旋转上如果要进行360度的旋转,可以选择easy_x中的旋转函数,但是为了游戏的简单,我们将坦克的移动方向控制为8个,然后定义一个PI,用三角函数计算横坐标和纵坐标上的速度就可以解决向对应方向移动的问题。

3.3 子弹的发射及反弹

子弹的定义最好要用到结构体,因为在游戏中子弹要多次反弹,而且每次反弹之后速度的方向会发生改变,这时如果不用结构体,子弹的相关信息就会特别复杂。声明一个储存子弹相关信息的结构体,再定义一个该类型的二维数组表示双方的若干颗子弹。子弹的发射要注意这颗子弹的初始位置及初始两个方向上的速度。子弹的反弹注意限制子弹两个方向上的速度大小(小于2)以防止在判断是否击墙时直接“跃过”墙体。同时添加子弹在反弹若干次之后自动消失的功能。

3.4 子弹击中坦克,血量相关功能

子弹是否击中坦克采用计算每一颗子弹与坦克中心点的距离是否小于某个值的方法进行判定。坦克中弹后可以选择通过重新定义让所有子弹消失,这样就不会出现刚复活就被打死的情况。同时在游戏界面中显示双方的血量。生命值的显示我们选择使用文字显示,这样在生命变化时容易发生文字的重叠,可以放入一张背景图片,将上次显示的文字覆盖掉,就不会出现文字的重叠了。在一方血量为0(死亡时)结束这场游戏并返回主菜单界面。

3.5 存读档功能和用户菜单

这一部分不做过多的讲解,这一部分主要难点就是将感应鼠标点击的区域控制好,需要注意各个可点击文字选项边框在画布中的位置坐标以及各种鼠标指令之间的逻辑关系。

三、体会与总结

在开发坦克动荡游戏的过程中,首先我们体验到了怎样运用所学的C语言知识来一步步实现简单小游戏的开发,怎样用简单的知识一步步实现一个个复杂功能的乐趣。在实际开发过程中遇到一些棘手的问题我们也通过上网查找资料,与老师同学交流等方式基本解决。我们也认识到了团队合作的重要性,在一个比较大的工作中,合理分工,并能互相交流调配是十分重要的,能极大的提高工作效率和工作质量,当然团队中的每个人都应以积极的态度参与开发的工作。

总之,在这次的项目设计中,虽然过程中有些小瑕疵,但整体来说我们组的工作和成果还是基本达到预期要求的。这次项目设计作业让我们受益匪浅。

c语言200行代码大作业含菜单,2018级C语言大作业 - 坦克动荡相关推荐

  1. go语言:200行代码做udp rtp转发并发分布服务器

    使用go做服务器 最近写服务器使用c++多了以后,java和node逐渐被放到一边,最后又做了一个决定,使用go来做服务器,将会使用200行代码不到来做这个并发和分布式服务器,为什么? go语言的优势 ...

  2. C语言200行代码写一个贪吃蛇小游戏

    先看一眼主程序 一般小游戏的大致框架就是这个样子,这里主要分成画面的显示,与用户相关的更新,与用户无关的更新等三个部分.(完整代码附于文末) int main(int argc, char *argv ...

  3. C语言100行代码实现推箱子

    1 C语言100行代码实现推箱子 1.1 概述  C语言是很好入门编程的一个语言,它拥有着很好的移植性,基本上所有的平台都支持C语言编程.有些C语言基础的你,是不是也很想做一个项目来检验一下自己的学习 ...

  4. c语言300行代码大作业,C语言300行代码

    <C语言300行代码>由会员分享,可在线阅读,更多相关<C语言300行代码(3页珍藏版)>请在人人文库网上搜索. 1.include #include #include #in ...

  5. 宁愿“大小周”、每天只写 200 行代码、月薪 8k-17k 人群再涨!揭晓中国开发者真实现状...

    作者 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 程序员,一个圈外人羡慕.圈内人喊苦的"神奇"职业--高薪.福利好是旁人羡慕的理由,高压.加班多却也是他们最常见的写照 ...

  6. js websocket同步等待_WebSocket硬核入门:200行代码,教你徒手撸一个WebSocket服务器...

    本文原题"Node.js - 200 多行代码实现 Websocket 协议",为了提升内容品质,有较大修订. 1.引言 最近正在研究 WebSocket 相关的知识,想着如何能自 ...

  7. r语言error in match.fun(fun) :_Go语言200行写区块链源代码分析

    Github上有一个Repo,是一个使用Go语言(golang),不到200行代码写的区块链源代码,准确的说是174行.原作者起了个名字是 Code your own blockchain in le ...

  8. 宁愿“大小周”、每天只写 200 行代码、月薪 8k-17k 人群再涨 | 揭晓中国开发者真实现状

    作者 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 程序员,一个圈外人羡慕.圈内人喊苦的"神奇"职业--高薪.福利好是旁人羡慕的理由,高压.加班多却也是他们最常见的写照 ...

  9. blockchain 区块链200行代码:在JavaScript实现的一个简单的例子

    blockchain 区块链200行代码:在JavaScript实现的一个简单的例子 了解blockchain的概念很简单(区块链,交易链块):它是分布式的(即不是放置在同一台机器上,不同的网络设备上 ...

  10. [前端项目学习笔记] 200行代码网站首页轮播实现(html,css,js)

    目录 1.设置基本布局 2.添加轮播按钮 3.轮播代码初步实现 4.给按钮添加点击事件实现轮播 5.添加圆点轮播 6.将列表项替换为图片,并给图片加上超链接 7.最终效果 1.设置基本布局 整体布局我 ...

最新文章

  1. [转]Windows Shell 编程 第十三章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988004】...
  2. Verizon部署美国最大小型基站系统
  3. Android书页翻页设计:android-flip
  4. mysql sql优化_MySQL优化SQL语句的步骤
  5. NI myRIO-1900(ARM9)嵌入式小车2015.8-9
  6. mysql安装运行(centos)
  7. 统计每小时数据的处理
  8. NodeJS连接MySQL
  9. visio各版本下载
  10. 苏州大学计算机考研 复试机试真题2013-2020真题及Python题解
  11. K3 CLOUD库存管理关账与存货核算关账区别
  12. 短信中心号码iphone_如何在iPhone上阻止来自特定号码的呼叫
  13. Element-Ui 双重el-tabs组件选中第二层时,刷新导致第一层选中样式丢失问题以及解决方法
  14. MySQL8.0零基础入门
  15. 详解input value属性
  16. fm算法 c语言,推荐算法之—FM
  17. 投资大师索罗斯的人生轨迹 索氏投资理论 打跨英格兰银行的人 “魔鬼”索罗斯...
  18. vulfocus复现:Log4j2远程命令执行2
  19. Hive练习题之列转行
  20. 单级放大器1db压缩点 matlab仿真,0.1db压缩点

热门文章

  1. 检测相机视野中的物体运动并用Mask显示
  2. TCP IP通讯三次握手四次挥手
  3. unity UI 之text and image
  4. Atitit 物联网体系图 感知层 条码:物联网的第一代身份证 65二维码 4 电子标签:物联网的第二代身份证 78 4 传感器:物联网的神经元 92 4 自动识别技术 光学字符识别技术
  5. Atitit 架构艺术 与架构常见包含的技术 1. 架构的目的是什么??解决的问题 所有的问题都能通过架构解决 2 1.1. 提高可读性 提升可维护性架构 降低技术难度 2 1.2. 提升管理性
  6. Atitit.跨语言  文件夹与文件的io操作集合  草案
  7. Atitit.播放系统规划新版本 and 最近版本回顾 v3  pbf.doc
  8. paip.没有源码的情况下更改ASP.net ASPX页
  9. Julia :vscode jupyter中更新Julia kernel版本
  10. Rust : Tonic 基于Rust的gRPC实现