欧束
新浪微博
微信
当前位置:欧束网 » 财经

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

点击蓝字,关注我们




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



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





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


游戏传送门

 https://seeker.niuap.com/

https://powerline.io/


游戏内容介绍


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



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


玩法介绍

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


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



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


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


玩法介绍

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



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


自己动手做一个游戏


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



图片展示的是网页版的2048,这个可能稍微复杂一些,感兴趣的同学可以参考慕课网的免费课程进行学习,也可以直接在 https://www.imooc.com/learn/76 直接下载源代码,运行查看效果。


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


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



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



然后克隆教程代码。


git clone https://github.com/shiyanlou/shiyanlou_cs427


然后进入源码文件夹,并执行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,则使用上面的更新函数进行更新,最后对于有删除方块的行进行补零。


相关报道