2048是之前很火的一款很火的小游戏,用过操控上下左右来进行游戏,最终达到2048即为胜利
游戏主体继承Tk类,先用一个Frame布局游戏上方的积分,记录和重新开始按钮,再一个用Frame网格布局游戏的16个格子
def initWindow(self):
bar=Frame(self)
bar.grid()
#初始化界面窗口的积分,记录和重新开始按钮
self.t = Label(bar, justify=LEFT, font=("Verdana", 25, "bold"))
self.t.pack(side='left')
Button(bar, text="重新\n开始", command=self.initMatrix,width=7,font=("Verdana", 20, "bold"),bg=BACKGROUND_COLOR).pack(side='right')
background = Frame(self, bg=BACKGROUND_COLOR)
background.grid()
self.gameGrid = []
#初始化界面窗口中游戏的格子
for i in range(GAME_SIZE):
x = []
for j in range(GAME_SIZE):
t = Label(background, justify=CENTER, font=("Verdana", 40, "bold"), width=4, height=2)
t.grid(row=i, column=j, padx=5, pady=5)
x.append(t)
self.gameGrid.append(x)
w上 s下 a左 d右
用一个二维list当作矩阵储存4*4格子中的数字,以向上操作为例:
1.移动:遍历矩阵每一列格子,将矩阵每一列格子中的非零数字全部向上移动
2.合并:遍历矩阵每一列格子,若矩阵每一列格子两个相邻的格子中的数字相同且非零则进行合并,上方的格子中的数字为原来的两倍,下方的格子置位零
3.移动:同1一样遍历矩阵每一列格子,将合并后矩阵每一列格子中的非零数字全部向上移动
4.若操作前后矩阵相等,则这个操作有效
#将矩阵中的数字从下边移动到上边
#将矩阵中的数字从下边移动到上边
for i in range(GAME_SIZE):
count=0
for j in range(GAME_SIZE):
if mat[j][i]!=0:
newMatrix[count][i]=mat[j][i]
count+=1
#向上合并将矩阵中相邻的数值相同且不为零的数字
for i in range(GAME_SIZE):
for j in range(GAME_SIZE-1):
if newMatrix[j][i]==newMatrix[j+1][i] and newMatrix[j][i]!=0:
newMatrix[j][i]*=2
newGrade+=newMatrix[j][i]
newMatrix[j+1][i]=0
首先给出游戏简介窗口,当用户点击确定时进入游戏并关闭简介窗口。
1.首先生成一个全为0的4*4的矩阵,在矩阵数值为0的位置生成两个2,进行显示
2.不断的接收用户的键入,对矩阵进行相应的操作。
3.若操作有效,则在操作后判断矩阵的状态。若矩阵中有2048产生则,游戏胜利,此外若矩阵已满,且没有相邻的两个格子数值相等则游戏失败。
4.若游戏继续且矩阵不满,则在矩阵数值为0的位置生成2/4,更新界面显示,重复2到4的操作
def getState(self):
#矩阵中出现2048,胜利
for x in self.matrix:
if 2048 in x:
return 1
#矩阵中有空位,游戏继续
for x in self.matrix:
if 0 in x:
return 0
#矩阵已满但可以进行合并,即左右或者上下有相邻的数值相同的数字,游戏继续
for i in range(GAME_SIZE):
for j in range(GAME_SIZE-1):
if self.matrix[i][j]==self.matrix[i][j+1] or self.matrix[j][i]==self.matrix[j+1][i]:
return 0
#否则游戏失败
return -1
#在矩阵中产生新的2或者4
def getNewNumber(self):
index_x=randint(0, GAME_SIZE - 1)
index_y=randint(0, GAME_SIZE - 1)
#随机找到为0的坐标
while self.matrix[index_x][index_y] != 0:
index_x=randint(0, GAME_SIZE - 1)
index_y=randint(0, GAME_SIZE - 1)
if self.grade>2048:#游戏当前的分数大于一定的值产生2或者4
self.matrix[index_x][index_y] = randint(1, 2)*2
else:
self.matrix[index_x][index_y] = 2
#在矩阵中产生新的2或者4
def getNewNumber(self):
index_x=randint(0, GAME_SIZE - 1)
index_y=randint(0, GAME_SIZE - 1)
#随机找到为0的坐标
while self.matrix[index_x][index_y] != 0:
index_x=randint(0, GAME_SIZE - 1)
index_y=randint(0, GAME_SIZE - 1)
if self.grade>2048:#游戏当前的分数大于一定的值产生2或者4
self.matrix[index_x][index_y] = randint(1, 2)*2
else:
self.matrix[index_x][index_y] = 2
游戏详细代码链接: link.