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 相关文章推荐
python3 与python2 异常处理的区别与联系
Jun 19 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
Python3实现的字典遍历操作详解
Apr 18 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 Python
使用python绘制cdf的多种实现方法
Feb 25 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
Jul 28 Python
Python虚拟环境virtualenv创建及使用过程图解
Dec 08 Python
Python中的min及返回最小值索引的操作
May 10 Python
解决pytorch读取自制数据集出现过的问题
May 31 Python
Python实现照片卡通化
Dec 06 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二分法查找数组是否包含某一元素
2013/05/23 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
python使用thrift教程的方法示例
2019/03/21 Python
Django实现单用户登录的方法示例
2019/03/28 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
历史系毕业生自荐信
2013/10/28 职场文书
博士生入学考试推荐信
2013/11/17 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
组织委员竞选稿
2015/11/21 职场文书
《坐井观天》教学反思
2016/02/18 职场文书