如何编辑类的实例?

问题描述 投票:0回答:1

我正在用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
python class
1个回答
0
投票

问题是你的find功能正在制作一个新的symbol并返回。当up()修改find()的结果时,它只是改变一些生活在(我假设的)你的符号列表之外的副本。

一种解决方案是从find中的列表中返回元素。即

for element in symbols:
    if element.x == x and element.y == y:
        return element
return None
© www.soinside.com 2019 - 2024. All rights reserved.