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编程语言的35个与众不同之处(语言特征和使用技巧)
Jul 07 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
浅谈django的render函数的参数问题
Oct 16 Python
Python编程深度学习计算库之numpy
Dec 28 Python
Python 多维List创建的问题小结
Jan 18 Python
如何使用Python标准库进行性能测试
Jun 25 Python
python实现批量文件重命名
Oct 31 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
Numpy 多维数据数组的实现
Jun 18 Python
教你用Python matplotlib库制作简单的动画
Jun 11 Python
浅谈Python数学建模之线性规划
Jun 23 Python
python 镜像环境搭建总结
Sep 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之autoload运行机制实例分析
2014/08/28 PHP
自制PHP框架之设计模式
2017/05/07 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
js变量提升深入理解
2016/09/16 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
JSONP基础知识详解
2017/03/19 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
python计算文本文件行数的方法
2015/07/06 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
python环境下安装opencv库的方法
2020/03/05 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
亚洲领先的设计购物网站:Pinkoi
2020/11/26 全球购物
市场营销工作计划书
2014/05/06 职场文书
事业单位鉴定材料
2014/05/25 职场文书
支行行长竞聘报告
2014/11/06 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
职工年度考核评语
2014/12/31 职场文书
开学典礼致辞
2015/07/29 职场文书
会计实训总结范文
2015/08/03 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android
python程序的组织结构详解
2021/12/06 Python
vscode内网访问服务器的方法
2022/06/28 Servers
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技