1、说明:
1.1、华容道游戏
华容道是中国的一种传统游戏,有曹操、关羽、张飞等,分别用不同形状、大小的小块表示,游戏的目标是将曹操从特定位置走到出口、即为获胜。
1.2、设计前提和限制:
当前版本尚未图形化,考虑用数字代表曹操、关羽等不同角色,使用键盘操控移动游戏。
2、代码及说明
==========
#!python
import copy
import time
#2.1 历史和已支持功能
##Author: Lijun
#
#History:
#V0.4 2022-01-18
#增加功能:1)在运行过程中增加“自动完成”功能,可以自动模拟完成并打印结果。
#
#V0.3 2021-12-18
#增加功能:增加初始场景,游戏可以从多个初始场景中选择1个。
#
#V0.2 2021-12-16
#增加功能:返回上一步;返回上一步后,删除本步骤、上一步变为最后一步;如果没有上一步则菜单不显示
#V0.1 2021-12-15
#实现基础功能:一种初始化图形,可以人工操作游戏,游戏成功有提示
#
#
#
#
#Guanyu=11 (*1) ;关羽2*1(水平*竖直,下同) 横条,1个
#zhang/zhao/ma/huang = x
# x (*4,2-5) ;张飞/赵云/马超/黄忠 1*2竖条,4个
#zu = x (*4,6-9) ;小卒, 1*1块,4个
#caocao = 00
# 00 (*1) ;曹操,2*2块,1个
#
#
#2.2 数据结构说明
#数据结构:
#华容道主要数据结构的定义,如下:
#2.2.1 游戏角色
#类型:list,
#组成:[id(字符型),name(字符串),width(数字),height(数字),loc_row(数字),loc_col(数字)]
#分别代表:代号0-9,名字,占的行数,占的列数,角色左上角1个块的行位置,角色左上角块的列位置
#其中:0曹操为2*2的方块,1关羽为1*2(1行2列)的长方形,2-5张飞、赵云、黄忠、马超为2*1(2行1列)的长方形,6-9小卒为1*1的小方块。
#2.2.2局型role
#类型:list,
#组成:[[角色0],[角色1],....[角色9]]
#是由10个游戏角色按顺序构成的list,分别表示曹操、关羽、4个张赵马黄、4个小卒的信息
#2.2.3节点Node
#类型:list
#组成:[当前role,前一role,前一role到当前role需要移动的角色,移动方向,当前局面nodeid,前一局面nodeid,当前role的diff判决值]
#自动求解时需要用到的局型关系状态。包含局型、前置局型、从前置局型变为当前局型移动角色、局型ID、局型判决函数值等信息。用于求解从当前状态到最终状态的解决路径。
#2.3.4 角色result
#类型:二位数组list
#组成:[row][col]
#一个7行4列的数组,各位置的值为该位置对应的角色代号,用于打印局势图
#
#
#
#
#初始化游戏设置
def init_conf():
global role
global history
global auto_play
role = [] #角色清单,用于保存各角色属性(长宽、位置等)
history=[] #历史角色清单的历史动作列表,用于游戏返回上一步
orig=[] #自动游戏时的初始局面
# auto_play=False #设置是否自动游戏,如果自动,则会使用openeded表、closed表
#2.3初始化游戏地图和角色位置
#2.3.1定义角色位置
#初始化游戏地图,设定各角色的位置,目前包括6个官方地图和3个测试地图,测试地图和根据目的自行添加。
def init_map():
while True:
map = input('''Welcome to HuaRongDao, Please choose a map to play:
1、横刀立马
2、齐头并前
3、兵分三路
4、屯兵东路
5、左右布兵
6、前挡后阻
7、测试地图
8、测试地图2
9、测试地图3
请输入(1-9):''')
try:
map=int(map)
except:
pass
# print("Map is",map)
if(map==1):
#1、地图“横刀立马”
#张曹曹马
#飞操操超
#赵关羽黄
#云卒卒忠
#卒 卒
#口门门口
role.append(['0','Caocao',2,2,1,2])
role.append(['1','Guanyu',2,1,3,2])
role.append(['2','Zhangfei',1,2,1,1])
role.append(['3','Zhaoyun',1,2,3,1])
role.append(['4','Machao',1,2,1,4])
role.append(['5','Huangzhong',1,2,3,4])
role.append(['6','xiaozu',1,1,4,2])
role.append(['7','xiaozu',1,1,4,3])
role.append(['8','xiaozu',1,1,5,1])
role.append(['9','xiaozu',1,1,5,4])
break
elif(map==2):
#2、地图“齐头并前”
#张曹曹赵
#飞操操云
#卒卒卒卒
#马关羽黄
#超 忠
#口门门口
role.append(['0','Caocao',2,2,1,2])
role.append(['1','Guanyu',2,1,4,2])
role.append(['2','Zhangfei',1,2,1,1])
role.append(['3','Zhaoyun',1,2,1,4])
role.append(['4','Machao',1,2,4,1])
role.append(['5','Huangzhong',1,2,4,4])
role.append(['6','xiaozu',1,1,3,1])
role.append(['7','xiaozu',1,1,3,2])
role.append(['8','xiaozu',1,1,3,3])
role.append(['9','xiaozu',1,1,3,4])
return
elif(map==3):
#3、地图“兵分三路”
#卒曹曹卒
#张操操赵
#飞关羽云
#马卒卒黄
#超 忠
#口门门口
role.append(['0','Caocao',2,2,1,2])
role.append(['1','Guanyu',2,1,3,2])
role.append(['2','Zhangfei',1,2,2,1])
role.append(['3','Zhaoyun',1,2,2,4])
role.append(['4','Machao',1,2,4,1])
role.append(['5','Huangzhong',1,2,4,4])
role.append(['6','xiaozu',1,1,1,1])
role.append(['7','xiaozu',1,1,1,4])
role.append(['8','xiaozu',1,1,4,2])
role.append(['9','xiaozu',1,1,4,3])
return
elif(map==4):
#4、地图“屯兵东路”
#曹曹张赵
#操操飞云
#关羽卒卒
#马黄卒卒
#超忠
#口门门口
role.append(['0','Caocao',2,2,1,1])
role.append(['1','Guanyu',2,1,3,1])
role.append(['2','Zhangfei',1,2,1,3])
role.append(['3','Zhaoyun',1,2,1,4])
role.append(['4','Machao',1,2,4,1])
role.append(['5','Huangzhong',1,2,4,2])
role.append(['6','xiaozu',1,1,3,3])
role.append(['7','xiaozu',1,1,3,4])
role.append(['8','xiaozu',1,1,4,3])
role.append(['9','xiaozu',1,1,4,4])
return
elif(map==5):
#5、地图“左右布兵”
#张曹曹赵
#飞操操云
# 马黄
#卒超忠卒
#卒关羽卒
#口门门口
role.append(['0','Caocao',2,2,1,2])
role.append(['1','Guanyu',2,1,5,2])
role.append(['2','Zhangfei',1,2,1,1])
role.append(['3','Zhaoyun',1,2,1,4])
role.append(['4','Machao',1,2,3,2])
role.append(['5','Huangzhong',1,2,3,3])
role.append(['6','xiaozu',1,1,4,1])
role.append(['7','xiaozu',1,1,4,4])
role.append(['8','xiaozu',1,1,5,1])
role.append(['9','xiaozu',1,1,5,4])
return
elif(map==6):
#6、地图“前挡后阻”
#曹曹关羽
#操操马张
#赵黄超飞
#云忠卒卒
#卒 卒
#口门门口
role.append(['0','Caocao',2,2,1,2])
role.append(['1','Guanyu',2,1,5,2])
role.append(['2','Zhangfei',1,2,1,1])
role.