python实现华容道游戏(v0.4)--支持游戏自动完成功能

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.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值