亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

200行python代碼實現2048游戲

系統 1932 0

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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品偷伦视频免费观看的 | 国产成人精品午夜二三区 | 精品视频一区二区三区免费 | 日本精品久久久一区二区三区 | 91网站国产 | 成年女人免费看一级人体片 | 欧美国产精品亚洲精品第一区 | 又粗又大的机巴好爽视频视频 | 国产精品一区二区四区 | 国产a视频| 青青青爽在线视频观看 | 色综合亚洲综合网站综合色 | 黄在线免费看 | 九九99精品 | 日韩在线一区视频 | 手机看片神马午夜片 | 白蛇缘起3免费观看 | 免费福利在线播放 | 久久人人网 | 国产精品www视频免费看 | 久色99| 亚洲欧美一区二区三区二厂 | 久久国产99| 亚洲国产高清视频 | 成在线人永久免费播放视频 | 国产精品久久久久久久久久98 | 中文字幕日本不卡 | 久久青青草原精品影院 | 黄色的网站在线观看 | 伊人网站在线观看 | 国产一区精品在线 | 天天操天天操天天射 | 国产日韩精品一区在线观看播放 | 国产中文在线观看 | 久久国产精品久久国产片 | 一本岛高清v不卡免费一三区 | 久久免费视频在线观看30 | 99热久久久这里只有精品免费 | 国产a毛片高清视 | 国产香蕉在线视频一级毛片 | 国产成人在线观看免费网站 |