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

python實(shí)現(xiàn)推箱子游戲

 更新時(shí)間:2020年03月25日 09:13:42   作者:果7  
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了python實(shí)現(xiàn)推箱子游戲的具體代碼,供大家參考,具體內(nèi)容如下

題目描述:

最短路徑為:

uurrDDDDuuuulldRurDDDrddLLrruLuuulldRurDDDrdL

u表示向上,d表示向下,l表示向左,r表示向右。

大寫(xiě)表示人推著箱子一起動(dòng),小寫(xiě)表示人自己走。

代碼用BFS實(shí)現(xiàn)。狀態(tài)要分推著箱子一起走和人單獨(dú)走,這兩種狀態(tài)轉(zhuǎn)移是不同的。

由于代碼中注釋較詳細(xì),這里不過(guò)多解釋。

代碼:

# -*- coding: utf-8 -*-
# @Time : 2017/8/10 上午9:42
# @Author : Qi MO
# @File : BFS.py
# @Software: PyCharm Community Edition
 
level_file_path = '../數(shù)據(jù)/level_file.txt'
 
class GameShortest:
 def __init__(self,line, col=10):
  """
  給一個(gè)圖,長(zhǎng)度為100的字符串表示。
  0空地 1墻 2箱子起始位置 3箱子終點(diǎn)位置 4人的起始位置
  :param line: 地圖,用字符串表示。如代碼最后的每一行表示每一關(guān)的地圖。
  :param col: 地圖的長(zhǎng)寬,由于設(shè)定為10*10,默認(rèn)為10
  """
 
  self.line = line
  # sta和en 表示開(kāi)始的狀態(tài),結(jié)束的狀態(tài)
  # sta只有2,4,0 2表示箱子開(kāi)始位置,4表示人的位置,0表示其他。
  # en只有1,3,0 1表示墻,3表示箱子結(jié)束位置,0表示其他。
  # 現(xiàn)在只需要把sta狀態(tài)中的2位置移動(dòng)到en的3的位置即滿足條件
  self.sta = ''
  self.en = ''
  self.col = col
  # px, py表示4的位置
  self.px,self.py = -1,-1
  # paths記錄最短路徑(可能有多條)
  self.paths = []
  # len記錄最短路徑長(zhǎng)度 如
  self.len = -1
 
  self.pre()
  self.BFS()
  print(self.paths)
 
 def pre(self):
  """
  1.獲得sta開(kāi)始狀態(tài)和en結(jié)束狀態(tài)
  2.獲得人的起始位置px,py
  代碼最后的第一關(guān)的地圖可視化為
  1111111111
  1111111111
  1110001111
  1110221111
  1114201111
  1111100111
  1111300111
  1113300111
  1111111111
  1111111111
  :return:
  """
  mp = []
  for pos in range(0, 100, 10):
   mp.append(self.line[pos:pos + 10])
  # print(self.line)
  # for x in mp:
  #  print(x)
 
  for pos, enum in enumerate(self.line):
   cx, cy = pos // 10, pos % 10
   if enum == '4':
    self.px, self.py = cx, cy
  # 現(xiàn)在只需要把sta開(kāi)始的狀態(tài)中的2位置移動(dòng)到en的3的位置即滿足條件
  staDic = {'0': '0', '1': '0', '2': '2', '3': '0', '4': '4'}
  enDic = {'0': '0', '1': '1', '2': '0', '3': '3', '4': '0'}
  for x in self.line:
   self.sta += staDic[x]
   self.en += enDic[x]
  # print(self.sta)
  # print(self.en)
 
 def is_ok(self,sta):
  """
  sta狀態(tài)中的2位置移動(dòng)到en的3的位置。
  :param sta:
  :return:
  """
  for s,e in zip(sta,self.en):
   if e == '3' and s != '2':
    return False
  return True
 
 def BFS(self):
  """
  BFS獲得最短路徑保存到paths中
  :return:
  """
  # 4個(gè)方向,小寫(xiě)代表只是人移動(dòng),大寫(xiě)表示人推著箱子一起移動(dòng)
  dirs = [[-1,0,'u','U'],[1,0,'d','D'],[0,1,'r','R'],[0,-1,'l','L']]
  # 把開(kāi)始的狀態(tài)進(jìn)入隊(duì)列(list模擬),狀態(tài)包括字符串表示的當(dāng)前狀態(tài)、當(dāng)前的路徑、當(dāng)前人的位置
  states = [[self.sta,'',self.px,self.py]]
  # 訪問(wèn)數(shù)組(dict模擬),訪問(wèn)過(guò)的狀態(tài)(字符串)不再訪問(wèn)
  visi = {}
  visi[self.sta] = 1
 
  s_len = 1000
  while len(states)>0:
   sta, path, px, py = states[0]
   # 4狀態(tài)的位置
   ppos = px*self.col + py
   states = states[1:]
   if len(path)>s_len:
    break
   # 保存最短路徑到paths中
   if self.is_ok(sta):
    if self.len == -1 or len(path) == self.len:
     self.paths.append(path)
     self.len = len(path)
    continue
 
   for dir in dirs:
    cx, cy = px + dir[0], py + dir[1]
    # 4挨著的狀態(tài)的位置
    pos = cx*self.col+cy
    nx, ny = px + 2*dir[0], py + 2*dir[1]
    # 4挨著挨著的狀態(tài)的位置
    npos = nx*self.col+ny
    if not (nx>=0 and nx<self.col and ny>=0 and ny<self.col):
     continue
    # python中字符串不可更改,于是把字符串變成list更改狀態(tài)后再轉(zhuǎn)換為字符串
    if sta[pos] == '2' and sta[npos] == '0' and self.en[npos] != '1':
    # 人和箱子一起推動(dòng),sta中連著的狀態(tài)為4 2 0,en中第三個(gè)不能為1。推完之后sta變?yōu)? 4 2
     digits = [int(x) for x in sta]
     digits[ppos],digits[pos],digits[npos] = 0,4,2
     new_sta = ''.join(str(x) for x in digits)
     if new_sta not in visi:
      visi[new_sta] = 1
      states.append([new_sta, path+dir[3], cx, cy])
    elif sta[pos] == '0' and self.en[pos] !='1':
    # 人動(dòng)箱子不動(dòng),sta中連著的狀態(tài)為4 0,en中第二個(gè)不能為1。
     digits = [int(x) for x in sta]
     digits[ppos], digits[pos] = 0, 4
     new_sta = ''.join(str(x) for x in digits)
     if new_sta not in visi:
      visi[new_sta] = 1
      states.append([new_sta, path + dir[2], cx, cy])
 
