新鲜出炉的连连看连接算法Python版
这段时间老是“不务正业”的搞一些东西玩。之前的贪吃蛇,俄罗斯方块激发了我研究游戏算法的兴趣。经过1个星期的构思,连连看的连接算法终于出炉了。再过一段时间就基于这个算法使用JavaScript推出网页版的连连看。下面是说明及代码。
功能:为连连看游戏提供连接算法
说明:模块中包含一个Point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。
其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案,9代表被填充为墙壁
模块中还包含一个名为points的Point列表,其中保存着整个游戏界面中的每个点
使用模块的时候应首先调用createPoints方法,初始化游戏界面中每个点,然后可通过points访问到每个点,继而初始化界面
模块中核心的方法是link,通过提供源点和终点,可尝试连接两点,如果可以连接则返回保存路径的path列表,否则返回False
鸣谢:感谢我的同学asy668(http://hi.baidu.com/myasy)完善这个算法中createPoints,帮助我测试这个算法,并为这个算法写了一个用户交互界面。
- #-*-coding:utf-8-*-
- """连连看连接算法
- 为连连看游戏提供连接算法
- 模块中包含一个Point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。
- 其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案,9代表被填充为墙壁
- 模块中还包含一个名为points的Point列表,其中保存着整个游戏界面中的每个点
- 使用模块的时候应首先调用createPoints方法,初始化游戏界面中每个点,然后可通过points访问到每个点,继而初始化界面
- 模块中核心的方法是link,通过提供源点和终点,可尝试连接两点,如果可以连接则返回保存路径的path列表,否则返回False
- """
- import random
- import time
- __author__ ="http://blog.csdn.net/anhulife"
- __license__ ="python"
- class Point:
- """Point类
- Point类是游戏中基本单元:“点”
- """
- def __init__(self,x,y,value):
- self.x = x
- self.y = y
- self.value = value
- self.directs = None
- self.changed = 0
- def __createDirect(self,pre,target):
- """构造点的方向集
- 每个点在连接的过程中都持有一个方向集,这个方向集中保
- 存着该点的前进方向选择的优先级优先级:指向目标点的方向级别最
- 高,在同等级别并且遵循x方向优先于y方向
- """
- self.directs = list()
- stx = target.x - self.x
- sty = target.y - self.y
- if stx >= 0 :
- self.directs.append("right")
- self.directs.append("left")
- else:
- self.directs.append("left")
- self.directs.append("right")
- if sty >= 0 :
- self.directs.insert(1,"up")
- self.directs.append("down")
- else:
- self.directs.insert(1,"down")
- self.directs.append("up")
- if pre == None :
- return
- spx = pre.x - self.x
- spy = pre.y - self.y
- if spx == 0 :
- if spy == 1:
- self.directs.remove("up")
- else:
- self.directs.remove("down")
- else :
- if spx == 1:
- self.directs.remove("right")
- else:
- self.directs.remove("left")
- def forward(self,pre,target):
- """点的前进动作
- 点的前进即是依次从方向集中取出优先级高的方向,并判
- 断该方向上的下一个点是否被填充如果没有被填充则说明该方
- 向可通,并返回该方向。否则试探下一个方向,如果方向集中没
- 有方向可用了,则返回None
- """
- if self.directs == None :
- self.__createDirect(pre,target)
- if len(self.directs) == 0 :
- return None
- direct = None
- while(True):
- if len(self.directs) == 0 :
- break
- tmpDirect = self.directs.pop(0)
- if tmpDirect == "up" :
- x = self.x
- y = self.y + 1
- elif tmpDirect == "down":
- x = self.x
- y = self.y - 1
- elif tmpDirect == "left":
- x = self.x - 1
- y = self.y
- elif tmpDirect == "right":
- x = self.x + 1
- y = self.y
- p = points[x][y]
- if p.value > 0 and p != target:
- continue
- else :
- direct = tmpDirect
- if pre == None:
- self.changed = 1
- else:
- if (pre.x - self.x) == 0 and (p.x - self.x) == 0:
- self.changed = 0
- else:
- if (pre.y - self.y) == 0 and (p.y - self.y) == 0:
- self.changed = 0
- else :
- self.changed = 1
- break
- return direct
- def __eq__(self,p):
- if p == None :
- return False
- if self.x == p.x and self.y == p.y :
- return True
- else:
- return False
- points = list()
- valuestack=list()
- def createPoints(w,h):
- """构造游戏界面的点
- 初始化界面中的所有的点,并且规则如下:
- 最外一层是“墙壁”点,接下来的一层是没有被填充的点,被包裹的是填充的点
- """
- r = random.randint
- random.seed(time.time())
- Pointstack(w,h)
- for x in range(w):
- temp = list()
- for y in range(h):
- if x == 0 or x == (w-1) or y == 0 or y == (h-1):
- temp.append(Point(x,y,9))
- else:
- if x == 1 or x == (w-2) or y == 1 or y == (h-2):
- temp.append(Point(x,y,0))
- else:
- temp.append(Point(x,y,valuestack.pop()))
- points.append(temp)
- def Pointstack(w,h):
- size=w*h-(w*4+h*4-16)
- size=size/2
- random.seed(time.time())
- for i in range(size):
- value=random.randint(1,8)
- if len(valuestack)==0:
- valuestack.append(value)
- valuestack.append(value)
- else:
- valuestack.insert(random.randint(1,len(valuestack)),value)
- valuestack.insert(random.randint(1,len(valuestack)),value)
- def link(source,target):
- """点的连接
- 连接方法的思想:针对源点的每个方向尝试前进,如果可以前进,
- 则将针对该方向上的下个点的每个方向尝试前进,
- 当一个点的可选方向都不能前进的时候,则使用规定的信息标记该点,
- 并返回到已有前进路径中的前一个点,尝试该点其他可选方向。当回源点
- 的每个方向都走不通,连接失败返回False。否则当路径连接到目标点而且
- 路径的方向变化小于4的时候,连接成功返回路径
- """
- if source == target:
- return False
- if source.value==9 or source.value==0:
- return False
- path = list()
- fail = dict()
- change = 0
- current = source
- tempPoint = None
- while True:
- if current==target and change < 4:
- for p in path:
- p.directs = None
- return path
- if change == 4:
- current.directs = None
- fail[str(current.x)+"_"+str(current.y)] = change
- current = path.pop()
- change = change - current.changed
- continue
- if current == source:
- direct = current.forward(None,target)
- else:
- direct = current.forward(path[len(path)-1],target)
- if direct != None:
- if direct == "up" :
- x = current.x
- y = current.y + 1
- elif direct == "down":
- x = current.x
- y = current.y - 1
- elif direct == "left":
- x = current.x - 1
- y = current.y
- elif direct == "right":
- x = current.x + 1
- y = current.y
- if fail.has_key(str(x)+"_"+str(y)):
- if change >= fail.get(str(x)+"_"+str(y)):
- continue
- else:
- fail.pop(str(x)+"_"+str(y))
- change = change + current.changed
- path.append(current)
- current = points[x][y]
- else:
- if current == source:
- source.directs = None
- return False
- else:
- current.directs = None
- fail[str(current.x)+"_"+str(current.y)] = change
- current = path.pop()
- change = change - current.changed
- #createPoints(8,8)
- #p = link(points[2][2],points[5][2])
- #print p
新鲜出炉的连连看连接算法Python版相关推荐
- 连连看连接算法Javascript版
继连连看连接算法Python版后,我将该算法移植到了Javascript上,为在浏览器版连连看做准备. 功能及使用方法参照另外一篇:连连看连接算法Python版. 值得一提的是由于Javascript ...
- 新鲜出炉的头条面试算法
昨天下午实验室有一个同学参加了今日头条的面试,面试最终是以一个算法题结束. 题目如下: 给你一个有序整数数组,数组中的数可以是正数.负数.零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的 ...
- 【新鲜出炉】快手推荐算法 bing搜索 面经
转载自小小挖掘机 快手推荐算法: 一面 : 1.在另外一个公司实习相关,大概问了 20分钟,还是讲了很多东西的.从产品形态问到日活.每天的点击展示量,再到工作的具体内容,还有工程上的问题. 2.XGB ...
- 【TIOBE 2月编程语言排行榜新鲜出炉!Python获1.77%增长率!】
[TIOBE 2月编程语言排行榜新鲜出炉!Python获1.77%增长率!] 编程新贵Python刚经历了一次TIOBE考试,2020年2月,它拿到的最新分数是第3名.老牌编程语言Java独占鳌头,C ...
- 一文掌握明年物联网传感器市场!2022中国AIoT产业全景图谱报告新鲜出炉
来源:传感器专家网 物联网产业是传感器应用最广泛的领域之一,研发新型传感器,做传感器市场,都不能不考虑物联网产业的需求. 2021年随着COVID-19 病毒的存在已常态化,防疫抗疫进入了拉锯阶段:波 ...
- 五万字前端面试宝典——前端百题斩(上)新鲜出炉
从2021年5月9号开始更新<前端百题斩>,目前终于取得了阶段性成果,<前端百题斩>上册已经更新完毕,内容包括JS基础篇.浏览器篇.网络篇,共计50个章节,5万多字.关注公众号 ...
- “百度开放云编程马拉松”中国三大赛区获奖团队及作品新鲜出炉
2013年7月20-21日,以"绿色生活"为主题,面向广大移动互联网开发者,由百度开发者俱乐部主办.InfoQ和segmentfault社区联办.WWF(世界自然基金会)作为环保公 ...
- 这些技术人棒棒哒!BingoDay2017获奖名单新鲜出炉~~~
3月24日,在为来宾们带去详实的技术干货后,2017年的BingoDay圆满落幕了.但是,品高软件年度解决方案的竞选才刚刚开始!在经过数天紧张激烈的投票和评选后,今天,品高软件年度解决方案.Bingo ...
- 大数据进入人工智能时代:2017年大数据生态地图新鲜出炉
随着人工智能技术的高速发展,2017年是大数据全面进入人工智能时代的关键一年,根据IDC的报告,未来几年大数据和数据分析市场规模将进入高速增长阶段,从2016年的1300亿美元,增长至2020年的20 ...
最新文章
- WMI Series :管理对象的信息查询和方法访问
- 被解放的姜戈02 庄园疑云
- Nginx面试!java语言程序设计第四版,你还看不懂吗?
- 从C语言的角度重构数据结构系列(二)-如何衡量一个算法的优劣?
- php smarty 限制显示字数,smarty现在显示字数的各种写法
- openlayers 2 高亮显示元素以及通过属性查询高亮某一元素
- 如何在 Asp.Net Core 中 管理敏感数据
- C++set和multiset区别
- E104-BT02蓝牙无线传输模块物联网芯片的智能控制、采集
- 目前个人计算机使用的电子电路主要是,计算机基础知识理论题库.xls
- Luogu P1280 Niko的任务【线性dp】By cellur925
- 互联网公司各种“花式”裁员,套路特别深,作为程序员你知道吗?
- 爱奇艺网络协程编写高并发应用实践
- d - 数据结构实验之查找四:二分查找_数据结构与算法笔记
- Linux 下 Git 的源码安装
- CRUD了3 年从8K涨到30K,谁知道这4个月我到底经历了什么?
- JavaScript(十二)常见js特效
- java依赖倒转原则_设计原则之--依赖倒转原则
- 世界首个四足后空翻MIT机器猎豹踢足球,网友惊呼:终结者来了!
- SpringCloud简介---01