python基于tkinter制作圖形界面的2048游戲
2048游戲輸出
項(xiàng)目先決條件
前提條件如下:
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()
解釋:
我們?cè)诖a中定義了兩個(gè)類:
1.Board:
變量:
- Bg_color:這是一個(gè)字典,用于存儲(chǔ)每個(gè)單元格的背景色。
- Color:這是一個(gè)字典,用于存儲(chǔ)每個(gè)單元的前景色。
- Window:它是tkinter的主要窗口。
- gameArea:這是一個(gè)tkinter框架小部件。
- gridCell:這是一個(gè)4×4整數(shù)矩陣,存儲(chǔ)所有單元格的實(shí)際整數(shù)值。
- Board:這是tkinter標(biāo)簽小部件的4×4網(wǎng)格,它在tkinter窗口上顯示單元格的值。它還用于根據(jù)其gridCell值配置該單元格的背景和前景。
- Score:它存儲(chǔ)玩家的當(dāng)前分?jǐn)?shù)。
其余只是標(biāo)志變量。
功能:
- __init __(self):這是構(gòu)造函數(shù)。它使用適當(dāng)?shù)哪J(rèn)值初始化所有變量,例如gridCell的默認(rèn)值為“ 0”,移動(dòng),合并的默認(rèn)值為False,等等。
- Reverse:反轉(zhuǎn)gridCell矩陣。
- Transpose:它使用zip函數(shù)并進(jìn)行g(shù)ridCell矩陣的轉(zhuǎn)置。
- CompressGrid:它將所有非空單元格向左移動(dòng),因此可以輕松完成合并。
- mergeGrid:如果兩個(gè)相鄰單元格具有相同的gridCell值,則將它們的gridCell值相加。
- Random_cell:首先將所有空單元格存儲(chǔ)在列表中,然后從創(chuàng)建的列表中選擇一個(gè)隨機(jī)單元格并使其gridCell值2
- Can_merge:返回一個(gè)布爾值,表示我們可以合并任意兩個(gè)單元格。當(dāng)且僅當(dāng)兩個(gè)單元格具有相同的gridCell值時(shí),我們才可以合并它們。
- paintGrid:將前景和背景色分配給4×4網(wǎng)格中與其gridCell值相對(duì)應(yīng)的每個(gè)單元。
2.game:
此類沒(méi)有很多變量,只有一些布爾變量指示游戲狀態(tài)。
功能:
- __init __(self):這是構(gòu)造函數(shù)。它使用適當(dāng)?shù)哪J(rèn)值初始化所有變量。
- 開(kāi)始:調(diào)用random_cell兩次,將'2'賦給兩個(gè)隨機(jī)單元格的gridCell值,然后繪制網(wǎng)格,然后,調(diào)用link_keys鏈接上,下,左和右鍵。
- Link_keys:首先,它檢查游戲是贏還是輸,如果是,則不執(zhí)行任何操作執(zhí)行return語(yǔ)句。否則,它將繼續(xù)執(zhí)行。
方法:
- 對(duì)于左滑動(dòng),我們將先壓縮然后合并gridCell矩陣,然后如果compress或merge為true(指示矩陣的值受前兩個(gè)函數(shù)影響),那么我們需要再次壓縮網(wǎng)格。
- 對(duì)于上移,我們將進(jìn)行移調(diào),然后向左輕掃,然后再次進(jìn)行移調(diào)以返回原始順序。
- 向下移動(dòng)與向上移動(dòng)相同,但是我們需要反轉(zhuǎn)矩陣。
- 同樣,向右與向左+向后移動(dòng)相同。
- 每次操作后,我們需要檢查游戲狀態(tài),如果所有單元都被占用,我們甚至不能合并任何兩個(gè)單元,即沒(méi)有動(dòng)作可以改變矩陣的狀態(tài),則游戲結(jié)束了。
如果任何一個(gè)單元格值都達(dá)到2048,則玩家將獲勝,并且屏幕上會(huì)閃爍一個(gè)消息框,宣布獲勝者。
總結(jié)
我們已經(jīng)成功地用python開(kāi)發(fā)了流行的2048游戲。開(kāi)發(fā)游戲而不是玩別人的游戲非常有趣,現(xiàn)在我們將玩自己開(kāi)發(fā)的游戲。
以上就是python基于tkinter制作圖形界面的2048游戲的詳細(xì)內(nèi)容,更多關(guān)于python 圖形界面2048游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python自帶tkinter庫(kù)實(shí)現(xiàn)棋盤(pán)覆蓋圖形界面
- 如何Tkinter模塊編寫(xiě)Python圖形界面
- python tkinter圖形界面代碼統(tǒng)計(jì)工具(更新)
- 實(shí)現(xiàn)Python圖形界面框架TkInter寫(xiě)GUI界面應(yīng)用簡(jiǎn)介過(guò)程操作
- python tkinter圖形界面代碼統(tǒng)計(jì)工具
- python圖形界面tkinter的使用技巧
- Python Tkinter簡(jiǎn)單布局實(shí)例教程
- Python Tkinter基礎(chǔ)控件用法
- python圖形界面教程Tkinter詳解
相關(guān)文章
pytorch如何利用ResNet18進(jìn)行手寫(xiě)數(shù)字識(shí)別
這篇文章主要介紹了pytorch如何利用ResNet18進(jìn)行手寫(xiě)數(shù)字識(shí)別問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02對(duì)Python2與Python3中__bool__方法的差異詳解
今天小編就為大家分享一篇對(duì)Python2與Python3中__bool__方法的差異詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python collections.deque雙邊隊(duì)列原理詳解
這篇文章主要介紹了Python collections.deque雙邊隊(duì)列原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10python量化之搭建Transformer模型用于股票價(jià)格預(yù)測(cè)
這篇文章主要介紹了python量化之搭建Transformer模型用于股票價(jià)格預(yù)測(cè),文章圍繞主題展開(kāi)基于python搭建Transformer,需要的小伙伴可以參考一下2022-05-05python 統(tǒng)計(jì)代碼行數(shù)簡(jiǎn)單實(shí)例
這篇文章主要介紹了python 統(tǒng)計(jì)代碼行數(shù)簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05Python實(shí)現(xiàn)PS濾鏡中馬賽克效果示例
這篇文章主要介紹了Python實(shí)現(xiàn)PS濾鏡中馬賽克效果,涉及Python基于skimage庫(kù)的圖形馬賽克效果相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01python 回調(diào)函數(shù)和回調(diào)方法的實(shí)現(xiàn)分析
這篇文章主要介紹了python 回調(diào)函數(shù)和回調(diào)方法的實(shí)現(xiàn)分析,需要的朋友可以參考下2016-03-03Python中列表(List) 的三種遍歷(序號(hào)和值)方法小結(jié)
這篇文章主要介紹了Python中列表(List) 的三種遍歷(序號(hào)和值)方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05