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基础之包的导入和__init__.py的介绍
Jan 08 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
python如何实现一个刷网页小程序
Nov 27 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
使用Python创建简单的HTTP服务器的方法步骤
Apr 26 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
wxPython之wx.DC绘制形状
Nov 19 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
python爬虫使用scrapy注意事项
Nov 23 Python
Python自动化实战之接口请求的实现
May 30 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 CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
2012/01/16 PHP
解析php中memcache的应用
2013/06/18 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
2018/09/16 PHP
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
layui导航栏实现代码
2017/05/19 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
Python检测网站链接是否已存在
2016/04/07 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
管理学专业个人求职信范文
2013/09/21 职场文书
大专生自我鉴定范文
2013/10/01 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
解除合同协议书
2014/04/17 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
研究生简历自我评
2015/03/11 职场文书
入党群众意见范文
2015/06/02 职场文书
战友聚会致辞
2015/07/28 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书