这段时间老是“不务正业”的搞一些东西玩。之前的贪吃蛇,俄罗斯方块激发了我研究游戏算法的兴趣。经过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,帮助我测试这个算法,并为这个算法写了一个用户交互界面。

  1. #-*-coding:utf-8-*-
  2. """连连看连接算法
  3. 为连连看游戏提供连接算法
  4. 模块中包含一个Point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。
  5. 其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案,9代表被填充为墙壁
  6. 模块中还包含一个名为points的Point列表,其中保存着整个游戏界面中的每个点
  7. 使用模块的时候应首先调用createPoints方法,初始化游戏界面中每个点,然后可通过points访问到每个点,继而初始化界面
  8. 模块中核心的方法是link,通过提供源点和终点,可尝试连接两点,如果可以连接则返回保存路径的path列表,否则返回False
  9. """
  10. import random
  11. import time
  12. __author__  ="http://blog.csdn.net/anhulife"
  13. __license__ ="python"
  14. class Point:
  15. """Point类
  16. Point类是游戏中基本单元:“点”
  17. """
  18. def __init__(self,x,y,value):
  19. self.x = x
  20. self.y = y
  21. self.value = value
  22. self.directs = None
  23. self.changed = 0
  24. def __createDirect(self,pre,target):
  25. """构造点的方向集
  26. 每个点在连接的过程中都持有一个方向集,这个方向集中保
  27. 存着该点的前进方向选择的优先级优先级:指向目标点的方向级别最
  28. 高,在同等级别并且遵循x方向优先于y方向
  29. """
  30. self.directs = list()
  31. stx = target.x - self.x
  32. sty = target.y - self.y
  33. if stx >= 0 :
  34. self.directs.append("right")
  35. self.directs.append("left")
  36. else:
  37. self.directs.append("left")
  38. self.directs.append("right")
  39. if sty >= 0 :
  40. self.directs.insert(1,"up")
  41. self.directs.append("down")
  42. else:
  43. self.directs.insert(1,"down")
  44. self.directs.append("up")
  45. if pre == None :
  46. return
  47. spx = pre.x - self.x
  48. spy = pre.y - self.y
  49. if spx == 0 :
  50. if spy == 1:
  51. self.directs.remove("up")
  52. else:
  53. self.directs.remove("down")
  54. else :
  55. if spx == 1:
  56. self.directs.remove("right")
  57. else:
  58. self.directs.remove("left")
  59. def forward(self,pre,target):
  60. """点的前进动作
  61. 点的前进即是依次从方向集中取出优先级高的方向,并判
  62. 断该方向上的下一个点是否被填充如果没有被填充则说明该方
  63. 向可通,并返回该方向。否则试探下一个方向,如果方向集中没
  64. 有方向可用了,则返回None
  65. """
  66. if self.directs == None :
  67. self.__createDirect(pre,target)
  68. if len(self.directs) == 0 :
  69. return None
  70. direct = None
  71. while(True):
  72. if len(self.directs) == 0 :
  73. break
  74. tmpDirect = self.directs.pop(0)
  75. if tmpDirect == "up" :
  76. x = self.x
  77. y = self.y + 1
  78. elif tmpDirect == "down":
  79. x = self.x
  80. y = self.y - 1
  81. elif tmpDirect == "left":
  82. x = self.x - 1
  83. y = self.y
  84. elif tmpDirect == "right":
  85. x = self.x + 1
  86. y = self.y
  87. p = points[x][y]
  88. if p.value > 0 and p != target:
  89. continue
  90. else :
  91. direct = tmpDirect
  92. if pre == None:
  93. self.changed = 1
  94. else:
  95. if (pre.x - self.x) == 0 and (p.x - self.x) == 0:
  96. self.changed = 0
  97. else:
  98. if (pre.y - self.y) == 0 and (p.y - self.y) == 0:
  99. self.changed = 0
  100. else :
  101. self.changed = 1
  102. break
  103. return direct
  104. def __eq__(self,p):
  105. if p == None :
  106. return False
  107. if self.x == p.x and self.y == p.y :
  108. return True
  109. else:
  110. return False
  111. points = list()
  112. valuestack=list()
  113. def createPoints(w,h):
  114. """构造游戏界面的点
  115. 初始化界面中的所有的点,并且规则如下:
  116. 最外一层是“墙壁”点,接下来的一层是没有被填充的点,被包裹的是填充的点
  117. """
  118. r = random.randint
  119. random.seed(time.time())
  120. Pointstack(w,h)
  121. for x in range(w):
  122. temp = list()
  123. for y in range(h):
  124. if x == 0 or x == (w-1) or y == 0 or y == (h-1):
  125. temp.append(Point(x,y,9))
  126. else:
  127. if x == 1 or x == (w-2) or y == 1 or y == (h-2):
  128. temp.append(Point(x,y,0))
  129. else:
  130. temp.append(Point(x,y,valuestack.pop()))
  131. points.append(temp)
  132. def Pointstack(w,h):
  133. size=w*h-(w*4+h*4-16)
  134. size=size/2
  135. random.seed(time.time())
  136. for i in range(size):
  137. value=random.randint(1,8)
  138. if len(valuestack)==0:
  139. valuestack.append(value)
  140. valuestack.append(value)
  141. else:
  142. valuestack.insert(random.randint(1,len(valuestack)),value)
  143. valuestack.insert(random.randint(1,len(valuestack)),value)
  144. def link(source,target):
  145. """点的连接
  146. 连接方法的思想:针对源点的每个方向尝试前进,如果可以前进,
  147. 则将针对该方向上的下个点的每个方向尝试前进,
  148. 当一个点的可选方向都不能前进的时候,则使用规定的信息标记该点,
  149. 并返回到已有前进路径中的前一个点,尝试该点其他可选方向。当回源点
  150. 的每个方向都走不通,连接失败返回False。否则当路径连接到目标点而且
  151. 路径的方向变化小于4的时候,连接成功返回路径
  152. """
  153. if source == target:
  154. return False
  155. if source.value==9 or source.value==0:
  156. return False
  157. path = list()
  158. fail = dict()
  159. change = 0
  160. current = source
  161. tempPoint = None
  162. while True:
  163. if current==target and change < 4:
  164. for p in path:
  165. p.directs = None
  166. return path
  167. if change == 4:
  168. current.directs = None
  169. fail[str(current.x)+"_"+str(current.y)] = change
  170. current = path.pop()
  171. change = change - current.changed
  172. continue
  173. if current == source:
  174. direct = current.forward(None,target)
  175. else:
  176. direct = current.forward(path[len(path)-1],target)
  177. if direct != None:
  178. if direct == "up" :
  179. x = current.x
  180. y = current.y + 1
  181. elif direct == "down":
  182. x = current.x
  183. y = current.y - 1
  184. elif direct == "left":
  185. x = current.x - 1
  186. y = current.y
  187. elif direct == "right":
  188. x = current.x + 1
  189. y = current.y
  190. if fail.has_key(str(x)+"_"+str(y)):
  191. if change >= fail.get(str(x)+"_"+str(y)):
  192. continue
  193. else:
  194. fail.pop(str(x)+"_"+str(y))
  195. change = change + current.changed
  196. path.append(current)
  197. current = points[x][y]
  198. else:
  199. if current == source:
  200. source.directs = None
  201. return False
  202. else:
  203. current.directs = None
  204. fail[str(current.x)+"_"+str(current.y)] = change
  205. current = path.pop()
  206. change = change - current.changed
  207. #createPoints(8,8)
  208. #p = link(points[2][2],points[5][2])
  209. #print p

