侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现推箱子游戏

Python  /  管理员 发布于 7年前   355

本文实例为大家分享了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] = 1states.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] = 1states.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']"""

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python获取微信小程序手机号并绑定遇到的坑
    下一条:
    详解python中的Turtle函数库
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客