坦克动荡,程序作品(2)——坦克动荡(联机版)

筹划

读过(←点击文字跳转)的都知道,坦克动荡是一款刺激的双人单机游戏,但是这样就意味着两个人必须挤在同一台电脑上共用一个键盘进行游戏,使得游戏体验大打折扣。

为了解决这个问题,我决定改进坦克动荡的代码,使用户能够使用两台电脑联机进行游戏,增加游戏的实用性。

我们在生活中经常见到的通信软件和联机游戏都需要服务器参与传输数据,各个用户的设备与服务器建立通信连接并向服务器发送和接收服务器传来的信息,而服务器则是用于集散、管理这些信息。

使用服务器进行通信固然有它的优点,比如说服务器有固定的IP地址,因此用户在每次与服务器连接的时候不需要更改连接的对象;但是服务器的缺点也有很多,比如它会使游戏的开发和运营费用极其高昂,也很容易由于用户连接量过大而崩溃。

因此,我的这款联机软件采用另外一种通信方式,将一个用户的电脑变成服务器,而另一个用户只需与该用户的电脑进行通信即可。

下面我们就来写代码实现一下

编写程序

1.1socket通信

python中有一个自带的库叫做socket,可以实现服务器通讯。这里我们就采用这个库。

但是socket库单独使用会带来很多麻烦,因为网络通讯传输的都是二进制编码,这就意味着我们必须把python运行时使用的变量、列表等数据结构转换成字符串再转换成二进制编码才能进行传输。这就使得编码和解码的时候非常容易出现错误,特别是传输列表这样的大规模数据结构的时候。

因此我选择结合使用json这个库,json中的一个功能就是将列表直接转换成能被发送的二进制信息,并且还能轻易地转换回来。这给信息的传输带来非常大的便利。

1.2 多线程

就像我们(←点击文字跳转)提到的turtle.onscreenclick()这个函数一样,socket通信也需要用到多线程,因为这样可以避免主程序的卡顿等因素打断两台电脑间的信息传输。

多线程我选择使用python自带的threading库来解决。我们需要事先定义一个需要被创建线程的函数(这里就是指的我们的通信函数),然后再用threading库运行它。代码大致如下:

import threading

deffun():#一个函数,里面可以是任意代码,表示我们要在另外一个线程里实现的功能

p=threading.Thread(target=fun)p.start()#fun函数开始执行

1.3分配计算任务

由于在联机的时候程序可以调用两台计算机的算力,因此对要计算的任务进行一个合理的分配尤为重要。这里我选择将子弹的飞行、子弹与坦克的碰撞检测等功能统统交给作为服务器的那台电脑进行计算,而作为客户的那台电脑只需要检测自己的用户的移动和射击输入并且传给服务器电脑即可。

由于代码非常的复杂(以至于我写完了自己都看不懂),所以这里我只给大家讲一下大致思路:

服务器电脑:

检测自己的用户的射击输入,并将射击增加的子弹存入到本地的子弹列表里

接受客户电脑发来的另外一名用户射击所增加的子弹,存到本地的子弹列表里

检测自己的用户的移动输入,并且控制坦克移动到相应位置

接受客户电脑发来的另一名用户的移动输入,并控制相应坦克移动到相应位置

对坦克、子弹、墙的位置关系进行分析,判断是否有子弹击中坦克或者撞到墙,并视情况对数据做相应更改

将双方坦克目前的位置、血量,所有子弹的信息发给客户电脑

发送一个叫conmark的变量,它的作用下面再讲

客户的电脑

检测用户射击输入,并将射击增加的子弹传给服务器

检测用户移动输入,并将我方坦克的移动情况发给服务器

接受服务器发来的坦克的位置、血量,子弹的信息等,并进行相应显示

接受一个叫conmark的变量

1.4判断输赢

双方的输赢同样也是由服务器电脑判断的,并且由conmark这个变量进行传输。conmark这个变量有很多用处。程序最开始它是0;当服务器电脑与客户电脑建立了连接,它的值变为1,标记着游戏的开始;当它的值变为2或3时,则标志着有一方坦克获胜了,这时双方电脑就会做出相应显示。由于conmark是不断被发送、实时同步的,因此双方电脑对输赢结果的显示也是同步的。

总结

这次对坦克动荡的改进对我来说是一个不小的挑战,过程中也遇到了很多很难解释的bug(有很多我到现在也没有明白,只是绕开了而已)。总体来说,这次的改进还是非常成功的,以联机的方式复刻了单机时的大部分功能,只是没有增加重新开始的选项。

我已经将程序源代码的文件放在了“阅读原文”处,提取码:f0r3

版权声明:本站内容由互联网用户投稿自发贡献或转载于互联网,文章观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至2024tuiguang@gmail.com举报,一经查实,本站将立刻删除。

合作:2024tuiguang@gmail.com