這是另一個遊戲,源於我開發用於
遊戲或作為 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]