#card-game #war #card #game #deck

app war_card_game

战争(纸牌游戏)模拟

5个不稳定版本

0.3.1 2023年9月5日
0.3.0 2023年9月3日
0.2.4 2023年6月18日
0.1.0 2023年5月28日

#1 in #war

MIT 许可证

42KB
965

战争(纸牌游戏)

战争(纸牌游戏)模拟应用程序。应用程序模拟了战争纸牌游戏,通常由两名玩家使用标准的54张牌进行。

游戏的目标是赢得牌堆中的所有牌。

以下是玩战争纸牌游戏的规则

  1. 设置:牌堆被平均分给两名玩家,每人获得26张牌。保持你的牌面朝下,不要看它们。

  2. 游戏玩法:两名玩家同时从各自的牌堆中翻出顶牌,并将它们面朝上放在桌上。牌面更高的玩家赢得该回合,并收集两张牌,将它们面朝下放在自己的牌堆底部。从高到低的牌序如下:A(王牌)、K(国王)、Q(王后)、J(杰克)、10、9、8、7、6、5、4、3、2。

  3. 战争:如果两张翻出的牌面值相同,则结果是"战争"。在这种情况下,两名玩家额外放置牌面朝下的牌,然后从各自的牌堆中再翻出一张牌。牌面更高的玩家赢得桌上所有牌。如果还有平局,则重复此过程,直到一名玩家拥有更高牌面的牌。

  4. 牌面价值:需要注意的是,在战争游戏中,花色(红心、方块、黑桃、梅花)不影响牌的排名或游戏结果。只考虑牌的价值。

  5. 获胜:游戏继续进行,直到一名玩家收集了所有牌,从而成为赢家。如果在战争中某名玩家用完了牌,则该玩家输掉游戏。

战争是一种简单、基于运气的纸牌游戏,通常由儿童或作为休闲活动玩。游戏不需要技巧或策略,因为每轮的结果完全由牌的排名决定。

用法

这是一个命令行应用程序,模拟整个游戏。用户可以选择牌堆洗牌的种子和输出模式。

牌堆是标准的54张法国花色牌,包含四个花色(♣、♦、♥、♠)中的13个等级。牌堆的初始顺序(洗牌之前)如下

🃒 🃂 🂲 🂢 🃓 🃃 🂳 🂣 🃔 🃄 🂴 🂤 🃕 🃅 🂵 🂥 🃖 🃆 🂶 🂦 🃗 🃇 🂷 🂧 🃘 🃈 🂸 🂨 🃙 🃉 🂹 🂩 🃚 🃊 🂺 🂪 🃛 🃋 🂻 🂫 🃝 🃍 🂽 🂭 🃞 🃎 🂾 🂮 🃑 🃁 🂱 🂡

第一步,使用用户指定的或随机生成的种子对牌堆进行洗牌。

示例

$ war_card_game --seed 10
Starting game!
Deck: 🃒  🃂  🂲  🂢  🃓  🃃  🂳  🂣  🃔  🃄  🂴  🂤  🃕  🃅  🂵  🂥  🃖  🃆  🂶  🂦  🃗  🃇  🂷  🂧  🃘  🃈  🂸  🂨  🃙  🃉  🂹  🂩  🃚  🃊  🂺  🂪  🃛  🃋  🂻  🂫  🃝  🃍  🂽  🂭  🃞  🃎  🂾  🂮  🃑  🃁  🂱  🂡
Shuffling deck with seed 10
Deck: 🃎  🃖  🂺  🃘  🂥  🂭  🃙  🃁  🂱  🂲  🃝  🂸  🃑  🃂  🃓  🂶  🂾  🂤  🂡  🂵  🂫  🂮  🃅  🃊  🂽  🂣  🂦  🃉  🃚  🃋  🃞  🂻  🃔  🃒  🃕  🂷  🂢  🂩  🂨  🃈  🃍  🂴  🂧  🃇  🂪  🃃  🃛  🃆  🂹  🃄  🂳  🃗

Let's deal!
Starting setup:
P2: 🃗  🃄  🃆  🃃  🃇  🂴  🃈  🂩  🂷  🃒  🂻  🃋  🃉  🂣  🃊  🂮  🂵  🂤  🂶  🃂  🂸  🂲  🃁  🂭  🃘  🃖
P1: 🂳  🂹  🃛  🂪  🂧  🃍  🂨  🂢  🃕  🃔  🃞  🃚  🂦  🂽  🃅  🂫  🂡  🂾  🃓  🃑  🃝  🂱  🃙  🂥  🂺  🃎

Game over!
Player 1 won in round 146
Player 2 lost in 146
Longest war: 2

用户可以通过使用种子范围选项选择多个种子

-r, --range <RANGE>    Range (start-end) of seeds for deck shuffling

其中 RANGE 的形式为 start-end,且 start < end。对于种子范围,默认(也是唯一支持的)输出模式是 one-line 输出级别

Players: 2, seed: 0, winner: Player 2, winning round: 118
Players: 2, seed: 1, winner: Player 2, winning round: 176
Players: 2, seed: 2, winner: Player 2, winning round: 568
Players: 2, seed: 3, winner: Player 1, winning round: 654
Players: 2, seed: 4, winner: Player 2, winning round: 164
Players: 2, seed: 5, winner: Player 2, winning round: 126
Players: 2, seed: 6, winner: Player 2, winning round: 230
Players: 2, seed: 7, winner: Player 2, winning round: 116
Players: 2, seed: 8, winner: Player 1, winning round: 516
Players: 2, seed: 9, winner: Player 1, winning round: 380

