• 文章
  • 动画纸牌游戏(拉米牌),用户对战电脑
2012年12月11日 (最后更新: 2012年12月11日)

动画纸牌游戏(拉米牌),用户对战电脑

评分:4.0/5 (57 票)
*****
这是另一个游戏,源于我开发用于

游戏或作为 GUI 元素的拖放对象的努力。第一个是跳棋。请在此处的源代码中查看该文章。

我将首先提供游戏玩法的描述。
接下来将描述我实现计算机玩法的方式。

游戏开始时,会以动画方式将牌发到双方手中。电脑的手牌是可见的,以便进行有效的程序测试。如果您正在玩,请尽量克制住偷看对手手牌的冲动!

用户总是通过从弃牌堆或抽牌堆中抽牌来开始游戏。
只需点击牌堆。将发出一张牌(动画)。

接下来,如果用户可以,则出牌,然后将一张牌丢弃到弃牌堆中。
要玩的/丢弃的牌通过点击牌来选择。每张选定的牌的左边缘会出现蓝色条纹。要取消选择牌,只需再次点击它(选择切换)。

在选择牌后要出牌,只需点击一个空白区域,牌就会放在那里。小心放置它们的位置。它们最终可能会挡住长长的弃牌堆或您自己的手牌(如果它变长)。所有“堆”(即抽牌堆、弃牌堆和双方的手牌)都以“扇形”显示,因此一个大堆会占用大量空间。

要丢弃牌,请在您的手牌中选择一张牌,然后点击弃牌堆。如果您选择了多张牌,将会出现警报。

要从弃牌堆中抽取多张牌,请点击您想要拿取的牌堆中最深的牌。注意:这里有一个缺点。如果玩家从弃牌堆中抽牌,他必须出牌,并且该牌必须使用抽出的最底部的牌。程序不会检查这一点。

一旦您通过丢弃牌(总是需要的)结束了您的回合,电脑将自动轮到它。内置了一些动画暂停,以便有时间看到

电脑抽牌,然后选择牌,然后出牌,最后丢弃牌。

游戏过程中的屏幕截图:
当玩家丢弃最后一张牌时,每手牌结束。显示该手牌的统计数据

用户点击牌堆开始下一手牌。上一手牌结束的玩家开始下一手牌。

游戏进行到 500 分。所有计分都自动完成。

*** 这里涉及的一些 AI 的描述 ***

电脑(又名 C)首先检查弃牌堆,看是否可以使用其中的牌进行任何出牌。
缺陷:C 将抽牌一直抽到最底部的牌来进行任何出牌。这是一个糟糕的策略。

如果 C 发现无法从弃牌堆中的牌中出牌,它将抽牌。
然后,C 会进行它可以进行的任何和所有出牌。
C 在丢弃牌方面确实使用了一些判断力。根据是否存在相同面值的另一张牌(保存对子)或花色(潜在的 3 张相同牌),以及

丢弃一张牌是否会在弃牌堆中出牌,来为牌分配点数值。C 保留此类型得分最高的手牌。

使用了几个函数来支持计算机的出牌。这些是

主函数
bool c_findPlay( const discardStack* p_ds = NULL );

调用这些函数
int c_scorePlay( vector<sf_pair>& handVec );
bool c_find_3kind( vector<sf_pair>& handVec );
bool c_find_3straight( vector<sf_pair>& handVec );
bool c_find_addToExist( vector<sf_pair>& handVec );

bool c_makePlay(void);// 返回值分配给 c_start
bool c_drawCards(void);// 返回值分配给 c_start
bool c_discard(void);// 返回值分配给 c_start

最后,提供一个包含所有源文件、图像和可执行文件的 zip 文件的链接。
不幸的是,zip 文件无法上传,因为它包含所需的 dll(太大)。
读者将不得不从 sfml.org 下载这些 dll 文件(这些文件适用于 v 1.6)
libgcc_s_dw2-1.dll
libstdc++-6.dll
sfml-system.dll
sfml-graphics.dll
sfml-window.dll

附件:[cards.zip]