Skip to content

Stage 0.2 Raise exceptions for bad arguments

neuront edited this page Dec 19, 2011 · 1 revision

Code review: https://github.com/neuront/sgs/commit/9a5bd37a4922cdd669d8e0241783aca9e3a31adc

主要设计修正

错误检测与处理

此阶段的主要工作是修正动作帧在 react 函数错误处理方面的设计. 由之前遇到错误返回错误信息, 改为抛出异常, 异常将在 core.src.GameControl.player_act 中捕获异常, 并转换为错误信息返回.

卡牌状态

此阶段, 每张卡牌有状态, 可以是常规 NORMAL 或正在使用 IN_USE.

当卡牌处于正在使用状态时, 该卡牌仍属于持有该卡牌的玩家, 但并不计入手牌中. (例: 火攻的目标至少需要持有一张手牌, 但如果目标为自己, 那么除了正要使用的火攻牌之外, 自己必须还持有至少另一张卡牌)

锦囊代码转移

火攻, 以及新增的锦囊实现过河拆桥和决斗从 ext/src/player_using_cards.py 移入了 ext/src/sleevecards/* 每个锦囊会有单独一个文件实现.

实现的锦囊

过河拆桥

代码实现在 ext/src/sleevecards/sabotage.py 中.

在 ext/test/test_sabotage.py 中的测试代码可以看到如下面对 GameControl 的调用, 作为过河拆桥过程的参考.

使用过河拆桥的玩家, 在出牌阶段可以通过类似下面的调用来指定目标, 并使用过河拆桥 (gcGameControl 对象)

gc.player_act({
                 'token': players[0].token,
                 'action': 'sabotage',
                 'targets': [players[1].player_id],
                 'cards': [0],
             })

接下来, 仍由出牌玩家来指定弃掉哪个区域的牌. 目前的区域只有手牌区域 ('cards')

gc.player_act({
                 'token': players[0].token,
                 'sabotage': 'cards',
             })

这时, 将随机弃掉目标玩家一张手牌. (在测试代码中, 随机的实现为取第一张手牌)

决斗

代码实现在 ext/src/sleevecards/duel.py 中.

在 ext/test/test_duel.py 中的测试代码可以看到如下面对 GameControl 的调用, 作为决斗过程的参考.

使用决斗的玩家, 在出牌阶段可以通过类似下面的调用来指定目标, 并使用决斗 (gcGameControl 对象)

gc.player_act({
                 'token': players[0].token,
                 'action': 'duel',
                 'targets': [players[1].player_id],
                 'cards': [0],
             })

接下来, 由目标玩家开始, 双方轮流打出杀.

gc.player_act({
    'token': players[0].token,
    'action': 'sabotage',
    'targets': [players[1].player_id],
    'cards': [0],
})

gc.player_act({
    'token': players[1].token,
    'play': [7],
})

gc.player_act({
    'token': players[0].token,
    'play': [2],
})

如此往复, 知道有一方不打出杀为止.

gc.player_act({
    'token': players[1].token,
    'play': [],
})

这时该玩家将受到一点伤害.

Clone this wiki locally