#card-game #card #heart #console #game-console #mshearts #front-end

bin+lib heartless

受 mshearts 启发的纸牌游戏

1 个不稳定版本

0.1.0 2024 年 2 月 4 日

#220游戏


用于 heartless_tk

MIT/Apache

95KB
2K SLoC

Rust 1.5K SLoC Python 255 SLoC // 0.0% comments

Heartless,一个受 mshearts 启发的纸牌游戏。

它在控制台中运行。要在图形模式下运行,您可以使用 GUI 前端

规则

成为游戏结束时得分最低的玩家。当一名玩家的得分达到或超过 100 分时,游戏结束;得分最低的玩家获胜。

每局游戏结束时,玩家计算他们所获得的红桃数量以及(如果适用)黑桃 Q。红桃每张计一分,黑桃 Q 计 13 分。

当一名玩家在一手中获得所有 13 张红桃和黑桃 Q 时,该玩家不会失去 26 分,而是得零分,而他的每位对手将额外获得 26 分。

传递后持有黑桃 2 的玩家发第一张牌。如果可能,每位玩家必须跟牌。如果一名玩家没有跟花色,可以打出其他花色的牌。然而,如果一名玩家在第一轮跟牌时没有黑桃,不能打出红桃或黑桃 Q。花色中最高牌赢得一局,赢得该局的玩家发下一张牌。直到有红桃被打出之前,不能打出红桃。

传递阶段

在弃牌之前,玩家必须将 3 张牌传递给另一名玩家。

  • 在第一手中,每位玩家将牌传递给左边的对手。
  • 在第二手中,每位玩家将牌传递给右边的对手。
  • 在第三手中,每位玩家将牌传递给对面的对手。
  • 在第四手中,玩家不传递牌。

以此类推。

卡片表示

一张卡片的形式为“等级+花色”,例如“2♣”。

手中的牌按 2~A 排序,首先是黑桃,然后是红心,最后是梅花。相同花色的牌将放在一起,以花色结尾,例如“467QA♣”表示“4♣ 6♣ 7♣ Q♣ A♣”。

可以在任何地方插入任意数量的空白,并完全忽略。

如果您想查看所有文本的ASCII表示,可以使用“--ascii-suit”命令行参数,花色的首字母小写c、d、s、h将显示为花色。例如,“467QA♣”将显示为“467QAc”,即“4c 6c 7c Qc Ac”。

用户输入

当您想要选择要传递或弃置的牌时,只需输入牌的表示,然后按“Enter”提交。使用c、d、s、h来编码花色。

在Heartless中的用户输入设计得非常友好。它不区分大小写,以下情况下可以省略花色

  1. 当跟随已经由早期手牌指定的花色时。

  2. 第一轮的花色总是黑桃。

  3. 当不跟随花色,但手中的牌只有一张指定花色的牌时。

要退出游戏,只需输入“exit”。

可定制AI策略

有时用户可能会觉得内置的AI策略太简单,并且对月亮击打的处理过于简单。如果您有更好的想法,只需将其实现为您的首选语言。“scripts/”文件夹提供了一个名为“replica.py”的Python脚本示例,这是内置的AI副本。

提供“--all”、“--others”、“--me”、“--left”、“--opposite”、“--right”命令行参数后,Heartless程序将反复调用您的脚本,在传递阶段和每一轮。

  • --who

脚本的执行者。如果您的脚本由“--left your.script”调用,“who”将是1。对于“--me”为0,“--opposite”为2,“--right”为3。“--all”将运行脚本4次,使用不同的“who”为0、1、2、3,而“--others”使用1、2、3。

  • --hand

谁手中的牌。它是一个带有小写花色且不带任何空格的牌表示。

  • --discarded

到目前为止弃置的所有牌。它是一个带有小写花色且不带任何空格的牌表示。

  • --suit_to_follow

当前轮次要跟随的花色。

  • --round

现在是第几轮,0为传递阶段,1~13为弃置阶段。

  • --under_the_gun

本轮第一个弃牌的人。

  • --round_winner

本轮最高牌的人。

  • --high_card

本轮最高牌是哪张。

  • --my_discarding

玩家ME弃置的牌,带有小写花色。

  • --my_hand_score

玩家ME得了多少分(共26分)。

  • --my_game_score

玩家ME得了多少分(最多99分)。

  • --my_suit_chars

玩家ME可能拥有的花色,例如“cdh”表示ME没有黑桃,可能有黑桃、红心、方块和梅花。

  • --left_discarding

左玩家弃置的牌,带有小写花色。

  • --left_hand_score

左玩家得了多少分(共26分)。

  • --left_game_score

左玩家得了多少分(最多99分)。

  • --left_suit_chars

左玩家可能拥有的花色,例如“cdh”表示ME没有黑桃,可能有黑桃、红心、方块和梅花。

  • --opposite_discarding

对方玩家弃置的牌,带有小写花色。

  • --opposite_hand_score

对方玩家得了多少分(共26分)。

  • --opposite_game_score

对方玩家得了多少分(最多99分)。

  • --opposite_suit_chars

对方玩家可能拥有的花色,例如“cdh”表示ME没有黑桃,可能有黑桃、红心、方块和梅花。

  • --right_discarding

右玩家弃置的牌,带有小写花色。

  • --right_hand_score

右玩家得了多少分(共26分)。

  • --right_game_score

右玩家得了多少分(最多99分)。

  • --right_suit_chars

右玩家可能拥有的花色,例如“cdh”表示ME没有黑桃,可能有黑桃、红心、方块和梅花。

在Rust中编写可定制的AI策略

图书馆用户可以通过提供用Rust编写的函数来自定义策略。

use heartless::*;
fn your_ai( game: &Game, who: usize ) -> Cards { todo!() }

let mut game = Game::default();
game.strategies.set_for_others( your_ai );
game.main_loop();

自动模式

给定“--automatic”,游戏将以自动模式运行,用户根本无法与游戏互动。您可以通过启用此模式来测试您的AI。使用“--count 100”可以运行100次,看看您的AI赢了多少次。

许可证

根据Apache License 2.0或MIT许可证,由您选择。

依赖关系

约1.2-1.9MB
约36K SLoC