新鲜出炉的连连看连接算法Python版相关推荐

  1. 连连看连接算法Javascript版

    继连连看连接算法Python版后,我将该算法移植到了Javascript上,为在浏览器版连连看做准备. 功能及使用方法参照另外一篇:连连看连接算法Python版. 值得一提的是由于Javascript ...

  2. 新鲜出炉的头条面试算法

    昨天下午实验室有一个同学参加了今日头条的面试,面试最终是以一个算法题结束. 题目如下: 给你一个有序整数数组,数组中的数可以是正数.负数.零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的 ...

  3. 【新鲜出炉】快手推荐算法 bing搜索 面经

    转载自小小挖掘机 快手推荐算法: 一面 : 1.在另外一个公司实习相关,大概问了 20分钟,还是讲了很多东西的.从产品形态问到日活.每天的点击展示量,再到工作的具体内容,还有工程上的问题. 2.XGB ...

  4. 【TIOBE 2月编程语言排行榜新鲜出炉!Python获1.77%增长率!】

    [TIOBE 2月编程语言排行榜新鲜出炉!Python获1.77%增长率!] 编程新贵Python刚经历了一次TIOBE考试,2020年2月,它拿到的最新分数是第3名.老牌编程语言Java独占鳌头,C ...

  5. 一文掌握明年物联网传感器市场!2022中国AIoT产业全景图谱报告新鲜出炉

    来源:传感器专家网 物联网产业是传感器应用最广泛的领域之一,研发新型传感器,做传感器市场,都不能不考虑物联网产业的需求. 2021年随着COVID-19 病毒的存在已常态化,防疫抗疫进入了拉锯阶段:波 ...

  6. 五万字前端面试宝典——前端百题斩(上)新鲜出炉

    从2021年5月9号开始更新<前端百题斩>,目前终于取得了阶段性成果,<前端百题斩>上册已经更新完毕,内容包括JS基础篇.浏览器篇.网络篇,共计50个章节,5万多字.关注公众号 ...

  7. “百度开放云编程马拉松”中国三大赛区获奖团队及作品新鲜出炉

    2013年7月20-21日,以"绿色生活"为主题,面向广大移动互联网开发者,由百度开发者俱乐部主办.InfoQ和segmentfault社区联办.WWF(世界自然基金会)作为环保公 ...

  8. 这些技术人棒棒哒!BingoDay2017获奖名单新鲜出炉~~~

    3月24日,在为来宾们带去详实的技术干货后,2017年的BingoDay圆满落幕了.但是,品高软件年度解决方案的竞选才刚刚开始!在经过数天紧张激烈的投票和评选后,今天,品高软件年度解决方案.Bingo ...

  9. 大数据进入人工智能时代:2017年大数据生态地图新鲜出炉

    随着人工智能技术的高速发展,2017年是大数据全面进入人工智能时代的关键一年,根据IDC的报告,未来几年大数据和数据分析市场规模将进入高速增长阶段,从2016年的1300亿美元,增长至2020年的20 ...

