我正在用Python制作益智游戏,它应该是一个3x3幻灯片拼图。我创建了一个存储name / id和x,y坐标的类。
在函数up()
中,我想将星号(*
)向上移动一行,理论上它应该可以工作,但显然不行。我有一个函数,找到与两个坐标(find()
)相关联的类实例,并返回一个名为symbol
的类的实例。
幻灯片拼图的布局:
1 2 3
4 5 6
7 8 *
当我尝试将新值分配给我上面的类实例(由6表示)时,没有任何内容被分配。我想使用全局关键字,但这似乎是一个麻烦,因为那时我将检查每个坐标,然后说出要更改的变量。
这是一款益智游戏,所以玩家可以毫无问题地移动是非常重要的。我没有尝试过任何其他因为我不知道如何从这一点开始。
class symbol:
def __init__(self, x, y, val):
self.x = x
self.y = y
self.val = val
s1 = symbol(1, 1, "1")
s2 = symbol(2, 1, "2")
s3 = symbol(3, 1, "3")
s4 = symbol(1, 2, "4")
s5 = symbol(2, 2, "5")
s6 = symbol(3, 2, "6")
s7 = symbol(1, 3, "7")
s8 = symbol(2, 3, "8")
s9 = symbol(3, 3, "*")
def getPos():
xPos = 0
yPos = 0
for element in symbols:
if element.val == "*":
xPos = element.x
yPos = element.y
else:
pass
return xPos, yPos
def find(x, y):
xPos = 0
yPos = 0
found = symbol(100, 100, "FIND")
for element in symbols:
if element.x == x and element.y == y:
found.x = x
found.y = y
found.val = element.val
else:
pass
return found
def up():
x, y = getPos()
if y > 1:
newBlock = find(x, y-1)
myBlock = find(x, y)
myBlock.val = newBlock.val
newBlock.val = "*"
clear()
draw()
print(f"myBlock: {myBlock.val} ({myBlock.x}, {myBlock.y}), newBlock: {newBlock.val} ({newBlock.x}, {newBlock.y})")
else:
pass
#cannot go higher
问题是你的find
功能正在制作一个新的symbol
并返回。当up()
修改find()
的结果时,它只是改变一些生活在(我假设的)你的符号列表之外的副本。
一种解决方案是从find
中的列表中返回元素。即
for element in symbols:
if element.x == x and element.y == y:
return element
return None