要说微信中最火爆的小游戏是哪款,可能既不是精心打造的3D大作,也不是《植物大战僵尸2》,而是微信5.0刚开启时的《飞机大战》。

  就是这样一款铅笔手绘风格的简单到不能再简单的“打飞机”游戏,让国内的微信用户一次又一次地尝试,并表示似乎又找回了童年时玩电子游戏的那份单纯的快乐。至于游戏的玩法都不用加以介绍,就是简单的“打飞机”。

二、关于游戏设计

2.1 总结游戏印象

  (1)一个玩家飞机,多个电脑飞机

  ①

  ②

  ③

  ④

  (2)玩家飞机可以发射子弹,电脑飞机也可以发射子弹

  ①

  ②

  (3)玩家和电脑飞机被击中后有爆炸效果,并且有一定几率出现大型飞机

  ①

  ②

2.2 总结设计思路

  (1)万物皆对象

  在整个游戏中,我们看到的所有内容,我们都可以理解为游戏对象(GameObject),每一个游戏对象,都由一个单独的类来创建;在游戏中主要有三类游戏对象:一是飞机,二是子弹,三是背景;其中,飞机又分为玩家飞机和电脑飞机,子弹又分为玩家子弹和电脑子弹。于是,我们可以对飞机进行抽象形成一个抽象父类:PlaneBase,然后分别创建两个子类:PlanePlayer和PlaneEnemy;然后对子弹进行抽象形成一个抽象类:BulletBase,然后分别创建两个子类:BulletPlayer和BulletEnemy。但是,我们发现这些游戏对象都有一些共同的属性和方法,例如X,Y轴坐标,长度和宽度,以及绘制(Draw())和移动(Move())的方法,这时我们可以设计一个抽象类,形成了GameObject类:将共有的东西封装起来,减少开发时的冗余代码,提高程序的可扩展性,符合面向对象设计的思路:

  (2)计划生育好

  在整个游戏中,我们的玩家飞机对象只有一个,也就是说在内存中只需要存一份即可。这时,我们想到了伟大的计划生育政策,于是我们想到了使用单例模式。借助单例模式,可以保证只生成一个玩家飞机的实例,即为程序提供一个全局访问点,避免重复创建浪费不必要的内存。当然,除了玩家飞机外,我们的电脑飞机集合、子弹集合等集合对象实例也保证只有一份存储,降低游戏开销;

  (3)对象的运动

  在游戏买卖平台中,玩家可以通过键盘上下左右键控制玩家飞机的上下左右运动,而飞机的运动本质上还是改变游戏对象的X轴和Y轴的坐标,然后一直不间断地在窗体上重绘游戏对象。相比玩家飞机的移动,电脑飞机的移动则完全是通过程序中设置的随机函数控制左右方向移动的,而玩家飞机发出的子弹执行的运动则是从下到上,而电脑飞机发出的子弹执行的运动则是从上到下。

  (4)设计流程图

三、关键代码实现

3.1 客户端开发

  (1)设计GameObject类:封装所有游戏对象的公有属性

View Code

  一切皆对象,这里封装了游戏对象:飞机、子弹以及其他游戏对象共有的属性,以及两个抽象方法,让对象们(飞机?子弹?爆炸效果?等)自己去实现。

  (2)设计SingleObject类:保证游戏中的类都只有一个实例

View Code

  这里借助单例模式,保证玩家飞机对象只有一个存储,电脑飞机集合也只有一个,而具体的电脑飞机对象则分别在单例类中的集合中进行Add和Remove。

  (3)设计CollisionDetect方法:不停地进行碰撞检测

  ①Rectangle的IntersectsWith方法

  在游戏界面中,任何一个游戏对象我们都可以视为一个矩形区域(Rectangle类实例),它的坐标是X轴和Y轴,它还有长度和宽度,可以轻松地确定一个它所在的矩形区域。那么,我们可以通过Rectangle的IntersectsWith方法确定两个Rectangle是否存在重叠,如果有重叠,此方法将返回 true;否则将返回 false。那么,在飞机大战中主要是判断两种情况:一是玩家或电脑飞机发射的子弹是否击中了对方?二是玩家是否撞到了敌人飞机?

  ②在定时器事件中定期执行碰撞检测方法

View Code

3.2 服务端开发

  (1)创建监听玩家连接的Socket,不停地监听玩家的游戏连接请求

View Code

  在.NET中进行网络编程,一般都会涉及到Socket,其过程大概会经历如下图所示的流程:

PS:Socket非常类似于电话插座,以一个电话网为例:电话的通话双方相当于相互通信的2个程序,电话号码就是IP地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket;同时要知道对方的号码,相当于对方有一个固定的Socket。然后向对方拨号呼叫,相当于发出连接请求。对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向Socket发送数据和从Socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。

  (2)使用线程池ThreadPool新开线程,不停地接收玩家发送的信息

  ThreadPool.QueueUserWorkItem(new WaitCallback(ReceiveData), proxSocket);

  在监听线程中使用了线程池,开启了一个新的线程来接收客户端发送过来的数据,那么这个ReceiveData方法如何实现的:

View Code

  (3)当所有玩家都发送完游戏分数,服务器端对所有分数进行排序并发送最终名次

View Code

  在服务端有一个键值对集合专门存储玩家对应分数,然后对其按分数进行降序排序,排序后再遍历集合一一向玩家发送名次信息;

