python基于tkinter制作圖形界面的2048游戲
2048游戲輸出

項目先決條件
前提條件如下:
1. Python
2. Tkinter
創(chuàng)建main.py
代碼:
from tkinter import *
from tkinter import messagebox
import random
class Board:
bg_color={
'2': '#eee4da',
'4': '#ede0c8',
'8': '#edc850',
'16': '#edc53f',
'32': '#f67c5f',
'64': '#f65e3b',
'128': '#edcf72',
'256': '#edcc61',
'512': '#f2b179',
'1024': '#f59563',
'2048': '#edc22e',
}
color={
'2': '#776e65',
'4': '#f9f6f2',
'8': '#f9f6f2',
'16': '#f9f6f2',
'32': '#f9f6f2',
'64': '#f9f6f2',
'128': '#f9f6f2',
'256': '#f9f6f2',
'512': '#776e65',
'1024': '#f9f6f2',
'2048': '#f9f6f2',
}
def __init__(self):
self.window=Tk()
self.window.title('ProjectGurukul 2048 Game')
self.gameArea=Frame(self.window,bg= 'azure3')
self.board=[]
self.gridCell=[[0]*4 for i in range(4)]
self.compress=False
self.merge=False
self.moved=False
self.score=0
for i in range(4):
rows=[]
for j in range(4):
l=Label(self.gameArea,text='',bg='azure4',
font=('arial',22,'bold'),width=4,height=2)
l.grid(row=i,column=j,padx=7,pady=7)
rows.append(l)
self.board.append(rows)
self.gameArea.grid()
def reverse(self):
for ind in range(4):
i=0
j=3
while(i<j):
self.gridCell[ind][i],self.gridCell[ind][j]=self.gridCell[ind][j],self.gridCell[ind][i]
i+=1
j-=1
def transpose(self):
self.gridCell=[list(t)for t in zip(*self.gridCell)]
def compressGrid(self):
self.compress=False
temp=[[0] *4 for i in range(4)]
for i in range(4):
cnt=0
for j in range(4):
if self.gridCell[i][j]!=0:
temp[i][cnt]=self.gridCell[i][j]
if cnt!=j:
self.compress=True
cnt+=1
self.gridCell=temp
def mergeGrid(self):
self.merge=False
for i in range(4):
for j in range(4 - 1):
if self.gridCell[i][j] == self.gridCell[i][j + 1] and self.gridCell[i][j] != 0:
self.gridCell[i][j] *= 2
self.gridCell[i][j + 1] = 0
self.score += self.gridCell[i][j]
self.merge = True
def random_cell(self):
cells=[]
for i in range(4):
for j in range(4):
if self.gridCell[i][j] == 0:
cells.append((i, j))
curr=random.choice(cells)
i=curr[0]
j=curr[1]
self.gridCell[i][j]=2
def can_merge(self):
for i in range(4):
for j in range(3):
if self.gridCell[i][j] == self.gridCell[i][j+1]:
return True
for i in range(3):
for j in range(4):
if self.gridCell[i+1][j] == self.gridCell[i][j]:
return True
return False
def paintGrid(self):
for i in range(4):
for j in range(4):
if self.gridCell[i][j]==0:
self.board[i][j].config(text='',bg='azure4')
else:
self.board[i][j].config(text=str(self.gridCell[i][j]),
bg=self.bg_color.get(str(self.gridCell[i][j])),
fg=self.color.get(str(self.gridCell[i][j])))
class Game:
def __init__(self,gamepanel):
self.gamepanel=gamepanel
self.end=False
self.won=False
def start(self):
self.gamepanel.random_cell()
self.gamepanel.random_cell()
self.gamepanel.paintGrid()
self.gamepanel.window.bind('<Key>', self.link_keys)
self.gamepanel.window.mainloop()
def link_keys(self,event):
if self.end or self.won:
return
self.gamepanel.compress = False
self.gamepanel.merge = False
self.gamepanel.moved = False
presed_key=event.keysym
if presed_key=='Up':
self.gamepanel.transpose()
self.gamepanel.compressGrid()
self.gamepanel.mergeGrid()
self.gamepanel.moved = self.gamepanel.compress or self.gamepanel.merge
self.gamepanel.compressGrid()
self.gamepanel.transpose()
elif presed_key=='Down':
self.gamepanel.transpose()
self.gamepanel.reverse()
self.gamepanel.compressGrid()
self.gamepanel.mergeGrid()
self.gamepanel.moved = self.gamepanel.compress or self.gamepanel.merge
self.gamepanel.compressGrid()
self.gamepanel.reverse()
self.gamepanel.transpose()
elif presed_key=='Left':
self.gamepanel.compressGrid()
self.gamepanel.mergeGrid()
self.gamepanel.moved = self.gamepanel.compress or self.gamepanel.merge
self.gamepanel.compressGrid()
elif presed_key=='Right':
self.gamepanel.reverse()
self.gamepanel.compressGrid()
self.gamepanel.mergeGrid()
self.gamepanel.moved = self.gamepanel.compress or self.gamepanel.merge
self.gamepanel.compressGrid()
self.gamepanel.reverse()
else:
pass
self.gamepanel.paintGrid()
print(self.gamepanel.score)
flag=0
for i in range(4):
for j in range(4):
if(self.gamepanel.gridCell[i][j]==2048):
flag=1
break
if(flag==1): #found 2048
self.won=True
messagebox.showinfo('2048', message='You Wonnn!!')
print("won")
return
for i in range(4):
for j in range(4):
if self.gamepanel.gridCell[i][j]==0:
flag=1
break
if not (flag or self.gamepanel.can_merge()):
self.end=True
messagebox.showinfo('2048','Game Over!!!')
print("Over")
if self.gamepanel.moved:
self.gamepanel.random_cell()
self.gamepanel.paintGrid()
gamepanel =Board()
game2048 = Game( gamepanel)
game2048.start()
解釋:
我們在代碼中定義了兩個類:
1.Board:
變量:
- Bg_color:這是一個字典,用于存儲每個單元格的背景色。
- Color:這是一個字典,用于存儲每個單元的前景色。
- Window:它是tkinter的主要窗口。
- gameArea:這是一個tkinter框架小部件。
- gridCell:這是一個4×4整數(shù)矩陣,存儲所有單元格的實際整數(shù)值。
- Board:這是tkinter標簽小部件的4×4網(wǎng)格,它在tkinter窗口上顯示單元格的值。它還用于根據(jù)其gridCell值配置該單元格的背景和前景。
- Score:它存儲玩家的當前分數(shù)。
其余只是標志變量。
功能:
- __init __(self):這是構(gòu)造函數(shù)。它使用適當?shù)哪J值初始化所有變量,例如gridCell的默認值為“ 0”,移動,合并的默認值為False,等等。
- Reverse:反轉(zhuǎn)gridCell矩陣。
- Transpose:它使用zip函數(shù)并進行g(shù)ridCell矩陣的轉(zhuǎn)置。
- CompressGrid:它將所有非空單元格向左移動,因此可以輕松完成合并。
- mergeGrid:如果兩個相鄰單元格具有相同的gridCell值,則將它們的gridCell值相加。
- Random_cell:首先將所有空單元格存儲在列表中,然后從創(chuàng)建的列表中選擇一個隨機單元格并使其gridCell值2
- Can_merge:返回一個布爾值,表示我們可以合并任意兩個單元格。當且僅當兩個單元格具有相同的gridCell值時,我們才可以合并它們。
- paintGrid:將前景和背景色分配給4×4網(wǎng)格中與其gridCell值相對應(yīng)的每個單元。
2.game:
此類沒有很多變量,只有一些布爾變量指示游戲狀態(tài)。
功能:
- __init __(self):這是構(gòu)造函數(shù)。它使用適當?shù)哪J值初始化所有變量。
- 開始:調(diào)用random_cell兩次,將'2'賦給兩個隨機單元格的gridCell值,然后繪制網(wǎng)格,然后,調(diào)用link_keys鏈接上,下,左和右鍵。
- Link_keys:首先,它檢查游戲是贏還是輸,如果是,則不執(zhí)行任何操作執(zhí)行return語句。否則,它將繼續(xù)執(zhí)行。
方法:
- 對于左滑動,我們將先壓縮然后合并gridCell矩陣,然后如果compress或merge為true(指示矩陣的值受前兩個函數(shù)影響),那么我們需要再次壓縮網(wǎng)格。
- 對于上移,我們將進行移調(diào),然后向左輕掃,然后再次進行移調(diào)以返回原始順序。
- 向下移動與向上移動相同,但是我們需要反轉(zhuǎn)矩陣。
- 同樣,向右與向左+向后移動相同。
- 每次操作后,我們需要檢查游戲狀態(tài),如果所有單元都被占用,我們甚至不能合并任何兩個單元,即沒有動作可以改變矩陣的狀態(tài),則游戲結(jié)束了。
如果任何一個單元格值都達到2048,則玩家將獲勝,并且屏幕上會閃爍一個消息框,宣布獲勝者。
總結(jié)
我們已經(jīng)成功地用python開發(fā)了流行的2048游戲。開發(fā)游戲而不是玩別人的游戲非常有趣,現(xiàn)在我們將玩自己開發(fā)的游戲。
以上就是python基于tkinter制作圖形界面的2048游戲的詳細內(nèi)容,更多關(guān)于python 圖形界面2048游戲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pytorch如何利用ResNet18進行手寫數(shù)字識別
這篇文章主要介紹了pytorch如何利用ResNet18進行手寫數(shù)字識別問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
對Python2與Python3中__bool__方法的差異詳解
今天小編就為大家分享一篇對Python2與Python3中__bool__方法的差異詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Python collections.deque雙邊隊列原理詳解
這篇文章主要介紹了Python collections.deque雙邊隊列原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
python量化之搭建Transformer模型用于股票價格預(yù)測
這篇文章主要介紹了python量化之搭建Transformer模型用于股票價格預(yù)測,文章圍繞主題展開基于python搭建Transformer,需要的小伙伴可以參考一下2022-05-05
python 回調(diào)函數(shù)和回調(diào)方法的實現(xiàn)分析
這篇文章主要介紹了python 回調(diào)函數(shù)和回調(diào)方法的實現(xiàn)分析,需要的朋友可以參考下2016-03-03
Python中列表(List) 的三種遍歷(序號和值)方法小結(jié)
這篇文章主要介紹了Python中列表(List) 的三種遍歷(序號和值)方法小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

