Python编写的点灯小游戏代码,python点灯小游戏,Python语言编写的点
Python编写的点灯小游戏代码,python点灯小游戏,Python语言编写的点
Python语言编写的点灯小游戏代码及思路如下:
点灯游戏及其求解的方法,
点灯游戏的游戏规则:
(1)有个N行N列的灯板,当你开关其中一盏灯;
(2)它和上下左右的灯的状态全部反转,目标是将全部的灯点亮;
(3)这个程序采用递归回溯法对任意状态的灯板进行求解;
(4)游戏中左点灯将按照游戏规则动作,右点灯只对一盏灯进行操作,以便您测试任何状态的自动求解。
def InitTable(size, value): return [[value for i in range(size)] for j in range(size)]class LightBoard: def __init__(self, size, status=""): self.clickBoard = InitTable(size, -1) self.lightBoard = InitTable(size, 0) self.toCheck = [] for i in range(size): for j in range(size): self.PushToCheck((i,j)) for pos, value in enumerate(status): if value == "1": self.lightBoard[pos/size][pos%size] = 1 self.size = size def PopToCheck(self): if len(self.toCheck) > 0: pos = self.toCheck[-1] del self.toCheck[-1] else: pos = None return pos def PushToCheck(self, pos): self.toCheck.append(pos) def ConnectedLight(self, pos): x, y = pos yield pos if x - 1 >= 0: yield x-1,y if x + 1 <self.size: yield x+1,y if y -1 >= 0: yield x, y-1 if y+1 < self.size: yield x, y+1 def NotCheckLight(self, pos): return [(x,y) for x, y in self.ConnectedLight(pos) if self.clickBoard[x][y] == -1] def SetCheck(self, pos, value): x, y = pos self.clickBoard[x][y] = value for x, y in self.ConnectedLight(pos): self.lightBoard[x][y] = 1 - self.lightBoard[x][y] def Pass(self, pos): x, y = pos self.clickBoard[x][y] = 0 def CancelPass(self, pos): x, y = pos self.clickBoard[x][y] = -1 def CheckError(self, pos): for p in self.ConnectedLight(pos): x, y = p if self.lightBoard[x][y] == 0 and len(self.NotCheckLight(p)) == 0: return True return Falsedef Solve(board): clickpos = board.PopToCheck() if clickpos == None: return board.clickBoard pos = board.NotCheckLight(clickpos)[0] board.SetCheck(pos, 1) if not board.CheckError( pos ): r = Solve(board) if r: return r board.SetCheck(pos, -1) board.Pass(pos) if not board.CheckError( pos ): r = Solve(board) if r: return r board.CancelPass(pos) board.PushToCheck(clickpos) return Falsefrom Tkinter import *class LightButton(Button): def __init__(self, parent, pos, board): Button.__init__(self, parent, width=2) self.board = board self.status = 0 self.x, self.y = pos self.SetColor() self.bind("<Button-1>",self.onClick) self.bind("<Button-3>",self.onRightClick) def SetColor(self): if self.status == 0: self.config(bg="#cccccc") if self.status == 1: self.config(bg="#ffcccc") def onClick(self,event): toclick = [(0, 0), (-1,0), (1,0), (0, 1), (0, -1)] self.config(text="") for x,y in toclick: try: b = self.board[(self.x-x, self.y-y)] b.status = 1 - b.status b.SetColor() except: pass def onRightClick(self, event): self.status = 1 - self.status self.SetColor()if __name__ == "__main__": from tkSimpleDialog import askinteger def SolveIt(): boardStatus = ["0"] * Size * Size for pos, light in buttons.items(): if light.status == 1: boardStatus[pos[1]*Size+pos[0]] = "1" clickBoard = Solve(LightBoard(Size, "".join(boardStatus))) for x, r in enumerate(clickBoard): for y, c in enumerate(r): if c == 1: buttons[(y,x)].config(text="*")#www.iplaypy.com def Clear(): for button in buttons.values(): button.status = 0 button.SetColor() root = Tk() root.title("Light Solver") f = Frame(root) f.pack(side = TOP) Button(f, text="Solve", command=SolveIt).pack(side=LEFT) Button(f, text="Clear", command=Clear).pack(side=LEFT) buttons = {} Size = askinteger("Light Solver", "Please Input Board Size", initialvalue=5) for y in range(Size): f = Frame(root) f.pack(side = LEFT) for x in range(Size): pos = x, y b = LightButton(f, pos, buttons) b.pack() buttons[pos] = b mainloop()
编橙之家文章,
相关内容
- 日期查询软件python源代码,日期查询python,用python语言编
- Python 完成IE调用的示例源码分享,python示例,Python 完成
- Python是如何完成数据导入的,python完成数据导入,想知道
- 一个简易的Python封装的FTP功能,python封装ftp,这是一个简
- 基于Python的词典功能之爱词霸示例,python词霸,基于Py
- Python对RSA算法的简单实现,pythonrsa算法,Python对RSA算法
- 一个初学者练手的Python多线程实现下载的程序,练手
- Python迭代在现实中的应用示例源码,python示例,Python迭代
- Python方法完成自动连接ssh示例,python方法ssh示例,Pytho
- 关于Python解析xml dom的简单应用,python解析xmldom,关于P
评论关闭