用Python做的第一个小样例——控制台2048

来源:互联网 发布:暗黑破坏神2 知乎 编辑:程序博客网 时间:2024/05/18 00:23

        把Python基础学习完,尝试着做一些东西,第一个是最近身边大火的游戏——2048游戏,大部分都是参考网上的内容。尤其是参考http://blog.csdn.net/xiaohui_hubei/article/details/25333775这篇文章。

        2048游戏玩起来十分简单,通过上下左右的不断移动叠加直到score累加到2018为止,游戏失败的条件是直至空格全部填满score<2048,胜利的条件是score=2048。游戏代码主要实现在operation()函数里面,通过这个函数对上下左右的移动进行操作,对于左右移动可以直接移动list,但是对于上下移动,由于list是按行存储的,所以要先对list进行变换,然后再按左右移动的方式进行处理,最后再翻转list得到结果。

       对于翻转list的操作,该篇文章的作者提供的方法是:

vList=[v[row][col] for row in range(4)]
     通过实践,我发现以下方法也可以实现list的翻转:

v_reverse=[[i,j,k,w] for i, j, k, w in zip(*v)]
整个游戏的操作可以分为两部分,一部分是将list向移动的方向(左右)对齐,采用以下函数进行实现:

def align(vList, direction):    for i in range(vList.count(0)):        vList.remove(0)    zeros=[0 for x in range(4-len(vList))]    if direction == 'left':        vList.extend(zeros)    else:        vList[:0] = zeros
另一部分是将对齐后的list向移动方向叠加,叠加条件是如果有相同的就*2,另一侧补0.代码如下:

def addSame(vList, direction):    score = 0    if direction == 'left':        for i in [0, 1, 2]:            if vList[i] == vList[i+1]!=0:                vList[i]*=2                vList[i+1]=0                score+=vList[i]                return {'bool':True, 'score':score}    else:        for i in [3, 2, 1]:            if vList[i]==vList[i-1]!=0:                vList[i-1]*=2                vList[i]=0                score+=vList[i-1]                return {'bool':True, 'score':score}    return {'bool':False, 'score':score}

通过上面两个函数进行处理之后,handle(vList, direction)函数可以这样实现:

def handle(vList, direction):    totalScore = 0    align(vList, direction)    result = addSame(vList, direction)    while result['bool'] == True:        totalScore += result['score']        align(vList , direction)        result=addSame(vList, direction)    return totalScore

0 0
原创粉丝点击