四、个人开发小结

4.1 服务端开启服务

  服务器端主要开启监听玩家连接请求的服务,当几个处在同一局域网的玩家连接后,服务端管理员点击“开始游戏”则客户端会启动游戏。

4.2 客户端开始游戏

  在客户端中,玩家飞机可以通过不停地发射子弹向不同类型的电脑飞机来获取得分,但是如果被敌人飞机的子弹击中分数也会被扣去一部分。

4.3 服务端计算成绩客户端显示

  

  当两个玩家连接游戏服务端后,便开始了“打飞机”的战斗,当指定时间后游戏结束,显示各自的游戏名次和分数。

  当然,还有很多核心的内容没有实现。希望有兴趣的童鞋可以去继续完善实现,这里提供一个我的飞机大战实现仅供参考,谢谢!

自己动手写游戏:飞机大战相关推荐

  1. c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf

    500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...

  2. 【游戏开发实战】使用Unity 2019制作仿微信小游戏飞机大战(七):主角飞机碰撞与爆炸

    文章目录 零.教程目录 一.前言 二.本篇目标 三.飞机机碰撞组件:BoxCollider2D.Rigidbody2D 四.添加Tag:Enemy 五.主角飞机碰撞处理:OnTriggerEnter2 ...

  3. c语言小游戏-飞机大战

    今天我们来尝试用easyx图形库实现c语言小游戏-飞机大战(源代码和图片已经在结尾给出) 先引用头文件 #include<stdio.h> #include<time.h>// ...

  4. 【Python】Python小游戏--飞机大战

    一.前言 今天已经初四,舒服的在家躺尸的春节也算过去了,又要开始辛勤的(苦逼的)学习和工作了.说点题外话,今年春节的病毒疫情真的弄的人心惶惶,我也在这为国家和武汉加油,也向一线工作人员致敬,希望早日结 ...

  5. 用JAVA制作小游戏——飞机大战(三)

    本篇博客是对飞机大战游戏项目完整代码的展示 详细代码讲解: 用JAVA制作小游戏--飞机大战(一) 用JAVA制作小游戏--飞机大战(二) 最下方附整个程序的文件下载链接 代码展示 主界面 impor ...

  6. 用JAVA制作小游戏——飞机大战(二)

    本篇博客是对飞机大战游戏使用代码的展示 重难点: 首先需要鼠标能够控制战机,使鼠标在窗口内时始终能够使战机的位置与鼠标相同,实现鼠标控制战斗机移动. 其次需要能够以一定的速度产生子弹和敌机,并且以一定 ...

  7. java小游戏-java小游戏-飞机大战

    java小游戏-java小游戏-飞机大战 1 窗口创建 2 背景图片添加 3 启动页面制作 4 启动页面点击事件 5 游戏物体父类的编写 6 背景的移动 7 双缓存的添加 8 背景图片的循环出现 9 ...

  8. android:怎样用一天时间,写出“飞机大战”这种游戏!(无框架-SurfaceView绘制)...

    序言 作为一个android开发人员,时常想开发一个小游戏娱乐一下大家,今天就说说,我是怎么样一天写出一个简单的"飞机大战"的. 体验地址:http://www.wandoujia ...

  9. 用python写(飞机大战小游戏)

    w'cwc下面我们进入详细教程: 一.首先我们先建一个文件夹 planewars(名字随便取): 然后用我们python中的pycharm打开这个文件,我们飞机大战的项目就在这进行 二.我们要写这个小 ...

最新文章

  1. 2022-2028年中国蛋白石行业发展现状分析及投资前景趋势报告
  2. 微服务架构的四大金刚利器
  3. atmega8 例程:T1定时器 快速PWM
  4. python去除字符串两边的空格_Python去除字符串两端空格的方法
  5. leetcode 650. 2 Keys Keyboard | 650. 只有两个键的键盘(暴力递归->傻缓存->DP)
  6. python临床数据_从临床试验中获取数据
  7. VS2012快捷键突然不能用怎么办
  8. c语言 数组指针传递给函数_嵌入式开发-C语言-指针与数组
  9. 李海自学java_JAVA程序设计 实验一
  10. Keras及其前端配置
  11. sql转java对象_关于hibernate中使用sql语句时,类对象的转换问题。
  12. 一个初级python web后端开发工程师的面试总结
  13. 赵海平与张宏波谈编程语言
  14. 微信小程序的background-image使用
  15. nuxt解决首屏加载慢问题_Vue首屏加载慢
  16. 微博html5版网址打不开,网页微博打不开怎么办
  17. Linux 学习笔记16 信号量
  18. Lasso-Logistic回归-R语言应用详解
  19. 软件设计师:06-程序设计语言与语言处理程序基础
  20. FPN:feature pyramid networks for object detection

热门文章

  1. rabbitmq-5-案例1-简单的案例
  2. PHP的 preg_match_all
  3. Linux上用Jenkins执行shell
  4. SQL语句中的select高级用法
  5. 20165310java_blog_week6
  6. IBM Bluemix体验:Containers持久存储
  7. git push -u origin master 上传出错问题
  8. 鸡啄米vc++2010系列40(文档、视图和框架:分割窗口)
  9. Mac下下载android4.2源码,进行源码调试
  10. css结构和重叠之选择器的特殊性