一、背景介绍与引用
最近在重温python,加上一点私心,想要编一个有图像界面的2048程序。
我曾经想过在论坛里面找一个类似的,但是搜索了很久都找不到合适的,有的是只有控制台界面,有的实在是不好自制。最终,我找到了一个非常合适的解决方案(下面会放出链接)。但是我只是采用了其中图形界面的设定,具体的算法还有图形我是自己设计的,原因是原作者在规则上与2048有些不符(比如当移动并不改变现在的顺序时,不产生新的随机块)。
下面放出引用作者的原贴链接
感谢@彡楠风丶吹
Python写2048小游戏全部代码及所用图片
二、源代码
虽然算法是自己写的,但我采用了 @彡楠风丶吹 的源代码方案,把源代码分了三部分:游戏算法、游戏图形和游戏运行。
首先是算法部分:GameCalculation.py,这部分包含了主要的内部算法过程,主要是上下左右移动、添加随机数、游戏规则。其中,上下左右移动的过程是先移动后合并然后再次移动。下面是这部分的代码:
import numpy as np
import random as rd
def Up(GameList):#向上移动
NewList1=np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]])#用两个零矩阵过渡
NewList2=np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]])#懒得用zeros了
for j in range(4):#先储存非零量在赋值给新列表
NoneZeroList = []
for i in range(4):
if GameList[i,j]!=0:
NoneZeroList.append(GameList[i,j])
for k in range(len(NoneZeroList)):
NewList1[k,j]=NoneZeroList[k]
for j in range(4):#相同值合并
for i in range(3):
if NewList1[i,j]==NewList1[i+1,j]:
NewList1[i,j]=NewList1[i,j]*2
NewList1[i+1,j]=0
for j in range(4):#合并后再移动
NoneZeroList=[]
for i in range(4):
if NewList1[i,j]!=0:
NoneZeroList.append(NewList1[i,j])
for k in range(len(NoneZeroList)):
NewList2[k,j]=NoneZeroList[k]
NoneSame=0
for i in range(4):
for j in range(4):
if GameList[i,j]!=NewList2[i,j]:
NoneSame=1
break
if NoneSame==1:
for i in range(4):
for j in range(4):
GameList[i,j]=NewList2[i,j]
return 1
else:
return 0
def Down(GameList):
NewList1=np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]])
NewList2=np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]])
for j in range(4