亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python實現推箱子游戲

2020-02-15 23:43:54
字體:
來源:轉載
供稿:網友

本文實例為大家分享了python實現推箱子游戲的具體代碼,供大家參考,具體內容如下

題目描述:

最短路徑為:

uurrDDDDuuuulldRurDDDrddLLrruLuuulldRurDDDrdL

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

大寫表示人推著箱子一起動,小寫表示人自己走。

代碼用BFS實現。狀態要分推著箱子一起走和人單獨走,這兩種狀態轉移是不同的。

由于代碼中注釋較詳細,這里不過多解釋。

代碼:

# -*- coding: utf-8 -*-# @Time  : 2017/8/10 上午9:42# @Author : Qi MO# @File  : BFS.py# @Software: PyCharm Community Edition level_file_path = '../數據/level_file.txt' class GameShortest:  def __init__(self,line, col=10):    """    給一個圖,長度為100的字符串表示。    0空地 1墻 2箱子起始位置 3箱子終點位置 4人的起始位置    :param line: 地圖,用字符串表示。如代碼最后的每一行表示每一關的地圖。    :param col: 地圖的長寬,由于設定為10*10,默認為10    """     self.line = line    # sta和en 表示開始的狀態,結束的狀態    # sta只有2,4,0 2表示箱子開始位置,4表示人的位置,0表示其他。    # en只有1,3,0 1表示墻,3表示箱子結束位置,0表示其他。    # 現在只需要把sta狀態中的2位置移動到en的3的位置即滿足條件    self.sta = ''    self.en = ''    self.col = col    # px, py表示4的位置    self.px,self.py = -1,-1    # paths記錄最短路徑(可能有多條)    self.paths = []    # len記錄最短路徑長度 如    self.len = -1     self.pre()    self.BFS()    print(self.paths)   def pre(self):    """    1.獲得sta開始狀態和en結束狀態    2.獲得人的起始位置px,py    代碼最后的第一關的地圖可視化為    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    # 現在只需要把sta開始的狀態中的2位置移動到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狀態中的2位置移動到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個方向,小寫代表只是人移動,大寫表示人推著箱子一起移動    dirs = [[-1,0,'u','U'],[1,0,'d','D'],[0,1,'r','R'],[0,-1,'l','L']]    # 把開始的狀態進入隊列(list模擬),狀態包括字符串表示的當前狀態、當前的路徑、當前人的位置    states = [[self.sta,'',self.px,self.py]]    # 訪問數組(dict模擬),訪問過的狀態(字符串)不再訪問    visi = {}    visi[self.sta] = 1     s_len = 1000    while len(states)>0:      sta, path, px, py = states[0]      # 4狀態的位置      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挨著的狀態的位置        pos = cx*self.col+cy        nx, ny = px + 2*dir[0], py + 2*dir[1]        # 4挨著挨著的狀態的位置        npos = nx*self.col+ny        if not (nx>=0 and nx<self.col and ny>=0 and ny<self.col):          continue        # python中字符串不可更改,于是把字符串變成list更改狀態后再轉換為字符串        if sta[pos] == '2' and sta[npos] == '0' and self.en[npos] != '1':        # 人和箱子一起推動,sta中連著的狀態為4 2 0,en中第三個不能為1。推完之后sta變為0 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':        # 人動箱子不動,sta中連著的狀態為4 0,en中第二個不能為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中內容:11111111111111111111111000111111102211111114201111111110011111113001111113300111111111111111111111111111111111104000000110000200111001101011100100101110010010111001011001110030000111111111111111111111111111111111111111111111111111111031111114002000111023002011111131111111111111111111111111111111111111111111111111111111111000111111102211111110133111111023011111100401111111111111111111111111111111111111111111111111111111111111111100000111112111001113030020111400100011111111111111111111111111111111111111111111111111111111111111111001111110000001111100122011114030031111111111111111111111111111111111111111111100400011100000001110011100111100110011110201301111000020111113111111111111111111111111111111111111111111111111111111111100111111100320001110131210111000000411111111111111111111111111111111111111111111111111111111111111110000011110011101111000202011100013341111111111111111111111111111111111111111111111111111111001111111100041111111010111113121001111320010111130002011111111111111111111111111111111111111111111000001111131103111110402011111001201111100100111111111111111111111111111111111111111111111111111111110000111111311201111023400111100100011110000111111111111111111111111111111111111111111111111111111111110011111102041111110200111113001011111300001111111111111111111111111111111111111111111111111111111143001111100000111110010211111001203111111101011111110001111111111111111111111111111111111111111111111111111110000111111020211111103342011111113001111111111111111111111111111111111111111111111111111111100011111002301111140323011111101201111110001111111111111111111111111111111111111111111111111111111110031111102010111110020011111031401111100001111111111111111111111111111111111111111111111111111111111110411111311001111033020111102120011110000111111111111111111111111111111111111111111111111111111110001111111003301111100112111111001001111120004111110011111111111111111111111111111111111111111111111100001111103032111110024001111111010111111100011111111111111111111111111111111每一關的最短路徑:['uurrDDDDuuuulldRurDDDrddLLrruLuuulldRurDDDrdL']['drrRRurDDDDDrdLLL']['rrdrUrrrdLLulDullldR']['lluRRdrUllluuurrDDuulldRurD']['urrrrdrruulullllDurrrrdrddllullLrrrdrruLLL']['uurrrrDulllddrrRuulDrdL']['drrdddrdLLLuLDlUUUluRRRRurDDD']['uullLLddrrUdlllluuRurDrRddrruuLLL']['lUlLLdlluururrrrDDrdLullldlluRRRRllluurrrrdD']['ddrddLLulLdlUrrrdrruuluulldDuurrddrddllLLrruLL']['luurrrdrdLLLrrrddlUruuulllldDrddlUUrrRdrU']['ddlluluRuurrrDrddlluLrdrruLLddlluU']['dddlluluuRDrruulDrdLLulDrDLurrrddlLL']['drrdDrrddllUUUUruLdrDldR', 'drrdDrrddllUUUUrDldRuuuL']['drruLLLuulldRurDurDD']['urRdddrrUULLulldRururrD']['uLrddlluluuRDrrruullDldRRdrUU']['dddlUllllddrUUddrrUruLLrrruulDrdLL']['llldlUUUluurDrrrDDrdLLLulUluRRlddrddlUUUluR']['ulldRurDrrddllUUluurrDLLdrddrruuLrddlluU']"""            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频在线观看一区二区| 亲爱的老师9免费观看全集电视剧| 国产香蕉一区二区三区在线视频| 成人日韩在线电影| 日韩亚洲精品视频| 91精品中国老女人| 91免费国产视频| 久久人人爽人人爽爽久久| 亚洲国内精品视频| 久热99视频在线观看| 91精品免费久久久久久久久| 日韩免费视频在线观看| 亚洲美腿欧美激情另类| 日韩精品在线视频| 精品一区二区三区四区在线| 亚洲精品久久在线| 国产一区二区三区在线播放免费观看| 国产精品久久久久久久电影| 日本精品一区二区三区在线| 中文字幕久精品免费视频| 久久久中文字幕| 91精品国产高清久久久久久久久| 欧美中在线观看| 粉嫩av一区二区三区免费野| 久久夜精品va视频免费观看| 国产精品亚洲第一区| 久久免费精品视频| 91国产精品视频在线| 性欧美长视频免费观看不卡| 亚洲国产三级网| 亚洲qvod图片区电影| 亚洲综合大片69999| 91极品女神在线| 亚洲www在线观看| 久久精品2019中文字幕| 国产日韩在线精品av| 日韩av在线网址| 性欧美激情精品| 欧美电影在线观看完整版| 大量国产精品视频| 91免费综合在线| 日韩国产精品亚洲а∨天堂免| 欧美午夜视频在线观看| 亚洲男人天堂九九视频| 国产精品一二区| 亚洲欧美国产精品久久久久久久| 亚洲人成电影网站色www| 欧美大片在线看免费观看| 97精品视频在线观看| 91亚洲国产成人久久精品网站| 亚洲区一区二区| 91久久久在线| 中文字幕av日韩| 在线观看久久久久久| 国产在线观看精品一区二区三区| 亚洲欧美日韩图片| 7777免费精品视频| 日韩视频免费大全中文字幕| 久久精品亚洲一区| 国内精品一区二区三区| 久久国产色av| 亚洲精品成人久久| 亚洲综合中文字幕在线| 日韩av电影在线播放| 国产成人一区二区三区小说| 日韩精品视频免费专区在线播放| 色综合天天狠天天透天天伊人| 日韩欧美国产网站| 国产伊人精品在线| 欧美色视频日本高清在线观看| 日韩高清不卡av| 亚洲色图欧美制服丝袜另类第一页| 国产91在线播放精品91| 亚洲欧美国产精品久久久久久久| 亚洲精品日产aⅴ| 欧美视频中文字幕在线| 91欧美精品成人综合在线观看| 欧美在线视频网站| 欧美电影免费观看| 国产在线视频91| 国产一区二区日韩精品欧美精品| 久久久天堂国产精品女人| 亚洲高清久久久久久| 91精品在线国产| 亚洲国产精品yw在线观看| 在线丨暗呦小u女国产精品| 欧美日韩免费网站| 综合国产在线观看| 欧美激情三级免费| 福利二区91精品bt7086| 久久人91精品久久久久久不卡| 国内精品视频在线| 久久久久久综合网天天| 色哟哟入口国产精品| 日韩中文字幕视频在线观看| 亚洲片av在线| 欧美日韩免费在线| 欧美伦理91i| 亚洲美女黄色片| 日韩精品极品在线观看播放免费视频| 91深夜福利视频| 97在线免费视频| 欧美成人亚洲成人| 久久久精品免费| 美女视频黄免费的亚洲男人天堂| 国外色69视频在线观看| 91美女高潮出水| 精品亚洲精品福利线在观看| 久久久久国产精品www| 亚洲在线免费视频| 成人做爽爽免费视频| 日韩在线观看网址| 国产精品一区二区久久久| 欧美国产日韩二区| 精品福利樱桃av导航| 久久国产一区二区三区| 亚洲欧美日韩成人| 国产精品老女人视频| 欧美精品手机在线| 成人激情视频在线观看| www.欧美精品| 亚洲国产另类 国产精品国产免费| 91在线观看免费| 91精品久久久久久综合乱菊| 最好看的2019的中文字幕视频| 国产精品久久久久久久久久东京| 成人免费视频网址| 亚洲成年网站在线观看| 国产一区二区三区在线视频| 亚洲精品永久免费精品| 国产激情久久久| 欧美成人亚洲成人| 日韩精品福利在线| 一区二区三区视频在线| 麻豆精品精华液| 欧美日韩一区免费| 日本免费一区二区三区视频观看| 精品成人久久av| 国产精品成人va在线观看| 奇米影视亚洲狠狠色| 热门国产精品亚洲第一区在线| 欧美精品中文字幕一区| 一本一本久久a久久精品牛牛影视| 91高清视频免费观看| 国产日韩在线免费| 欧美激情精品久久久久久大尺度| 亚洲美女在线看| 日韩亚洲国产中文字幕| 亚洲性av在线| 国产精品看片资源| 久久精品夜夜夜夜夜久久| 91精品国产综合久久男男| 91精品国产91久久| 久久人人爽人人爽人人片av高清| 91精品久久久久久久久| 国产ts人妖一区二区三区| 亚洲人成77777在线观看网| 国产精品va在线播放我和闺蜜| 中文字幕日韩免费视频| 日本欧美黄网站| 欧美日韩国产影院| 成人在线视频网站| 国产一区视频在线播放| 一区二区三区视频免费|