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出现_warn_unsafe_extraction问题的方法
Mar 24 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
python下载图片实现方法(超简单)
Jul 21 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
Python程序运行原理图文解析
Feb 10 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
Apr 05 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
python 下载文件的几种方式分享
Apr 07 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
phpmyadmin操作流程
2006/10/09 PHP
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
php中OR与|| AND与&amp;&amp;的区别总结
2013/10/26 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
详解python对象之间的交互
2020/09/29 Python
常用的HTML5列表标签
2017/06/20 HTML / CSS
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
庆六一宣传标语
2014/10/08 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2015年端午节活动方案
2015/05/05 职场文书