python推箱子小游戏_python实现推箱子游戏
本文实例为大家分享了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=0 and ny
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中内容:
1111111111111111111111100011111110221111111420111111111001111111300111111330011111111111111111111111
1111111111104000000110000200111001101011100100101110010010111001011001110030000111111111111111111111
1111111111111111111111111111111110311111140020001110230020111111311111111111111111111111111111111111
1111111111111111111111100011111110221111111013311111102301111110040111111111111111111111111111111111
1111111111111111111111111111111100000111112111001113030020111400100011111111111111111111111111111111
1111111111111111111111111111111110011111100000011111001220111140300311111111111111111111111111111111
1111111111110040001110000000111001110011110011001111020130111100002011111311111111111111111111111111
1111111111111111111111111111111100111111100320001110131210111000000411111111111111111111111111111111
1111111111111111111111111111111100000111100111011110002020111000133411111111111111111111111111111111
1111111111111111111111100111111110004111111101011111312100111132001011113000201111111111111111111111
1111111111111111111111000001111131103111110402011111001201111100100111111111111111111111111111111111
1111111111111111111111100001111113112011110234001111001000111100001111111111111111111111111111111111
1111111111111111111111111001111110204111111020011111300101111130000111111111111111111111111111111111
1111111111111111111111143001111100000111110010211111001203111111101011111110001111111111111111111111
1111111111111111111111111111111100001111110202111111033420111111130011111111111111111111111111111111
1111111111111111111111110001111100230111114032301111110120111111000111111111111111111111111111111111
1111111111111111111111110031111102010111110020011111031401111100001111111111111111111111111111111111
1111111111111111111111111104111113110011110330201111021200111100001111111111111111111111111111111111
1111111111111111111111000111111100330111110011211111100100111112000411111001111111111111111111111111
1111111111111111111111100001111103032111110024001111111010111111100011111111111111111111111111111111
每一关的最短路径:
['uurrDDDDuuuulldRurDDDrddLLrruLuuulldRurDDDrdL']
['drrRRurDDDDDrdLLL']
['rrdrUrrrdLLulDullldR']
['lluRRdrUllluuurrDDuulldRurD']
['urrrrdrruulullllDurrrrdrddllullLrrrdrruLLL']
['uurrrrDulllddrrRuulDrdL']
['drrdddrdLLLuLDlUUUluRRRRurDDD']
['uullLLddrrUdlllluuRurDrRddrruuLLL']
['lUlLLdlluururrrrDDrdLullldlluRRRRllluurrrrdD']
['ddrddLLulLdlUrrrdrruuluulldDuurrddrddllLLrruLL']
['luurrrdrdLLLrrrddlUruuulllldDrddlUUrrRdrU']
['ddlluluRuurrrDrddlluLrdrruLLddlluU']
['dddlluluuRDrruulDrdLLulDrDLurrrddlLL']
['drrdDrrddllUUUUruLdrDldR', 'drrdDrrddllUUUUrDldRuuuL']
['drruLLLuulldRurDurDD']
['urRdddrrUULLulldRururrD']
['uLrddlluluuRDrrruullDldRRdrUU']
['dddlUllllddrUUddrrUruLLrrruulDrdLL']
['llldlUUUluurDrrrDDrdLLLulUluRRlddrddlUUUluR']
['ulldRurDrrddllUUluurrDLLdrddrruuLrddlluU']
"""
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持爱蒂网。
python推箱子小游戏_python实现推箱子游戏相关推荐
- python做的大型游戏_Python有做大型游戏的潜力吗?
由于最近我要考试忙不过来没修改回答,谢谢评论区大们的指正,我认识到的pygame库确实可以做游戏,但是pygame限制很多,特别是做大型游戏方面,3D还没有相关的优化方法等(3D游戏,pygame表示 ...
- python编游戏_python编的著名游戏
python编的著名游戏 2019-03-18 15:59:33 3323 0 没有找到相关结果 已邀请: 目前使用Python编写的游戏有文明4.星际迷航:舰桥指挥官.战地2等,小游戏有俄罗斯方 ...
- python做飞机大战游戏_python实现飞机大战游戏
飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累.实现出来,成就感还是满满的),如图所示: 完整代码如下: 1.工 ...
- python设计棋牌游戏_python开发棋牌类游戏
pycharm专门针对用户打造的一种可以进行编辑的工具,它的功能设置比较强大,而且具有跨平台的使用特性,能方便用户通过跨平台的方式使用该软件,有效节省的使用时间,那么这款详情>> 阅读: ...
- python写飞机大战游戏_python实现飞机大战游戏
飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累.实现出来,成就感还是满满的),如图所示: 完整代码如下: 1.工 ...
- python运维小工具_Python实现跨平台运维小神器
(本文已不再同步更新,最新代码请移步github) 这阵子一直在学python,碰巧最近想把线上服务器环境做一些规范化/统一化,于是便萌生了用python写一个小工具的冲动.就功能方面来说,基本上是在 ...
- python推箱子文档_python实现推箱子游戏
本文实例为大家分享了python实现推箱子游戏的具体代码,供大家参考,具体内容如下 题目描述: 最短路径为: uurrDDDDuuuulldRurDDDrddLLrruLuuulldRurDDDrdL ...
- python开发网络小工具_python 网络工具
书籍:掌握Python的网络和安全 Mastering Python for Networking and Security - 2018.pdf 简介 掌握Python的网络和安全 掌握Python ...
- python文字游戏源代码求年纪_Python实现猜年龄游戏代码实例
1. 在猜年龄的基础上编写登录.注册方法,并且把猜年龄游戏分函数处理,如 2. 登录函数 3. 注册函数 4. 猜年龄函数 5. 选择奖品函数 代码如下 import json real_age = ...
- python猜单词游戏_python实现猜单词游戏
本文实例为大家分享了python实现猜单词游戏的具体代码,供大家参考,具体内容如下 0.效果 1.代码 # 猜单词游戏 import random #添加 WORDS = ("python& ...
最新文章
- Dagger2 知识梳理(1) Dagger2 依赖注入的两种方式
- mongod副本集的安装配置
- 基因组与数据整合:DNA应用开发正在临近
- android 自定义view滚动条,Android自定义View实现等级滑动条的实例
- 阿里云服务器被挖矿怎么解决
- 使用 CocoaPods 对公有库开源和私有库组件
- python生成器next_Python生成器生成next,python,yieldnext
- 置顶信息[置顶] 常用日常英语缩写
- EIGRP传递默认路由方法总结
- iOS 网络图片转为UIImage 和微信分享时缩略图片的压缩
- 计算机word宿舍管理软件,【UML课程设计】宿舍管理系统设计(WORD完整版).doc
- 整人游戏-色盲在线测试
- 快速卸载软件和残余,很Nice的一款卸载工具—Your Unin-staller!
- 十年老撕鸡分享,五分钟搭建个人轻论坛
- 游戏智能中的AI——从多角色博弈到平行博弈
- 理解LINQ预编译查询(Compiled LINQ)
- 『Java CVE』CVE-2022-34169: Xalan-J XSLT整数截断漏洞PoC结构再浅析
- esp32 鸿蒙,ESP8266最佳开发板--ESP-LAUNCHER开发板评测
- 数据库常用的sql语句名称大全
- VMware虚拟机软件安装国产操作系统 统信 UOS V20 1050e 手把手保姆教程
热门文章
- 路由器服务器已停止响应,排除路由器挂起故障
- 学生HTML个人网页作业作品~蛋糕甜品店铺共11个页面(HTML+CSS+JavaScript)
- 工程思维把每件事都当作一个项目来做
- python 根据身份证号计算年龄和性别_根据身份证自动计算出生日期、年龄、性别的例子...
- 前台应用保活-适配华为
- python批量导入excel中的IP地址查询所在地及运营商
- 第十一章 卡米洛特的黑暗时代
- 支持delete吗_那些年删过的库,跑过的路,你从中找到解决方法了吗?
- 被syn攻击了怎么办,如何预防服务器被被syn攻击
- asp.net 视频教程