将游戏转换为面向对象的版本

时间:2015-03-12 23:01:14

标签: python class oop object python-3.x

我编写了一个简单的控制台游戏,允许我将我的播放器移动到一个带有墙壁和空白的小水平。这一切都只使用几个简单的功能完成。

我对Python很陌生,但接下来我想学习OOP,如果我想让这个游戏面向对象,我将如何继续学习呢?

我理解类和对象相当,但如果我不理解所有答案,请耐心等待。

这是当前的游戏:

LEVEL = [
    'xxxxxx',
    'x    x',
    'x i  x',
    'x    x',
    'x    x',
    'xxxxxx'
]


def get_block(x, y):
    """Gets a block at the given coordinates."""
    try:
        return LEVEL[y][x]
    except IndexError:
        return None


def set_block(x, y, block):
    """Sets a block at the given coordinates."""
    try:
        LEVEL[y] = LEVEL[y][:x] + block + LEVEL[y][x + 1:]
    except IndexError:
        pass


def get_player_position():
    """Gets player's position."""
    for y, row in enumerate(LEVEL):
        for x, column in enumerate(row):
            if column == 'i':
                return x, y


def set_player_position(x, y):
    """Sets player's position."""
    block = get_block(x, y)
    if block == ' ':
        px, py = get_player_position()
        set_block(px, py, ' ')
        set_block(x, y, 'i')


def main():
    """Entry point for the program."""
    cmd = ''
    while cmd.lower() not in ('quit', 'q'):
        print('\n' * 30)
        for row in LEVEL:
            print(row)
        cmd = input('Command: ').lower()
        px, py = get_player_position()
        if cmd == 'w':
            set_player_position(px, py - 1)
        elif cmd == 's':
            set_player_position(px, py + 1)
        elif cmd == 'a':
            set_player_position(px - 1, py)
        elif cmd == 'd':
            set_player_position(px + 1, py)
    print('Bye.')

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:1)

你的问题非常开放,所以很难给出一个全面的答案 - 所以我所做的就是确定现有代码中的一个数据结构把它变成了一个班级。

以前用于操作全局数据 - 数据结构的函数现在是类的实例的所有公共方法,这是唯一允许在名为{{的私有属性中对其中保存的数据进行更改的方法。 1}}。

做这类事情是编写面向对象软件必不可少的第一步。

希望你觉得这个例子有点启发。

_field