if __name__ == '__main__':
 f = open(level_file_path, encoding='utf-8')
 cnt = 0
 while(1):
  line = f.readline()
  line = line.strip('\n')
  if len(line)==0 :
   break
  gs = GameShortest(line)
 
"""
level_file.txt中內(nèi)容:
1111111111111111111111100011111110221111111420111111111001111111300111111330011111111111111111111111
1111111111104000000110000200111001101011100100101110010010111001011001110030000111111111111111111111
1111111111111111111111111111111110311111140020001110230020111111311111111111111111111111111111111111
1111111111111111111111100011111110221111111013311111102301111110040111111111111111111111111111111111
1111111111111111111111111111111100000111112111001113030020111400100011111111111111111111111111111111
1111111111111111111111111111111110011111100000011111001220111140300311111111111111111111111111111111
1111111111110040001110000000111001110011110011001111020130111100002011111311111111111111111111111111
1111111111111111111111111111111100111111100320001110131210111000000411111111111111111111111111111111
1111111111111111111111111111111100000111100111011110002020111000133411111111111111111111111111111111
1111111111111111111111100111111110004111111101011111312100111132001011113000201111111111111111111111
1111111111111111111111000001111131103111110402011111001201111100100111111111111111111111111111111111
1111111111111111111111100001111113112011110234001111001000111100001111111111111111111111111111111111
1111111111111111111111111001111110204111111020011111300101111130000111111111111111111111111111111111
1111111111111111111111143001111100000111110010211111001203111111101011111110001111111111111111111111
1111111111111111111111111111111100001111110202111111033420111111130011111111111111111111111111111111
1111111111111111111111110001111100230111114032301111110120111111000111111111111111111111111111111111
1111111111111111111111110031111102010111110020011111031401111100001111111111111111111111111111111111
1111111111111111111111111104111113110011110330201111021200111100001111111111111111111111111111111111
1111111111111111111111000111111100330111110011211111100100111112000411111001111111111111111111111111
1111111111111111111111100001111103032111110024001111111010111111100011111111111111111111111111111111
每一關(guān)的最短路徑:
['uurrDDDDuuuulldRurDDDrddLLrruLuuulldRurDDDrdL']
['drrRRurDDDDDrdLLL']
['rrdrUrrrdLLulDullldR']
['lluRRdrUllluuurrDDuulldRurD']
['urrrrdrruulullllDurrrrdrddllullLrrrdrruLLL']
['uurrrrDulllddrrRuulDrdL']
['drrdddrdLLLuLDlUUUluRRRRurDDD']
['uullLLddrrUdlllluuRurDrRddrruuLLL']
['lUlLLdlluururrrrDDrdLullldlluRRRRllluurrrrdD']
['ddrddLLulLdlUrrrdrruuluulldDuurrddrddllLLrruLL']
['luurrrdrdLLLrrrddlUruuulllldDrddlUUrrRdrU']
['ddlluluRuurrrDrddlluLrdrruLLddlluU']
['dddlluluuRDrruulDrdLLulDrDLurrrddlLL']
['drrdDrrddllUUUUruLdrDldR', 'drrdDrrddllUUUUrDldRuuuL']
['drruLLLuulldRurDurDD']
['urRdddrrUULLulldRururrD']
['uLrddlluluuRDrrruullDldRRdrUU']
['dddlUllllddrUUddrrUruLLrrruulDrdLL']
['llldlUUUluurDrrrDDrdLLLulUluRRlddrddlUUUluR']
['ulldRurDrrddllUUluurrDLLdrddrruuLrddlluU']
"""

