为什么class属性只更改一次?

2024-05-29 11:59:50 发布

您现在位置:Python中文网/ 问答频道 /正文

class Battlefield:
    def __init__(self):
        self.field = new_battlefield()
        self.amount_ships = 0
        self.ships = []
        self.fourdeck = []
        self.tripledecks = []
        self.doubledecks = []
        self.singledecks = []

    def change_value(self, point, value):
        if '\n' in self.field[point]:
            self.field[point] = ' {}\n'.format(value)
        else:
            self.field[point] = ' {}'.format(value)

    def make_move(self):
        pass

    def __str__(self):
        return '    a b c d e f g h i j\n\n' + \
               ''.join(self.field.values())

field是带有键的字典:

1  1a 1b 1c 1d 1e 1f 1g 1h 1i 1j
2  2a 2b 2c 2d
3  ..
4  ..
5  ..
6  ..
7  ..
8  ..
9  ..
10 10a 10b 10c 10d 10e 10f 10g 10h 10j 

我知道这远不是最好的解决方案,但为了解决这个问题,我决定编写一个游标类:

class Cursor:
    def __init__(self, start_point=None):
        self.battlefield = Battlefield()
        self.field_keys = list(self.battlefield.field.keys())
        if start_point is not None:
            self.point = start_point
        else:
            self.point = '1a'
        self.battlefield.change_value(self.point, 'X')
        self.point_key_idx = self.field_keys.index(self.point)


    def up(self):
        if self.point_key_idx not in range(1, 11):
            new_point_key = self.point_key_idx - 11
            self.point = self.field_keys[new_point_key]
        return self.point

    def down(self):
        pass

    def left(self):
        pass

    def right(self):
        pass

    def move(self, move):
        if move in ('up', 'down', 'left', 'right'):
            self.battlefield.change_value(self.point, '~')
            new_point = self.__getattribute__(move)()
            self.battlefield.change_value(new_point, 'X')
        else:
            raise ValueError('Move must be in: up, down, left, right.')

        return new_point

我的问题: 当我尝试使用“向上”函数和其他函数多次移动光标时,self.point值只更改一次

cur = Cursor('4d')
print(cur.point) # 4d

cur.up()
print(cur.point) # 3d

cur.up()
print(cur.point) # 3d

cur.up()
print(cur.point) # 3d

函数的最后一次使用应返回“1d”。我不知道该怎么办


Tags: keyinselffieldnewmoveifvalue
1条回答
网友
1楼 · 发布于 2024-05-29 11:59:50

您只更新了self.point,而不是self.point_key_idx

    def up(self):
        if self.point_key_idx not in range(1, 11):
            self.point_key_idx -= 11
            self.point = self.field_keys[self.point_key_idx]
        return self.point

相关问题 更多 >

    热门问题