花色(4种)+牌面(1-13),我们暂定义为card。
52张花色和牌面都不重复的牌,可以定义一个card数组,长度为52。
同上,可以定义一个card数组,可以计算一下长度,按最小的12345,最多只有5张牌。
可以再定义一个card数组,长度也为5。 庄和闲还有自己的资金数量,各自有一个总数。
一次下注是一个数字,假定一盘的只能下注五次,一盘的下注应为一个数组。
游戏是一个过程,也就是一组状态,状态一般是用枚举标示。 同时还包括每个状态的数据,包括一套牌,一个庄家,一个闲家,当盘的下注。
首先<开始状态>,闲家下底注,然后发底牌,闲家2张明牌,庄家1明一暗。 注意这有一个blackjake的情况,需要修改数据结构。 其次<要牌状态>,闲家有很多操作,包括
- 拿牌,然后发一张牌,没有爆的话继续要牌状态。停牌,然后庄家要牌,比牌。
- 加倍,然后发一张牌,庄家要牌,比牌。
- 分牌,这个需要修改数据结构了。
- 投降,然后只输一半。
再次回到初始状态就可以了。 所以基本的两个状态就可以了。
用一个简单的AI,即持续拿牌直至点数不小于17。
因为闲家爆牌,庄家直接赢,比牌只看庄家是否爆牌。 庄家没爆牌,按五子>BJ>21点比较大小,之后按点数组合计算大小。 A分别按1和11算两次,取不超过21点,且较大的一次。
入场提示21点游戏,简单玩法提示。 提示用户资金,提示下注。 发牌后提示当前庄家的牌,闲家的牌,当前下注多少。提示当前可做的操作。
从核心模板, 事件状态机开始
while (event = userInput()) {
if (event->id == EV_BET) {
if (game->state == GAME_START) {
bet(game, event);
game->state = GMAE_ROLL;
}
else if (gameState->id == GAME_ROLL) {
}
}
if (event == xxx) {
}
}
这个不符合一般的状态事件的分支法,算是我的一个优化。