干货|北邮大神自制web游戏广受好评,你也可以get同款技能!

游戏家族名字 | 2018-12-24 22:15

上周,北邮人论坛“十大”(每天最火的10个帖子)上有位北邮的学生分享了自己做的一款游戏。

论坛里的同学们对于该游戏的评价也是挺高的,来看看都有哪些评价吧。

看到这么好的评价,小编也忍不住去玩了一下,然后就停不下来了。究竟是什么游戏这么吸引人呢?让我们一起来看看吧。

游戏传送门

游戏内容介绍

打开分享的链接之后,发现有两个游戏,一个叫做“medusa”,另一个叫做“carnie”。顶部还有一个选昵称的,备选的昵称包括“王昭君”、“高渐离”,“虞姬”,“刘邦”,“鲁班七号”等等,看来这位同学也是王者荣耀的爱好者啊。

首先介绍一下“medusa”,这个游戏和之前很火的“贪吃蛇大作战”游戏玩法差不多,具体的玩法介绍如下:

玩法介绍

蛇通过四处移动来获取食物,增长自己的身体。玩家在死亡后会在原地留下食物,可以通过让其他玩家撞上自己的身体来击杀玩家,获取更多的食物。当玩家靠近其他玩家的身体进行移动时,会逐渐提高自己的移动速度。同一局游戏内,玩家数越多,自动刷新食物越少。鼓励玩家去击杀其他玩家。

游戏界面大致像下面图片展示的那样,界面中显示了当前玩游戏的人数,以及实时排行榜。

小编拼死拼活杀了几条蛇并且吃到很多食物得了第一,结果却被一条走位风骚的小蛇杀了,很是不甘心。很想立马再来一局以报仇雪恨!

接下来介绍“carnie”。这个游戏主要目的是“圈地”,圈的地面积达到胜利条件就赢了。

玩法介绍

每个房间限8人进入。头部撞击到自己身体或者边界判定为死亡;头部撞击到其他玩家身体判定为击杀该玩家。胜利条件:当有玩家圈地面积超过70%时,则该玩家获得胜利;房间内每增加一位玩家,胜利条件减少5%。例如,当某房间内有8位玩家,该房间的胜利条件为30%

游戏可玩性还是挺高的,如果想要有更好的体验,可以玩一下该同学分享的参考游戏(powerline.io),这里面玩得人相对多一些,大战起来才更有趣。当然你也可以邀请你的伙伴们一起玩,一个宿舍的大战,或者一整个班的大战。

自己动手做一个游戏

玩完游戏后是不是特别羡慕会做游戏的大佬。别再羡慕啦,赶紧跟着小编一起动手做一个游戏吧。今天我们要做的游戏大家应该都玩过,游戏名字叫做“2048”。

我们要做的使用python来做一个简单的2048游戏。我们需要使用wxPython库。wxPython库是基于python的GUI库,该库是跨平台的,可以在Windows、Linux和Mac上使用。

为了使得整个游戏实现过程更加简单,我们直接使用“实验楼”现有的环境来写游戏。“实验楼”是一个学习编程技能的网站,该网站直接提供了每一个课程的实验上机环境和实验手册,所以我们不再需要另外配置环境就能学习编程。

首先运行“实验楼”实验环境,由于该环境已经安装好了wxPython依赖库,所以我们不用再安装了。

然后克隆教程代码。

然后进入源码文件夹,并执行python文件即可。

cd shiyanlou_cs427 python wx_03_2048.py

最终执行效果如图所示,和网页版相比只是没有移动的动画,其他都差不多。

至此,你已经做出了一个“2048”游戏,接下来为大家介绍主要代码。

主要代码解析

首先是游戏初始化函数,将4×4的格子初始化为0,得分初始化为0,然后随机生成两个数字2或者4。

