简单的2048游戏就不多说了,上图就知道了。这里没有GUI之类的东西。如果需要,你可以自己实现:下一步是代码模块。网上有很多2048的游戏,就不详细写了。起来了,都写在笔记里了。唯一需要注意的是,需要先了解矩阵的转置,importrandomboard=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]#打印游戏界面defdisplay(board,score):print('{0:4}{1:4}{2:4}{3:4}'.format(board[0][0],board[0][1],board[0][2],board[0][3]))print('{0:4}{1:4}{2:4}{3:4}'.format(board[1][0],board[1][1],board[1][2],board[1][3]))打印('{0:4}{1:4}{2:4}{3:4}'.format(board[2][0],board[2][1],board[2][2],board[2][3]))打印('{0:4}{1:4}{2:4}{3:4}'.format(board[3][0],board[3][1],board[3][2],board[3][3]),'score:',score)#初始化游戏,在4*4中随机生成两个2definit(board):#先将游戏重置为0foriinrange(4):forjinrange(4):board[i][j]=0#随机生成两个保存位置for2randomposition=random.sample(range(0,15),2)board[int(randomposition[0]/4)][randomposition[0]%4]=2board[int(randomposition[1]/4)][randompositionion[1]%4]=2defaddSameNumber(boardList,direction):'''需要在列表中找到相邻的相同数字并相加,返回增加的分数:paramboardList:两个经过对齐的非-零个数维数数组:paramdirection:direction=='left'从右向左查找,找到两个相同且相邻的数,将左边的数翻倍,将右边的数设为0direction=='right'从左向右查找,找到相同且相邻的两个数,将右边的数翻倍,将左边的数置0:return:'''addNumber=0#向左向上运算ifdirection=='left':foriin[0,1,2]:ifboardList[i]==boardList[i+1]!=0:boardList[i]*=2boardList[i+1]=0addNumber+=boardList[i]return{'continueRun':True,'addNumber':addNumber}return{'continueRun':False,'addNumber':addNumber}#向右向下操作else:foriin[3,2,1]:ifboardList[i]==boardList[i-1]!=0:boardList[i]*=2boardList[i-1]=0addNumber+=boardList[i]return{'continueRun':True,'addNumber':addNumber}rreturn{'continueRun':False,'addNumber':addNumber}defalign(boardList,direction):'''alignnon-zeronumbersdirection=='left':向左对齐,例如[8,0,0,2][8,2,0,0]afterleftalignment=='right':右对齐,例如[8,0,0,2][0,0,8,2]afterrightalignment'''#先去掉list中的0,比如[8,0,0,2]->[8,2],1.先找到0的个数,然后根据这个个数进行清理#boardList.remove(0):move删除列表中第一次出现的值,因此[8,0,0,2]会删除0两次forxinrange(boardList.count(0)):boardList.remove(0)#The删除0被添加回来,[8,2]->[8,2,0,0]如果方向=='left':boardList.extend([0forxinrange(4-len(boardList))])else:boardList[:0]=[0forxinrange(4-len(boardList))]defhandle(boardList,direction):'''处理一行(列)中的数据得到最后一行(列))数字状态值,返回score:paramboardList:列表结构,按行(列)存放数据:paramdirection:移动方向,上和左都使用方向'left',右和下都使用'right':return:返回某行(列)处理后的加分'''addscore=0#先处理数据,按指定方向移动数据align(boardList,direction)result=addSameNumber(boardList,direction)#当result['continueRun']为True时,表示再次执行whileresult['continueRun']:#重新对齐,然后重新执行合并,直到不能再合并addscore+=result['addNumber']align(boardList,direction)result=addSameNumber(boardList,direction)#直到执行完毕,一行中没有相同的数据return{'addscore':addscore}#游戏操作函数,根据移动方向重新计算矩阵状态值,记录得分defoperator(board):#每次操作添加的分数,以及操作后游戏是否触发结束状态(即数据占位)addScore=0gameOver=False#默认leftdirection='left'op=input("Pleaseenteryouroperation:")ifopin['a','A']:#Directiontotheleftdirection='left'#Processrowbyrowforrowinrange(4):addScore+=handle(board[row],direction)['addscore']elifopin['d','D']:direction='right'forrowinrange(4):addScore+=handle(board[row],direction)['addscore']elifopin['w','W']:#向上相当于向左转置处理direction='left'board=list(map(list,zip(*board)))#逐行处理forrowinrange(4):addScore+=handle(board[row],direction)['addscore']board=list(map(list,zip(*board)))elifopin['s','S']:#Down相当于右转Handledirection='right'board=list(map(list,zip(*board)))#逐行处理范围内的行(4):addScore+=handle(board[row],direction)['addscore']board=list(map(list,zip(*board)))else:print("输入错误!请输入[W,S,A,D]或对应的小写字母")return{'gameOver':gameOver,'addScore':addScore,'board':board}#每次运算后,需要判断0的个数。如果满了,游戏结束number_0=0forqinboard:#count(0)指的是0的个数,就是每行扫描的number_0+=q.count(0)#如果number_0为0,则表示满了ifnumber_0==0:gameOver=Truereturn{'gameOver':gameOver,'addScore':addScore,'board':board}#表示还没有满,在空的地方加一个2或者4position,概率是3:1else:addnum=random.choice([2,2,2,4])position_0_list=[]#找出0的位置,并保存为iinrange(4):对于范围(4)中的j:如果board[i][j]==0:position_0_list.append(i*4+j)#在刚才记录的0位置随机找一个,替换为生成的2或4randomposition=random.sample(position_0_list,1)board[int(randomposition[0]/4)][randomposition[0]%4]=addnumreturn{'gameOver':gameOver,'addScore':addScore,'board':board}if__name__=='__main__':print('Input:W(Up)S(Down)A(Left)D(Right).')#初始化游戏界面,游戏得分gameOver=Falseinit(board)score=0#如果游戏是没有结束,它会一直运行whilegameOver!=True:display(board,score)operator_result=operator(board)board=operator_result['board']ifoperator_result['gameOver']==True:print("Thegameisover,你输了!”)print("Yourfinalscore:",score)gameOver=operator_result['gameOver']breakelse:#添加这一步的分数+=operator_result['addScore']ifscore>=2048:print("牛妞,你挂了!")print("你的最终得分:",score)#结束游戏gameOver=Truebreak