更多關(guān)于python游戲的精彩文章請(qǐng)點(diǎn)擊查看以下專題:

python俄羅斯方塊游戲集合

python經(jīng)典小游戲匯總

python微信跳一跳游戲集合

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

相關(guān)文章

  • Python 模板引擎的注入問(wèn)題分析

    Python 模板引擎的注入問(wèn)題分析

    本文給大家主要講述的是Python 模板引擎的注入問(wèn)題分析,以及如何防范和需要注意的地方,有需要的小伙伴可以參考下
    2017-01-01
  • python中文件變化監(jiān)控示例(watchdog)

    python中文件變化監(jiān)控示例(watchdog)

    這篇文章主要介紹了python中文件變化監(jiān)控示例(watchdog),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • python遞歸實(shí)現(xiàn)快速排序

    python遞歸實(shí)現(xiàn)快速排序

    這篇文章主要為大家詳細(xì)介紹了python遞歸實(shí)現(xiàn)快速排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python實(shí)現(xiàn)矩陣可視化的示例代碼

    Python實(shí)現(xiàn)矩陣可視化的示例代碼

    matplotlib中提供了兩個(gè)矩陣可視化函數(shù),分別是imshow和matshow,本文主要為大家詳細(xì)介紹了如何使用這兩個(gè)函數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Python中進(jìn)度條tqdm包使用方法及特性介紹

    Python中進(jìn)度條tqdm包使用方法及特性介紹

    這篇文章主要介紹了Python中進(jìn)度條tqdm包使用方法及特性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Win7 64位下python3.6.5安裝配置圖文教程

    Win7 64位下python3.6.5安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了Win7 64位下python3.6.5安裝配置的圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python圖的深度優(yōu)先和廣度優(yōu)先算法實(shí)例分析

    python圖的深度優(yōu)先和廣度優(yōu)先算法實(shí)例分析

    這篇文章主要介紹了python圖的深度優(yōu)先和廣度優(yōu)先算法,結(jié)合實(shí)例形式分析了圖的深度優(yōu)先算法與廣度優(yōu)先算法相關(guān)概念、原理、實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • pyqt5 實(shí)現(xiàn)工具欄文字圖片同時(shí)顯示

    pyqt5 實(shí)現(xiàn)工具欄文字圖片同時(shí)顯示

    今天小編就為大家分享一篇pyqt5 實(shí)現(xiàn)工具欄文字圖片同時(shí)顯示的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python 上下文管理器及自定義原理解析

    python 上下文管理器及自定義原理解析

    這篇文章主要介紹了python 上下文管理器原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 分析如何在Python中解析和修改XML

    分析如何在Python中解析和修改XML

    我們經(jīng)常需要解析用不同語(yǔ)言編寫(xiě)的數(shù)據(jù)。Python提供了許多庫(kù)來(lái)解析或拆分用其他語(yǔ)言編寫(xiě)的數(shù)據(jù)。在此Python XML解析器教程中,您將學(xué)習(xí)如何使用Python解析XML
    2021-06-06

最新評(píng)論