用C++计算金拉米纸牌得分?

金拉米纸牌游戏是一个比较经典的纸牌游戏。游戏结束时,每个玩家手上会有10张不同的扑克牌,若是有连续三张及以上的相同牌或者同花顺即不计分,其余计分;每张牌因面值分数不同,小于等于10时按照面值计算,大于10时按10计算(J、Q、K)。问题在于,一张牌可能同时会有相同牌和同花顺两种组合选择,此时没有哪种优先的说法,组合的方法也变得多样。所以,想问问有没有人愿意用C++算出十张纸牌的最低分数组合?

不知道你的规则,没有说的很详细。但是这类问题(排列组合)的主要思路是遍历所有可能的结果,并且找到你要的。
遍历的过程可以用递归(recurrent),首先选取10张不同的牌(比如从红桃A~黑桃5),然后每次从这个组合里替换一张牌为更大的牌,按照你的方法计算新的分数。具体规则没看懂。最后遍历到方片K,所有的牌的组合都有了,所有的分数按照你的规则也都算出来了,那么最小的就有了。

写小游戏有两部分清楚 1. 结构体 可以设置这些 花色,牌面大小,属性(即你说的得分J Q K积分10) 2.逻辑 你已经整理比较清楚
假设10张牌存在刚刚我说的结构体 A中 那么 记A[10],先分析两种情况下分数会比较低 ,先移除同花顺或者是相通牌面
1. 相同牌面 最简单用正则表达式 比较简单,然后剩余的牌面将属性值相加就是分数
2. 同花顺 这个有两种思路 a.先找出同花色再判断有没有顺子 b. 先找出顺子再判断有没有超过三个的同花色 ,再计算其余分数
有时间帮你写一下主要逻辑要弄清楚即可

感谢大家的回答,我都有仔细看过。这里附上完整游戏规则。
金拉米详细规则
http://www.jj.cn2011-09-26 11:11:04
牌库:一副牌,去掉大小王,共52张。

对战人数:2人对战。

游戏目标:双方轮流抓牌打牌,目标是将手中的牌尽可能地凑成搭子(3张及3张以上的相同数字的刻子,或者3张及3张以上的同花顺),使剩余未成搭子的散牌点数之和最小。

牌点数:A=1分,J、Q、K=10分,其他牌按牌面数字计分。

抓牌和打牌:游戏开始时,先给双方发牌,庄家10张,闲家10张。亮出一张牌庄家先选择要或不要,如果不要轮到闲家选择要或不要,谁要谁拿走然后选择出牌。如果都不要此后,双方轮流抓一张牌,再打一张牌。抓牌时,可以选择直接从牌堆抓一张牌,也可以选择拿走对手最后打出的一张牌,称为吃牌。双方打出的牌堆为一叠,除最上面一张(最后打出的一张)外,其他牌是不可见的。

组成搭子:至少三张牌面相同的牌或者至少三张相连的同花顺叫做“搭子”。手牌可能含有多个搭子。还未形成“搭子”废牌称作“死木”。玩家手牌中死木点数(废牌牌面)的和叫做死木点。A-10分别计为1-10点,JQK都计为10点。

游戏中有三种方法决出胜负,“金(Gin)”、“敲(Konck)”、“低分赢”。
1.金 手中所有牌都形成“搭子”而没有任何废牌,当你金时,获胜得到25加对手死木点。
2.敲和低分赢 死木总点值小于10时可以“敲”。对手也即刻摊牌。当你敲后,对手可以将他的任意数量的牌合理地加入你的“搭子”(但是不能加入你的死木形成新的搭子),这个行为叫做叫销牌。销牌时一般选择自己的死木,以降低自己的死木点数,但也有例外。在销牌后结算胜负:当你的死木点数小于对手,则你敲胜利,获得双方死木差的分数;一旦对手的死木等于或小于你,你即告负,对手获得“低分赢”,得到10+双方死木差的分数。
3. 流局 牌发完没有任何一个玩家金或者敲,双方分值都为0。

在游戏结束的时候,玩家会各自有10张不同的牌,这时需要计算每个玩家的“死木”点数。其实就是排列组合问题,不知道这类问题有没有一种通用的解决方式?题主后来使用的也是递归函数遍历,但是,太过复杂的情况就运行不出分数,我觉得可能是程序写得不够到位?总之,程序是完成啦,谢谢大家!