Python實戰系列用于記錄實戰項目中的思路,代碼實現,出現的問題與解決方案以及可行的改進方向
本文為第2篇?C200行Python代碼實現2048
一、分析與函數設計
1.1 游戲玩法
2048這款游戲的玩法很簡單,每次可以選擇上下左右滑動,每滑動一次,所有的數字方塊都會往滑動的方向靠攏,系統也會在空白的地方亂數出現一個數字方塊,相同數字的方塊在靠攏、相撞時會相加。(介紹來自百度百科)
1.2 函數設計
- _init _() 初始化4*4游戲地圖,分數等游戲基本數據
- is_gameover() 判斷是否結束游戲
- rannumber() 玩家每次移動時在地圖上隨機生成2、4
- show() 在控制臺打印出4*4游戲地圖
- print_score() 在控制臺打印出當前分數
- up(), upmove() 上移
- down(), downmove() 下移
- left(), leftmove() 左移
- right(), rightmove() 右移
-
nextstep() 讀取玩家按鍵
二、代碼實現
注:IDE為Spyder,Python版本為3.6
# -*- coding: utf-8 -*- """ Created on Sat Sep 29 16:29:04 2018 @author: PastoralDog """ import random class game2048(object): def __init__(self): self.score=0 self.number=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] self.move=0 seed=random.randint(0,15) line=int(seed/4) row=seed%4 self.number[line][row]=2 def is_gameover(self): numbersum=0 for i in range(4): for j in range(4): if (self.number[i][j]!=0): numbersum+=1 if(numbersum!=16): return False for i in range(4): for j in range(3): if(self.number[i][j+1]==self.number[i][j]): return False for i in range(3): for j in range(4): if(self.number[i+1][j]==self.number[i][j]): return False print("游戲結束") print("您的得分為:"+str(self.score)) self.__init__() return True def rannumber(self): rannumber=random.randint(1,10) if(rannumber<=8): rannumber=2 else: rannumber=4 done=0 count=0 for i in range(4): for j in range(4): if(self.number[i][j]==0): count+=1 while(done==0 and count!=0): ranplace=random.randint(0,15) line=int(ranplace/4) row=ranplace%4 if(self.number[line][row]==0): done=1 self.number[line][row]=rannumber def show(self): print(self.number[0]) print(self.number[1]) print(self.number[2]) print(self.number[3]) def print_score(self): print("得分:"+str(self.score)) def upmove(self): for i in range(1,4): for j in range(4): temp=i while(temp>=1 and self.number[temp-1][j]==0): box=self.number[temp-1][j] self.number[temp-1][j]=self.number[temp][j] self.number[temp][j]=box if(self.number[temp][j]!=0):self.move=1 temp-=1 def up(self): self.upmove() for i in range(1,4): for j in range(4): if(self.number[i-1][j]==self.number[i][j]): if(self.number[i-1][j]!=2048): self.score+=self.number[i][j] self.number[i][j]=0 self.number[i-1][j]=2*self.number[i-1][j] self.upmove() if(self.move!=0):self.rannumber() self.move=0 self.show() self.is_gameover() self.print_score() def downmove(self): for i in range(2,-1,-1): for j in range(4): temp=i while(temp<=2 and self.number[temp+1][j]==0 ): box=self.number[temp+1][j] self.number[temp+1][j]=self.number[temp][j] self.number[temp][j]=box if(self.number[temp+1][j]!=0):self.move=1 temp+=1 def down(self): self.downmove() for i in range(2,-1,-1): for j in range(4): if(self.number[i+1][j]==self.number[i][j]): if(self.number[i+1][j]!=2048): self.score+=self.number[i][j] self.number[i][j]=0 self.number[i+1][j]=2*self.number[i+1][j] self.downmove() if(self.move!=0):self.rannumber() self.move=0 self.show() self.is_gameover() self.print_score() def leftmove(self): for i in range(4): for j in range(1,4): temp=j while(temp>=1 and self.number[i][temp-1]==0 ): box=self.number[i][temp-1] self.number[i][temp-1]=self.number[i][temp] self.number[i][temp]=box if(self.number[i][temp-1]!=0):self.move=1 temp-=1 def left(self): self.leftmove() for i in range(4): for j in range(0,3): if(self.number[i][j+1]==self.number[i][j]): if(self.number[i][j+1]!=2048): self.score+=self.number[i][j] self.number[i][j+1]=0 self.number[i][j]=2*self.number[i][j] self.leftmove() if(self.move!=0):self.rannumber() self.move=0 self.show() self.is_gameover() self.print_score() def rightmove(self): for i in range(4): for j in range(2,-1,-1): temp=j while(temp<=2 and self.number[i][temp+1]==0 ): box=self.number[i][temp+1] self.number[i][temp+1]=self.number[i][temp] self.number[i][temp]=box self.move=1 temp+=1 def right(self): self.rightmove() for i in range(4): for j in range(2,-1,-1): if(self.number[i][j+1]==self.number[i][j]): if(self.number[i][j+1]!=2048): self.score+=self.number[i][j] self.number[i][j]=0 self.number[i][j+1]=2*self.number[i][j+1] self.rightmove() if(self.move!=0):self.rannumber() self.move=0 self.show() self.is_gameover() self.print_score() def nextstep(self,step): if(step=='w'): self.up() elif(step=='s'): self.down() elif(step=='a'): self.left() elif(step=='d'): self.right() else: pass if __name__ == '__main__': game=game2048() game.show() while(True): step=input() if(step=='b'):break game.nextstep(step)
三、問題與解決方案
1.地圖的儲存與表示:目前沒有界面設計,因此就用二維數組直接儲存與表示
2.數組越界:調試代碼中遇到過五六次,除了牢記要邊緣檢測外, and 語句左右條件順序也要有講究。
例:
while(temp<=2 and self.number[temp+1][j]==0 )
注:self.number為4*4的二維數組
當
temp=3
時,語句在
temp<=2
被阻塞,不會執行
self.number[temp+1][j]==0
,此時沒有問題;
若語句改為
while(self.number[temp+1][j]==0 and temp<=2),
先執行
self.number[temp+1][j]==0
,此時編譯器報錯數組越界
四、可行的改進方向
1.添加可視化界面,可考慮Tkinter,QT等
2.拓展游戲地圖大小為N x N
本人水平有限,歡迎大家提出問題與建議。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
