开发者社区> 问答> 正文

只在条件为真时才在“如果”中执行函数

我正在编写一个简单的迷宫游戏。我已经创建了一个带有move方法的Player类——但是每当我想检查移动是否在可用路径列表中时,它都会运行move方法并改变我的角色位置。

class Player :

    def __init__ (self, position):
        self.position = position

    def move (self, direction):
        if direction == "right":    self.position[0] += 1
        elif direction == "left":   self.position[0] -= 1
        elif direction == "up":     self.position[1] -= 1
        elif direction == "down":   self.position[1] += 1
        return self.position

maze_paths = [[0,0], [1,0]]
mac = Player([0,0])
direction = 'left'

if mac.move(direction) in maze_paths:
    print('ok')
else:
    print('No way!')

print('Final position is: %r' % (mac.position))

我期望的输出是:

No way!
Final position is: [0, 0]

…因为按照迷宫的定义,向左移动是不允许的。然而,我们拥有的是:

No way!
Final position is: [-1, 0]

…尽管这是不允许的,但还是发生了。 问题来源StackOverflow 地址:/questions/59381683/making-a-function-in-an-if-only-take-action-when-a-condition-is-true

展开
收起
kun坤 2019-12-27 17:54:38 357 0
1 条回答
写回答
取消 提交回答
  • 正如@TimRichardson在评论中建议的那样,计算状态的行为应该从改变状态的行为中分离出来。函数式编程语言是为了简化这一过程而构建的,但Python不是——因此您需要克服一些困难。 考虑将move分成两个方法,如下所示的calculate_move和do_move:

    class Player:
        def calculate_move(self, direction):
            """Calculate where we would be if we moved in a direction"""
            emulated_position = self.position[:]  # make a copy
            if direction == "right":    emulated_position[0] += 1
            elif direction == "left":   emulated_position[0] -= 1
            elif direction == "up":     emulated_position[1] -= 1
            elif direction == "down":   emulated_position[1] += 1
            return emulated_position
    
        def do_move(self, direction):
            """Actually move in the given direction"""
            self.position = self.calculate_move(direction)
    
    maze_paths = [[0,0], [1,0]]
    mac = Player([0,0])
    direction = 'left'
    
    if mac.calculate_move(direction) in maze_paths:
        mac.do_move(direction)
        print('ok')
    else:
        print('No way!')
    
    print('Final position is: %r' % mac.position)
    

    …适当发出作为输出:

    No way!
    Final position is: [0, 0]
    
    2019-12-27 17:54:45
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载