功能:为连连看游戏提供连接算法

说明:模块中包含一个Point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。

其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案,9代表被填充为墙壁

模块中还包含一个名为points的Point列表,其中保存着整个游戏界面中的每个点

使用模块的时候应首先调用createPoints方法,初始化游戏界面中每个点,然后可通过points访问到每个点,继而初始化界面

模块中核心的方法是link,通过提供源点和终点,可尝试连接两点,如果可以连接则返回保存路径的path列表,否则返回False

复制代码 代码如下:

#-*-coding:utf-8-*-

"""连连看连接算法

为连连看游戏提供连接算法

模块中包含一个Point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。

其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案,9代表被填充为墙壁

模块中还包含一个名为points的Point列表,其中保存着整个游戏界面中的每个点

使用模块的时候应首先调用createPoints方法,初始化游戏界面中每个点,然后可通过points访问到每个点,继而初始化界面

模块中核心的方法是link,通过提供源点和终点,可尝试连接两点,如果可以连接则返回保存路径的path列表,否则返回False

"""

import random

__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 isChanged(self):

"""判断方向变化

返回在该点前进时,是否带来了方向的变化,即方向不同于原方向

"""

return self.changed

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()

def createPoints(w,h):

"""构造游戏界面的点

初始化界面中的所有的点,并且规则如下:

最外一层是“墙壁”点,接下来的一层是没有被填充的点,被包裹的是填充的点

"""

r = random.randint

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,r(1,8)))

points.append(temp)

def link(source,target):

"""点的连接

连接方法的思想:针对源点的每个方向尝试前进,如果可以前进,则将针对该方向上的下个点的每个方向尝试前进

当一个点的可选方向都不能前进的时候,则返回到已有前进路径中的前一个点,尝试该点其他可选方向。当回源点

的每个方向都走不通或是路径的方向变化等于4的时候,连接失败返回False。否则当路径连接到目标点而且路径的方向变化小

于4的时候,连接成功返回路径

"""

if source == target:

return False

path = list()

change = 0

current = source

while True:

if current==target and change < 4:

for p in path:

p.directs = None

return path

if change == 4:

current.directs = None

current = path.pop(len(path)-1)

change = change - current.isChanged()

continue

if change == 0:

direct = current.forward(None,target)

else:

direct = current.forward(path[len(path)-1],target)

if direct != None:

change = change + current.isChanged()

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

print x,y

path.append(current)

current = points[x][y]

else:

if change == 0:

return False

else:

current.directs = None

current = path.pop(len(path)-1)

change = change - current.isChanged()

createPoints(8,8)

p = link(points[2][2],points[5][2])

print p

本文标题: Python 连连看连接算法

本文地址: http://www.cppcns.com/jiaoben/python/45584.html

python连连看_Python 连连看连接算法相关推荐

  1. 谱聚类python代码_Python 谱聚类算法从零开始

    谱聚类算法是一种常用的无监督机器学习算法,其性能优于其他聚类方法. 此外,谱聚类实现起来非常简单,并且可以通过标准线性代数方法有效地求解. 在谱聚类算法中,根据数据点之间的相似性而不是k-均值中的绝对 ...

  2. python 栈_Python数据结构与算法05:基本结构:栈的应用之括号匹配

    注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为7分钟. 算法流程 括号匹配情况介绍 我们经常会遇到类似(9-1)*(8+7)/(4-2).print(& ...

  3. python实验原理_Python实现蒙特卡洛算法小实验过程详解

    蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...

  4. python 数学公式_python的数学算法函数及公式用法

    之前老是跟大家说看久了Python,总感觉就像是很多的数学公式运算,大家一致觉得只是一点点像,那今天跟大家直接就说下叫"数学"算法的内容,这样大家再来品鉴下,是不是可以贯通使用的内 ...

  5. 新鲜出炉的连连看连接算法Python版

    这段时间老是"不务正业"的搞一些东西玩.之前的贪吃蛇,俄罗斯方块激发了我研究游戏算法的兴趣.经过1个星期的构思,连连看的连接算法终于出炉了.再过一段时间就基于这个算法使用JavaS ...

  6. 连连看连接算法Javascript版

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

  7. python连连看_python tkinter实现连连看游戏

    需要自己添加图片素材呦 运行效果: 完整代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-10-02 15:19:24 # ...

  8. Python 实现【连连看】游戏

    自己蛋疼地设计了个连连看游戏,消除算法真的很蛋疼... 完成设计之后,总结了该连连看游戏几个重点: 生成成对的图片元素 将图片元素打乱排布 定义什么才算"相连"(两张图片的连线不多 ...

  9. 中文分词算法python代码_python实现中文分词FMM算法实例

    本文实例讲述了python实现中文分词FMM算法.分享给大家供大家参考.具体分析如下: FMM算法的最简单思想是使用贪心算法向前找n个,如果这n个组成的词在词典中出现,就ok,如果没有出现,那么找n- ...

  10. python如何连接自己电脑服务器_Python远程连接windows服务器并上传数据

    [芝麻IP代理]大数据时代下,我们对于Python的应用真的是淋漓尽致,第一次玩服务器,电脑端远程连接能连上,可SSH却始终不行,后来才发现,这根本不是一种东西,SSH得在服务器上搭建SSH seve ...

最新文章

  1. 零基础入门--中文命名实体识别(BiLSTM+CRF模型,含代码)
  2. Java长见到的面试题,看你能答出几题,就知道自己有多菜了
  3. GTX1080 安装 CUDA 7.5
  4. 建议收藏!近期值得读的 9 篇「对抗样本」最新论文
  5. java数据库编程——执行查询操作(一)
  6. bootstrap学习笔记(1)基础段落,表格的实现
  7. 有关Kill Session问题的讨论(旧文初发)
  8. Overloud Gem Modula for Mac - 三合一经典调制插件
  9. ThinkPHP5学校宿舍管理系统
  10. Nessus下载失败问题解决
  11. 惠普136w耗材贵吗_说说打印机选购经验 的第十台打印机 HP Laser 136w
  12. 从零开始做运营-读书笔记一
  13. hadoop之大数据生态系统的前世今生
  14. 涉密计算机打印机共享案例分析,案例教程|兼收并蓄,有线打印机无线共享实战...
  15. 汇报措辞:你懂得怎样向领导汇报吗(审阅、审批、批阅、批示、查阅)?
  16. OpenStack核心组件原理与应用之Nova(未完待续)
  17. 如何做好用户故事地图?
  18. 模式识别(二)特征矢量与空间
  19. 计算机组成原理第三次实验(静态随机存储器实验)
  20. DDR,DDR2,DDR3,SDRAM比较区别

热门文章

  1. 小米手机google play下载应用一直显示等待中的解决办法
  2. 区块链供应链金融实战3
  3. Nooi 一个Onedrive管理器
  4. div 左中右结构布局问题
  5. dex文件格式------header_item解析
  6. DICOM影像中的窗宽窗位
  7. Jquery 漂浮广告的插件
  8. python xmind_XMind
  9. dnmap分布式集群扫描
  10. FPGA Vivado AXI _DMA IP介绍