最新文章

  1. WMI Series :管理对象的信息查询和方法访问
  2. 被解放的姜戈02 庄园疑云
  3. Nginx面试!java语言程序设计第四版,你还看不懂吗?
  4. 从C语言的角度重构数据结构系列(二)-如何衡量一个算法的优劣?
  5. php smarty 限制显示字数,smarty现在显示字数的各种写法
  6. openlayers 2 高亮显示元素以及通过属性查询高亮某一元素
  7. 如何在 Asp.Net Core 中 管理敏感数据
  8. C++set和multiset区别
  9. E104-BT02蓝牙无线传输模块物联网芯片的智能控制、采集
  10. 目前个人计算机使用的电子电路主要是,计算机基础知识理论题库.xls
  11. Luogu P1280 Niko的任务【线性dp】By cellur925
  12. 互联网公司各种“花式”裁员,套路特别深,作为程序员你知道吗?
  13. 爱奇艺网络协程编写高并发应用实践
  14. d - 数据结构实验之查找四:二分查找_数据结构与算法笔记
  15. Linux 下 Git 的源码安装
  16. CRUD了3 年从8K涨到30K,谁知道这4个月我到底经历了什么?
  17. JavaScript(十二)常见js特效
  18. java依赖倒转原则_设计原则之--依赖倒转原则
  19. 世界首个四足后空翻MIT机器猎豹踢足球,网友惊呼:终结者来了!
  20. SpringCloud简介---01

热门文章

  1. 线性回归分析——高尔顿数据集更正版
  2. spin_lock 自旋锁
  3. 靶机实战(bulldog)
  4. 自己定义jquery插件轮播图
  5. 南农计算机考研真题,南京农业大学考研真题汇总
  6. C基础的ObjectiveC学习
  7. 定时任务实现原理详解
  8. OBS直播软件-简介
  9. win10无法装载iso文件_iso镜像安装失败无法安装Windows10怎么办?
  10. iOS UITextView问题一网打尽(占位文字、汉字输入字数计算、自动高度改变)