• 文章
  • 動畫紙牌遊戲(拉米牌),使用者對戰電腦
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]