瘋狂的UNO

UNO是一種趣味性比較強的游戲, 它基于顏色和數(shù)字不斷輪流出牌, 并含有各種功能牌(大部分帶有懲罰性質), 最終出完或者剩余牌計分最低的贏得比賽.

惡魔牌

類型簡介

  • 普通牌有紅, 黃, 藍, 綠四種顏色, 每種顏色有

    • 0號牌1張;
    • 1-9號牌2張.

    共計76張.

  • 功能牌也有紅, 黃, 藍, 綠四種顏色, 每種顏色有:

    • 阻擋牌(skip)2張;
    • 反轉牌(reverse)2張;
    • 罰兩張(draw two)2張.

    共計24張.

  • 萬能牌可以變色, 但分兩種:

    • 變色牌(wild)4張;
    • 王牌(wild four)4張.

    共計8張.

數(shù)據(jù)表示

我們對于任意牌可用一對數(shù)據(jù)(也即pair類型)來表示:

  • 顏色: 可用枚舉類型red, yellow, blue, green, blank表示, 注意變色牌blank可適用于任意顏色.

  • 面值: 普通牌直接面值就是數(shù)字, 后續(xù)的數(shù)字:

    • 10表示阻擋牌;
    • 11表示反轉牌;
    • 12表示罰兩張;
    • 13表示變色牌;
    • 14表示王牌.

瘋狂游戲

考慮如下的自動游戲模擬, 初始有n位玩家, 每人從混洗之后的牌中分別取出7張牌, 并指定正向為初始游戲方向.

對于當前顏色為C面值為K情況, 下一可以出牌的玩家采用這樣的策略:

  • 如果當前有K面值(1-12均可)的牌, 按照該玩家取牌的先后次序出一張K面值的牌;
  • 如果當前沒有K面值的牌, 則從C顏色中按照該玩家取牌的先后次序出一張牌(出完功能牌才能出功能牌).
  • 如果顏色和面值都不符合則出萬能牌;
  • 無牌可出則從牌堆中取出牌.

如果牌堆無牌或一位玩家所有牌出完則結束. 每人手里剩下的牌進行記分, 普通牌按面值計分, 功能牌計20分, 萬能牌計50分.

洗牌與發(fā)牌

108張牌每次需要進行洗牌, 《面向算法設計的數(shù)據(jù)結構(C++語言版)》中給出了shuffle程序可對此進行隨機洗牌. 這些牌可以存于一個長為108的數(shù)組Cards里.

發(fā)牌其實是用棧來實現(xiàn)的, 這里可以用數(shù)組Cards的當前下標作為棧頂.

隊列

每位玩家對各個面值維護一個隊列, 不過牌還得按照顏色另外存儲一個隊列. 由于兩個隊列的數(shù)據(jù)不能同步, 我們可以為每張牌加入標記來表示該牌是否已經打出(于是需要修改牌的數(shù)據(jù)表示讓它能包含這個新的數(shù)據(jù)域), 如果在隊列中取到一張已經打出的牌則丟棄后繼續(xù)從隊列取新元素. 而這個只用常數(shù)時間, 并不影響整體的模擬程序性能. 另外, 洗牌之后必須將這些標記重置.

實際上這里的面值隊列是隊列數(shù)組QK, 前面面值為數(shù)字的設計可以更為方便快速得到面值為i的隊列QK[i]之中的數(shù)據(jù).

計數(shù)和計分

每個人維護一個計數(shù)器, 記錄手里的牌數(shù). 如果計數(shù)器為0則游戲結束. 注意這個計數(shù)器要和前面牌的標記關聯(lián)起來, 只有真正打出牌的時候才能減1.

計分的時候普通牌可以直接記分, 其他牌略作判斷即可. 注意這里不需要另起一個計分映射數(shù)組, 因為計分策略相對來說比較簡單, 只有三種分數(shù)策略而已.

不過, 計分方法會影響出牌策略. 顯然, 我們要盡可能出掉面值較高的普通牌. 另外, 我們可以根據(jù)當前情況出一張對方難以接招的牌. 當然, 這些策略都可以作為提高性問題來思考.

游戲方向

玩家的編號從0到n - 1, 正向是加1反向是減1, 我們可以不去取模, 改用判斷會更快一點. 例如在加1時可以先加1如果編號變成n則令其為0即可.

Just Play!

基本思路已經設計完畢, 那就編寫程序實現(xiàn)吧!

馬里奧版本
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洼畅,隨后出現(xiàn)的幾起案子兰粉,更是在濱河造成了極大的恐慌,老刑警劉巖豫缨,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異端朵,居然都是意外死亡好芭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門冲呢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舍败,“玉大人,你說我怎么就攤上這事敬拓×谑恚” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵乘凸,是天一觀的道長弛说。 經常有香客問我,道長翰意,這世上最難降的妖魔是什么木人? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮冀偶,結果婚禮上醒第,老公的妹妹穿的比我還像新娘。我一直安慰自己进鸠,他們只是感情好稠曼,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著客年,像睡著了一般霞幅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上量瓜,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天司恳,我揣著相機與錄音,去河邊找鬼绍傲。 笑死扔傅,一個胖子當著我的面吹牛耍共,可吹牛的內容都是我干的。 我是一名探鬼主播猎塞,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼试读,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荠耽?” 一聲冷哼從身側響起钩骇,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铝量,沒想到半個月后倘屹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡款违,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年唐瀑,在試婚紗的時候發(fā)現(xiàn)自己被綠了群凶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片插爹。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖请梢,靈堂內的尸體忽然破棺而出赠尾,到底是詐尸還是另有隱情,我是刑警寧澤毅弧,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布气嫁,位于F島的核電站,受9級特大地震影響够坐,放射性物質發(fā)生泄漏寸宵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一元咙、第九天 我趴在偏房一處隱蔽的房頂上張望梯影。 院中可真熱鬧,春花似錦庶香、人聲如沸甲棍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽感猛。三九已至,卻和暖如春奢赂,著一層夾襖步出監(jiān)牢的瞬間陪白,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工膳灶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拷泽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像司致,于是被迫代替她去往敵國和親拆吆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容