用户可以通过使用输出选项

-o, --output <OUTPUT>  Output level [default: normal] [possible values: one-line, quiet, normal, verbose]

或“快捷”选项

  -v, --verbose          Verbose mode
  -q, --quiet            Quiet mode
  -1, --one-line         One line output mode
  • verbose 输出级别会打印整个模拟的所有细节

    war_card_game --seed 10 -v
    Starting game!
    Deck: 🃒  🃂  🂲  🂢  🃓  🃃  🂳  🂣  🃔  🃄  🂴  🂤  🃕  🃅  🂵  🂥  🃖  🃆  🂶  🂦  🃗  🃇  🂷  🂧  🃘  🃈  🂸  🂨  🃙  🃉  🂹  🂩  🃚  🃊  🂺  🂪  🃛  🃋  🂻  🂫  🃝  🃍  🂽  🂭  🃞  🃎  🂾  🂮  🃑  🃁  🂱  🂡
    Shuffling deck with seed 10
    Deck: 🃎  🃖  🂺  🃘  🂥  🂭  🃙  🃁  🂱  🂲  🃝  🂸  🃑  🃂  🃓  🂶  🂾  🂤  🂡  🂵  🂫  🂮  🃅  🃊  🂽  🂣  🂦  🃉  🃚  🃋  🃞  🂻  🃔  🃒  🃕  🂷  🂢  🂩  🂨  🃈  🃍  🂴  🂧  🃇  🂪  🃃  🃛  🃆  🂹  🃄  🂳  🃗
    
    Let's deal!
    Starting setup:
    P1: 🃗  🃄  🃆  🃃  🃇  🂴  🃈  🂩  🂷  🃒  🂻  🃋  🃉  🂣  🃊  🂮  🂵  🂤  🂶  🃂  🂸  🂲  🃁  🂭  🃘  🃖
    P2: 🂳  🂹  🃛  🂪  🂧  🃍  🂨  🂢  🃕  🃔  🃞  🃚  🂦  🂽  🃅  🂫  🂡  🂾  🃓  🃑  🃝  🂱  🃙  🂥  🂺  🃎
    
    Round 1
    P1: 🃗  🃄  🃆  🃃  🃇  🂴  🃈  🂩  🂷  🃒  🂻  🃋  🃉  🂣  🃊  🂮  🂵  🂤  🂶  🃂  🂸  🂲  🃁  🂭  🃘  🃖
    P2: 🂳  🂹  🃛  🂪  🂧  🃍  🂨  🂢  🃕  🃔  🃞  🃚  🂦  🂽  🃅  🂫  🂡  🂾  🃓  🃑  🃝  🂱  🃙  🂥  🂺  🃎
    P1 🃗  P2 🂳
    Round 1 winner is Player 1
    
    ...
    
    Round 146
    P1: 🃂
    P2: 🃖  🃞  🂭  🃝  🂲  🂶  🃄  🂻  🂸  🂺  🂴  🂧  🂳  🂽  🂥  🃘  🃃  🃁  🃊  🂡  🃈  🂩  🂨  🂾  🃚  🃗  🃔  🃑  🃍  🂦  🃆  🂱  🂵  🃛  🃒  🂮  🃋  🃎  🂹  🃕  🂤  🂫  🃙  🃅  🂢  🂪  🃉  🂷  🃓  🃇  🂣
    P2 🃖  P1 🃂
    Round 146 winner is Player 2
    
    Game over!
    Player 2 won in round 146
    Player 1 lost in 146
    Longest war: 2
    
  • normal 输出级别会打印洗牌种子、初始牌堆、洗牌后的牌堆、每位玩家的起始手牌以及游戏结果(包括最后一轮编号和“最长”的 战争,见示例)。

  • quiet 输出级别会打印洗牌种子、洗牌后的牌堆和游戏结果(包括最后一轮编号)

    $ war_card_game --seed 10 -q
    Shuffling deck with seed 10
    Deck: 🃎  🃖  🂺  🃘  🂥  🂭  🃙  🃁  🂱  🂲  🃝  🂸  🃑  🃂  🃓  🂶  🂾  🂤  🂡  🂵  🂫  🂮  🃅  🃊  🂽  🂣  🂦  🃉  🃚  🃋  🃞  🂻  🃔  🃒  🃕  🂷  🂢  🂩  🂨  🃈  🃍  🂴  🂧  🃇  🂪  🃃  🃛  🃆  🂹  🃄  🂳  🃗
    
    Player 2 won in round 146
    Player 1 lost in 146
    
  • one-line 输出级别会在单行中打印与 quiet 模式相同的所有信息(除了洗牌后的牌堆)

    $ war_card_game --seed 10 -1
    Players: 2, seed: 10, winner: Player 2, winning round: 146
    

故事

该项目是在寒假聚会之后创建的,当时我十几岁的儿子在与(也是十几岁的)朋友的儿子玩这个游戏。看他们玩很有趣。我中途加入,作为第三个玩家玩了几轮,但所有的牌都输了,他们继续玩了大约半小时左右。

我们开始想知道这样的游戏可能需要多长时间?

如果我们假设一局需要 ~2 秒,那么(不准备)的游戏可能从不到一分钟(种子 53822)到超过一小时(种子 6958)。


BartoszCiesla @ 2023

依赖关系

~1.9–2.5MB
~48K SLoC