【问题标题】:Determine which player is on the move确定哪个玩家在移动
【发布时间】:2020-04-24 01:17:40
【问题描述】:

我正在尝试在 python 中构建一个纸牌游戏以了解 OOP。 我正在寻找一种方法来确定哪些玩家正在移动。纸牌游戏的规则是四个玩家中的一个是庄家,然后下一个是第一个出牌的玩家。 我已经搜索了一些方法来做到这一点,但我找不到解决方案。 目前我有这样的事情:

player_list = [p1, p2, p3, p4]

def func_turn(first_player):
    for i in range(len(player_list)): 

        if first_player + i == 4:
            first_player = 0
        player_list[first_player + i].play_card()

有没有更好的方法可以在播放器类或一些我不知道的列表函数中实现?

提前致谢

【问题讨论】:

    标签: python python-3.x algorithm list class


    【解决方案1】:

    方法一

    您可以使用itertools 模块中的一些方法为您的案例创建合适的生成器。让我们使用示例列表

    a = [1, 2, 3, 4]
    

    首先,我们要cycle 列表,以便它不断重复。这会给我们

    >>> b = itertools.cycle(a)    # generator object that gives [1, 2, 3, 4, 1, 2, ...]
    

    接下来,我们要向前跳过一定的量。这是您的first_player 变量,我们希望采用n 元素,其中n 是玩家数量。我们可以使用islice 方法完成此操作

    >>> itertools.islice(b, 2, 2 + 4)   # generator object that gives [3, 4, 1, 2]
    

    把这一切放在一起,你会得到

    import itertools as it
    
    def func_turn(start):
        for player in it.islice(it.cycle(player_list), start, start + len(player_list)):
            player.play_card()
    

    方法二

    您可以使用collections.deque 及其rotate 方法在每回合后更新玩家顺序

    from collections import deque
    
    player_list = deque([p1, p2, p3, p4])
    
    def func_turn():
        for player in player_list:
            player.play_card()
    
        player_list.rotate(-1)    # will be deque([p2, p3, p4, p1]) after 1 rotation
    

    【讨论】:

    • 或者一个简单的模数! player_order = [1, 2, 3, 4]; current_player = player_order[current_turn % len(player_order)]
    • 是的,但这仍然需要使用range(len(first_player))
    • 非常感谢,这正是我想要的。
    • 我曾经使用模数,但我想知道一些更通用的方法,因为将来我可能会通过玩家名称(str)或其他东西来做。
    猜你喜欢
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多