推 BiaoMIN:推 06/01 04:56
※ 引述《horngsh (foreman)》之銘言:
: 各位大大好:
: 不知有哪位高手曾寫過大老二撲克遊戲的程式呢? 可以用pseudo code,
: 或貼程式碼和大家分享呢? 其中的人工智慧部分, 應如何去找資料呢?
: 感恩不盡!
選單那邊應該不用說了,下面直接假設人機對戰部份@@a
也就是只有妳是玩(不仿假設你的index為 0),電腦操控其他三家的牌
void GameMain()//只考慮一回合情況
{
Deal(); //發牌副程式
index = WhoHaveClub3(); //檢查誰有梅花三,這裡一個小回圈加判斷式就好
do
{
if(index==0) AtPlayerRank(); //簡單判斷誰的回合
else AtComputerRank();
WhoWin = DetNumOfCard(); //簡單檢查剩餘卡片數,這裡也很容易
//如果沒人贏就回傳個 0~3以外數字,比方說5
(index++)%=4;
}while(WhoWin==5);
}
Deal():這邊應該不用說吧,只是一個資料處理問題:)
比方你用一個結構陣列表示每一張撲克牌
Ex.
struct sCard
{
char pattern; //花色
int point; //點數
int WhoHaveIt;//屬於誰
}card[52];
發牌只要隨機指定WhoHaveIt就好 當然要注意每個人分配數量要一樣
AtPlayerRank()
這部份比起人工智慧部分算是簡單啦@@a
首先你要先停止迴圈前進,因此這裡必須是Blocking的(你可以用一個do迴圈blocking)
等到玩家決定出哪張牌
接著你必須提供一個介面讓玩家選擇要出什麼牌、或是要Pass
他可能包含下面三個程序:
偵測玩家動作(鍵盤或滑鼠@@a 看你想怎麼設計介面)
↓
玩家是否決定出牌或喊Pass? 否回上一步,是的話往下一步前進
↓
偵測玩家出的牌型是否合法 否則回第一步,是的話結束本副函式
比較麻煩的應該再第三個程序@@a 檢查合法部份
你可以用下面資料型態儲存牌桌上的牌型:
struct sCardOnTheTable
{
Struct WhatCard[5]; //最多五張
int TypeOfCard; //我真的建議再出牌時候就檢查牌型啦@@
}*CardOnTheTable; //宣告為動態陣列,或是乾脆宣告為52維陣列XD
//當然你需要有個引數表示最上面的牌。
那這樣的話,只要偵測
1.玩家出的牌組是否為正確牌型
一張、一對、葫蘆、順子、鐵枝、同花順
(if...if...很多個if解決XD,在這裡同時要回傳牌型)
2.玩家出的牌是否大於牌桌上的牌組
這裡要作牌型大小判斷,很直觀想法可以把所有牌型總數定義在一個表裏面
比方說3鐵枝、7葫蘆、梅花尾牌K同花順(估計不會超過100種牌型啦XD)
然後要找出牌型,則去查表得一數字、要比較大小只要簡單檢查該數字就好
最後,如果是的話,就要更新牌桌上的牌組
順便讓CardOnTheTable陣列引數+1
最後,稍微說一下電腦人工智慧部份
其實光是大老二的話,似乎只要用蠻簡單的應對守則即可
比如說:1.盡可能出僅比抬桌上牌型多一點點的牌型
(比方說抬桌上是4,有5和J、則出5)
2.記住現階段最大牌型是什麼,比方說單張時候可能是2
或因為2被打光則最大牌型是A
當電腦審定自己身上有五張型、或很多對子
則電腦會在輪到自己回合打出大牌
否則即使可以出大牌來壓也會先保留(Pass)
以上兩個都是迴圈加決策就寫得出來
但已經足以寫出個肉腳大老二智慧了(更進階的當然還要擬定出牌次序的策略啦)
以上,希望能幫助你^^
--
— 遊戲設計團隊等待你的加入與支持:
/\●/\ )) http://220.132.66.21/phpbb2/portal.php
(( / /▲\ \ PTT GameDesign板 PTT2 DreamYeh板 歡迎你圓夢
\\ 巴哈姆特好像才是我大本營XD~讓我們一起Kuso吧
想了解更多DreamYeh嗎?歡迎來無名P_DreamYeh板
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.168.184.60