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 相关文章推荐
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
python实现朴素贝叶斯算法
Nov 19 Python
Django 内置权限扩展案例详解
Mar 04 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
python性能测量工具cProfile使用解析
Sep 26 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
aws 通过boto3 python脚本打pach的实现方法
May 10 Python
什么是Python包的循环导入
Sep 08 Python
Python使用Web框架Flask开发项目
Jun 01 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实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
js实现简单页面全屏
2019/09/17 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
Python 模块EasyGui详细介绍
2017/02/19 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
Python基于WordCloud制作词云图
2019/11/29 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
大学生年度自我鉴定
2013/10/31 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
文员岗位职责范本
2014/03/08 职场文书
车辆年检委托书范本
2014/10/14 职场文书
历史博物馆观后感
2015/06/05 职场文书
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
Python中itertools库的四个函数介绍
2022/04/06 Python
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android