我游戏中的接线逻辑
Wiring logic in my game
我正在 python 中编写一个基于图块的游戏。基本上,您可以在方块上放置不同的方块,其中一些方块会产生或使用能量。所以,有电线。在尝试弄清楚我将如何对电线进行编程之后,我决定制作一个 wireNetwork class。除了网络一分为二之外,我的一切都运行良好且花花公子。假设有两个独立的电线网络,我用电线在它们之间架起一座桥梁,以便将它们连接起来。我的代码注意到这一点并将两个有线网络组合成一个合并的网络。但是,如果我要删除网桥,再次创建两个单独的网络组怎么办?我将如何处理?下面是我的游戏的接线代码。
class wireTemplate():
def __init__(self, image, maxPower):
self.image = pygame.transform.scale(image, (tileW,tileH))
wireTemplates.append(self)
self.maxPower = maxPower
def reproduce(self,x,y):
global wireMap
temp = copy.copy(self)
temp.rect = pygame.Rect(x*tileW,y*tileH,tileW,tileH)
temp.x = x
temp.y = y
wireMap[y][x] = temp
wires.append(temp)
didSomething = False
for i in getSurrounding(wireMap,x,y):
if i != None and i.type == "Wire":
if temp not in i.network.wires:
i.network.wires.append(temp)
temp.network = i.network
didSomething = True
#getSurrounding() returns the surrounding tiles of the
#coordinates specified.
for i2 in getSurrounding(wireMap,x,y):
if i2 != None and i2.type == "Wire":
if i.network != i2.network:
mergeNetworks(i.network,i2.network)
if not didSomething:
temp.network = wireNetwork()
temp.network.wires.append(temp)
return temp
def delete(self):
wires.remove(self)
self.network.wires.remove(self)
if self.network.wires == []: self.network.delete()
for iteration, i in enumerate(wireMap):
if self in i:
wireMap[iteration][i.index(self)] = None
class wireNetwork():
def __init__(self):
wireNetworks.append(self)
self.wires = []
self.outputs = []
self.inputs = []
self.color = pygame.Color(random.choice([0,255]),random.choice([0,255]),random.choice([0,255]),50)
def delete(self):
wireNetworks.remove(self)
您正在建模的是图表;您需要每个节点来跟踪其邻居。您可以在内存中保留一个数据结构,以便快速识别两个节点是否连接(union-find algorithm 非常适合这个),只要您正在使用该结构或继续积累连接,这就非常快。断开连接将需要您从头开始重建联合查找数据结构,这将相对昂贵,但您拥有这样做所需的源数据(每个节点的邻居数据)。
我正在 python 中编写一个基于图块的游戏。基本上,您可以在方块上放置不同的方块,其中一些方块会产生或使用能量。所以,有电线。在尝试弄清楚我将如何对电线进行编程之后,我决定制作一个 wireNetwork class。除了网络一分为二之外,我的一切都运行良好且花花公子。假设有两个独立的电线网络,我用电线在它们之间架起一座桥梁,以便将它们连接起来。我的代码注意到这一点并将两个有线网络组合成一个合并的网络。但是,如果我要删除网桥,再次创建两个单独的网络组怎么办?我将如何处理?下面是我的游戏的接线代码。
class wireTemplate():
def __init__(self, image, maxPower):
self.image = pygame.transform.scale(image, (tileW,tileH))
wireTemplates.append(self)
self.maxPower = maxPower
def reproduce(self,x,y):
global wireMap
temp = copy.copy(self)
temp.rect = pygame.Rect(x*tileW,y*tileH,tileW,tileH)
temp.x = x
temp.y = y
wireMap[y][x] = temp
wires.append(temp)
didSomething = False
for i in getSurrounding(wireMap,x,y):
if i != None and i.type == "Wire":
if temp not in i.network.wires:
i.network.wires.append(temp)
temp.network = i.network
didSomething = True
#getSurrounding() returns the surrounding tiles of the
#coordinates specified.
for i2 in getSurrounding(wireMap,x,y):
if i2 != None and i2.type == "Wire":
if i.network != i2.network:
mergeNetworks(i.network,i2.network)
if not didSomething:
temp.network = wireNetwork()
temp.network.wires.append(temp)
return temp
def delete(self):
wires.remove(self)
self.network.wires.remove(self)
if self.network.wires == []: self.network.delete()
for iteration, i in enumerate(wireMap):
if self in i:
wireMap[iteration][i.index(self)] = None
class wireNetwork():
def __init__(self):
wireNetworks.append(self)
self.wires = []
self.outputs = []
self.inputs = []
self.color = pygame.Color(random.choice([0,255]),random.choice([0,255]),random.choice([0,255]),50)
def delete(self):
wireNetworks.remove(self)
您正在建模的是图表;您需要每个节点来跟踪其邻居。您可以在内存中保留一个数据结构,以便快速识别两个节点是否连接(union-find algorithm 非常适合这个),只要您正在使用该结构或继续积累连接,这就非常快。断开连接将需要您从头开始重建联合查找数据结构,这将相对昂贵,但您拥有这样做所需的源数据(每个节点的邻居数据)。