def initGame(self): self.bgFont = wx.Font(50, wx.SWISS, wx.NORMAL, wx.BOLD, face=u"Roboto") self.scFont = wx.Font(36, wx.SWISS, wx.NORMAL, wx.BOLD, face=u"Roboto") self.smFont = wx.Font(12, wx.SWISS, wx.NORMAL, wx.NORMAL, face=u"Roboto") self.curScore = 0 self.bstScore = 0 self.loadScore() self.data = [[0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0]] count = 0 while count < 2: row = random.randint(0, len(self.data)-1) col = random.randint(0, len(self.data[0])-1) if self.data[row][col] != 0: continue self.data[row][col] = 2 if random.randint(0,1) else 4 count += 1

接着是更新函数,该更新函数主要对移动后得分和方块中数字进行更新。如果是向上移动,则对每一列进行更新,如果每一列中相邻的两个数字相同,则删除其中一个,另一个的分数乘以2,同时得分也相应增加。

def update(self,vlist,direct): score = 0 if direct: #up or left i = 1 while i < len(vlist): if vlist[i-1] == vlist[i]: del vlist[i] vlist[i-1] *= 2 score += vlist[i-1] i += 1 i += 1 else: i = len(vlist)-1 while i > 0: if vlist[i-1] == vlist[i]: del vlist[i] vlist[i-1] *= 2 score += vlist[i-1] i -= 1 i -= 1 return score

接着是上下滑动函数,通过参数up控制向上或者向下滑动。首先复制表格数据,然后对每一列进行处理,如果该列不为0的方块数大于等于2,则使用上面的更新函数进行更新,最后对于有删除方块的列进行补零。

def slideUpDown(self, up): score = 0 numCols = len(self.data[0]) numRows = len(self.data) oldData = copy.deepcopy(self.data) for col in range(numCols): cvl = [self.data[row][col] for row in range(numRows) if self.data[row][col] != 0] if len(cvl) >= 2: score += self.update(cvl, up) for i in range(numRows-len(cvl)): if up: cvl.append(0) else: cvl.insert(0,0) for row in range(numRows): self.data[row][col] = cvl[row] return oldData != self.data,score

接着是左右滑动函数。该函数原理和上下滑动相似。首先复制表格数据,然后对每一行进行处理,如果该行不为0的方块数大于等于2,则使用上面的更新函数进行更新,最后对于有删除方块的行进行补零。

def slideLeftRight(self, left): score = 0 numRows = len(self.data) numCols = len(self.data[0]) oldData = copy.deepcopy(self.data) for row in range(numRows): rvl = [self.data[row][col] for col in range(numCols) if self.data[row][col] != 0] if len(rvl) >= 2: score += self.update(rvl, left) for i in range(numCols-len(rvl)): if left: rvl.append(0) else: rvl.insert(0, 0) for col in range(numCols): self.data[row][col] = rvl[col] return oldData != self.data,score

接着是游戏结束函数。如果不能再进行上下左右滑动,则表示游戏结束了。

def isGameOver(self): copyData = copy.deepcopy(self.data) flag = False if not self.slideUpDown(True)[0] and not self.slideUpDown(False)[0] and \ not self.slideLeftRight(True)[0] and not self.slideLeftRight(False)[0]: flag = True if not flag: self.data = copyData return flag

最后是如何控制上下左右滑动的函数。该函数接收键盘的方向键,并执行相应的函数,完成滑动更新操作。

def onKeyDown(self,event): keyCode = event.GetKeyCode() if keyCode == wx.WXK_UP: self.doMove(*self.slideUpDown(True)) elif keyCode == wx.WXK_DOWN: self.doMove(*self.slideUpDown(False)) elif keyCode == wx.WXK_LEFT: self.doMove(*self.slideLeftRight(True)) elif keyCode == wx.WXK_RIGHT: self.doMove(*self.slideLeftRight(False))

主要代码已经分析完了,如果想要了解更多,获取所有代码,请点击“阅读原文”。如果喜欢本文的话,记得关注我们并分享给周围的同学哦。

获取更多资讯

记得关注我们哦