python递归法实现简易连连看小游戏


Posted in Python onMarch 25, 2020

问题:简单版连连看小游戏

一个分割成w*h个正方格子的矩形板上,每个正方格子可以有游戏卡,也可以没有游戏卡

两个游戏卡之间有一条路径相连需满足以下三个条件:

1.路径只包含水平和垂直的直线段
2.路径不能穿过别的游戏卡片
3.允许路径临时离开矩形板

输入要求:

第一行包括两个整数:w 和 h ; w:矩形板的宽度,h:矩形板的长度
下面h行,每行包括w个字符,表示矩形板上卡片的分布情况:'X'代表这个地方有卡片;'O'代表无卡片
之后一行包括4个整数:X1,Y1,X2,Y2(1<=X1,X2<=w;1<=Y1,Y2<=h),代表两个卡片的位置
注意:矩形板左上角的坐标是(1,1)

输出要求:

对于每一组需要测试的游戏卡片输出:
    若可以连接,找到线段最小路径,输出:k segments(k为最优路径的最小线段数)
    若不可以连接,则输出"impossible"

问题分析:

python递归法实现简易连连看小游戏

程序代码:

# -*- coding: utf-8 -*-
"""
Created on Sat Mar 10 20:40:59 2018
@author: lizihua
问题:简单版连连看小游戏
一个分割成w*h个正方格子的矩形板上,每个正方格子可以有游戏卡,也可以没有游戏卡
两个游戏卡之间有一条路径相连需满足以下三个条件:
1.路径只包含水平和垂直的直线段
2.路径不能穿过别的游戏卡片
3.允许路径临时离开矩形板
输入要求:
第一行包括两个整数:w 和 h (1<=w,h<=75);w:矩形板的宽度,h:矩形板的长度
下面h行,每行包括w个字符,表示矩形板上卡片的分布情况:'X'代表这个地方有卡片;'O'代表无卡片
之后一行包括4个整数:X1,Y1,X2,Y2(1<=X1,X2<=w;1<=Y1,Y2<=h),代表两个卡片的位置
注意:矩形板左上角的坐标是(1,1)
输出要求:
对于每一组需要测试的游戏卡片输出:
 若可以连接,找到线段最小路径,输出:k segments(k为最优路径的最小线段数)
 若不可以连接,则输出"impossible"
"""
import numpy as np
to=[[0,1],[1,0],[0,-1],[-1,0]] #定义方向
 
#定义递归函数---因为每一步搜索路径的方式一样
def search(now_x,now_y,end_x,end_y,step,f):
 #minstep在这里必须定义全局变量,否则,报错
 global minstep
 if step>minstep:
 return
 if now_x==end_x and now_y==end_y:
 if step<minstep:
 minstep=step
 return
 #枚举下一步方向 
 for i in range(4):
 x=now_x+to[i][0]
 y=now_y+to[i][1]
 
 if -1<x<(wh[1]+2) and -1<y<(wh[0]+2) and (board[x][y]=='O' and mark[x][y]==0) or (x==end_x and y==end_y and board[x][y]=='X'):
 mark[x][y]=1 #新位置有效,标记新位置
 #递归搜索时,step不变,否则,step+1
 #f代表方向,0,1,2,3代表东南西北
 if f==i:
 search(x,y,end_x,end_y,step,i)
 else:
 search(x,y,end_x,end_y,step+1,i)
 mark[x][y]=0
 
 
 
 
# h行w列 输入第一行:w=wh[0];h=wh[1]
wh=input("请输入矩形板的宽度w和长度h:").split(' ')
wh = list(map(int, wh))
 
#输入h行,代表矩形卡片的分布情况
line=[[' ']*wh[0]]*wh[1]
for i in range(wh[1]):
 line[i]=input("请输入第"+str(i+1)+"行卡片分布新情况:").split(' ')
#在矩形最外层加一圈'O'
board=np.array(line)
wide=np.array(['O']*wh[0])
high=np.array(['O']*(wh[1]+2))
#向board中的最下面加入一行'O'
board=np.insert(board,wh[1],values=wide,axis=0)
#向board中的最上面加入一行'O'
board=np.insert(board,0,values=wide,axis=0)
#向board中的最后一列加入一列'O'
board=np.insert(board,wh[0],values=high,axis=1)
#向board中的第0列加入一行'O'
board=np.insert(board,0,values=high,axis=1)
 
###注意:不要用mark=[[0]*(wh[0]+2)]*(wh[1]+2)
#使用上式,会使得改变某一个值时,该值所在列都会随之一样变化
mark=np.zeros((wh[1]+2,wh[0]+2)) #定义标记数组,并初始化
#输入两个卡片的位置 ,第一张卡片now(now_x,now_y);第二张卡片end(end_x,end_y) 
place=input("请输入两张卡片的位置:").split(' ')
place = list(map(int, place)) 
begin_x=place[0]
begin_y=place[1]
end_x=place[2]
end_y=place[3]
 
minstep=100000 #初始化minstep为一个很大的值
 #递归搜索路径
search(begin_x,begin_y,end_x,end_y,0,-1)
 #输出结果
if minstep<100000:
 print(str(minstep)+"segments")
else:
 print("impossible")

程序结果显示:

python递归法实现简易连连看小游戏

更多关于python游戏的精彩文章请点击查看以下专题:

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

Python 相关文章推荐
Python中用startswith()函数判断字符串开头的教程
Apr 07 Python
Python字符串逐字符或逐词反转方法
May 21 Python
Python实现发送QQ邮件的封装
Jul 14 Python
python 换位密码算法的实例详解
Jul 19 Python
python 实现登录网页的操作方法
May 11 Python
用Python实现数据的透视表的方法
Nov 16 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 Python
python获取交互式ssh shell的方法
Feb 14 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
30秒学会30个超实用Python代码片段【收藏版】
Oct 15 Python
教你使用一行Python代码玩遍童年的小游戏
Aug 23 Python
django2笔记之路由path语法的实现
Jul 17 #Python
Django之创建引擎索引报错及解决详解
Jul 17 #Python
python实现连连看辅助之图像识别延伸
Jul 17 #Python
Django 路由控制的实现
Jul 17 #Python
详解python实现数据归一化处理的方式:(0,1)标准化
Jul 17 #Python
简单了解django索引的相关知识
Jul 17 #Python
python实现连连看辅助(图像识别)
Mar 25 #Python
You might like
分享一个超好用的php header下载函数
2014/01/31 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
Python2.7读取PDF文件的方法示例
2017/07/13 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
python实现弹跳小球
2019/05/13 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
Python如何获取文件路径/目录
2020/09/22 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
Weblogic的布署方式
2013/08/23 面试题
农村结婚典礼司仪主持词
2014/03/14 职场文书
行政专员求职信范文
2014/05/03 职场文书
学校标语大全
2014/06/19 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书