Skip to content

Instantly share code, notes, and snippets.

@hl4
Last active February 4, 2018 08:03
Show Gist options
  • Save hl4/5b6c066caf827bd998886e019fc70f51 to your computer and use it in GitHub Desktop.
Save hl4/5b6c066caf827bd998886e019fc70f51 to your computer and use it in GitHub Desktop.
21点游戏设计

写程序之前,先考虑数据结构:

怎么表示一张牌?

花色(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) {
  }
}

这个不符合一般的状态事件的分支法,算是我的一个优化。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment