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的urllib库提交WEB表单
Feb 24 Python
python端口扫描系统实现方法
Nov 19 Python
Python 2.7.x 和 3.x 版本的重要区别小结
Nov 28 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 Python
python获取当前目录路径和上级路径的实例
Apr 26 Python
python实现windows下文件备份脚本
May 27 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
numpy.random模块用法总结
May 27 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 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高级OOP技术演示
2009/08/27 PHP
php 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
php观察者模式应用场景实例详解
2017/02/03 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
学期自我鉴定范文
2013/10/01 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
农业生产宣传标语
2014/10/08 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
现实表现证明材料
2015/06/19 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
使用Redis做预定库存缓存功能
2022/04/02 Redis