欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

200行python代碼實(shí)現(xiàn)2048游戲

 更新時(shí)間:2019年07月17日 14:31:44   作者:PastoralDog  
這篇文章主要為大家詳細(xì)介紹了200行Python代碼實(shí)現(xiàn)2048游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Python實(shí)戰(zhàn)系列用于記錄實(shí)戰(zhàn)項(xiàng)目中的思路,代碼實(shí)現(xiàn),出現(xiàn)的問(wèn)題與解決方案以及可行的改進(jìn)方向

本文為第2篇–200行Python代碼實(shí)現(xiàn)2048

一、分析與函數(shù)設(shè)計(jì)

1.1 游戲玩法

2048這款游戲的玩法很簡(jiǎn)單,每次可以選擇上下左右滑動(dòng),每滑動(dòng)一次,所有的數(shù)字方塊都會(huì)往滑動(dòng)的方向靠攏,系統(tǒng)也會(huì)在空白的地方亂數(shù)出現(xiàn)一個(gè)數(shù)字方塊,相同數(shù)字的方塊在靠攏、相撞時(shí)會(huì)相加。(介紹來(lái)自百度百科)

1.2 函數(shù)設(shè)計(jì)

  • _init _() 初始化4*4游戲地圖,分?jǐn)?shù)等游戲基本數(shù)據(jù)
  • is_gameover() 判斷是否結(jié)束游戲
  • rannumber() 玩家每次移動(dòng)時(shí)在地圖上隨機(jī)生成2、4
  • show() 在控制臺(tái)打印出4*4游戲地圖
  • print_score() 在控制臺(tái)打印出當(dāng)前分?jǐn)?shù)
  • up(), upmove() 上移
  • down(), downmove() 下移
  • left(), leftmove() 左移
  • right(), rightmove() 右移
  • nextstep() 讀取玩家按鍵

二、代碼實(shí)現(xiàn)

注: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("游戲結(jié)束")
    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)

三、問(wèn)題與解決方案

1.地圖的儲(chǔ)存與表示:目前沒(méi)有界面設(shè)計(jì),因此就用二維數(shù)組直接儲(chǔ)存與表示

2.數(shù)組越界:調(diào)試代碼中遇到過(guò)五六次,除了牢記要邊緣檢測(cè)外, and 語(yǔ)句左右條件順序也要有講究。

例:while(temp<=2 and self.number[temp+1][j]==0 ) 注:self.number為4*4的二維數(shù)組
當(dāng)temp=3時(shí),語(yǔ)句在temp<=2 被阻塞,不會(huì)執(zhí)行self.number[temp+1][j]==0,此時(shí)沒(méi)有問(wèn)題;
若語(yǔ)句改為while(self.number[temp+1][j]==0 and temp<=2), 先執(zhí)行self.number[temp+1][j]==0,此時(shí)編譯器報(bào)錯(cuò)數(shù)組越界

四、可行的改進(jìn)方向

1.添加可視化界面,可考慮Tkinter,QT等

2.拓展游戲地圖大小為N x N

本人水平有限,歡迎大家提出問(wèn)題與建議。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • django foreignkey(外鍵)的實(shí)現(xiàn)

    django foreignkey(外鍵)的實(shí)現(xiàn)

    這篇文章主要介紹了django foreignkey(外鍵)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python中用pycurl監(jiān)控http響應(yīng)時(shí)間腳本分享

    Python中用pycurl監(jiān)控http響應(yīng)時(shí)間腳本分享

    這篇文章主要介紹了Python中用pycurl監(jiān)控http響應(yīng)時(shí)間腳本分享,本文腳本實(shí)現(xiàn)監(jiān)控http相應(yīng)碼,響應(yīng)大小,建立連接時(shí)間,準(zhǔn)備傳輸時(shí)間,傳輸?shù)谝粋€(gè)字節(jié)時(shí)間,完成時(shí)間,需要的朋友可以參考下
    2015-02-02
  • Python xlrd讀取excel日期類(lèi)型的2種方法

    Python xlrd讀取excel日期類(lèi)型的2種方法

    這篇文章主要介紹了Python xlrd讀取excel日期類(lèi)型的2種方法,本文同時(shí)講解了xlrd讀取excel某個(gè)單元格的方法,需要的朋友可以參考下
    2015-04-04
  • 使用k8s部署Django項(xiàng)目的方法步驟

    使用k8s部署Django項(xiàng)目的方法步驟

    這篇文章主要介紹了使用k8s部署Django項(xiàng)目的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python實(shí)現(xiàn)二值掩膜影像去噪與邊緣強(qiáng)化方法詳解

    Python實(shí)現(xiàn)二值掩膜影像去噪與邊緣強(qiáng)化方法詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)二值掩膜影像去噪與邊緣強(qiáng)化方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • Python分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)示例代碼

    Python分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)示例代碼

    在Python中,分支結(jié)構(gòu)通過(guò)if、elif和else關(guān)鍵字來(lái)實(shí)現(xiàn)條件判斷,在使用if語(yǔ)句時(shí),程序會(huì)根據(jù)條件表達(dá)式的真假執(zhí)行相應(yīng)的代碼塊,這篇文章主要介紹了Python分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),需要的朋友可以參考下
    2024-03-03
  • Python urlopen 使用小示例

    Python urlopen 使用小示例

    打開(kāi)一個(gè)網(wǎng)頁(yè)獲取所有的內(nèi)容、獲取Http頭、使用代理等小結(jié)
    2008-09-09
  • Python如何使用隊(duì)列方式實(shí)現(xiàn)多線(xiàn)程爬蟲(chóng)

    Python如何使用隊(duì)列方式實(shí)現(xiàn)多線(xiàn)程爬蟲(chóng)

    這篇文章主要介紹了Python如何使用隊(duì)列方式實(shí)現(xiàn)多線(xiàn)程爬蟲(chóng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python使用requests提交HTTP表單的方法

    Python使用requests提交HTTP表單的方法

    今天小編就為大家分享一篇Python使用requests提交HTTP表單的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Pandas.concat連接DataFrame,Series的示例代碼

    Pandas.concat連接DataFrame,Series的示例代碼

    本文主要介紹了Pandas.concat連接DataFrame,Series的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評(píng)論