真郁闷 面试的时候被21点游戏的题目给淘汰了
traso 2008-07-25 01:37:09 郁闷啊,概率真的有那么重要么?
初试,复试都通过了.3试没过.
我跟踪过随机函数,
发现里面不过是个加密算法,根据种子来制定的.
那么计算它的概率到底有多大意义.
真搞不清楚.
我当初认为做数值嘛,就是设计公式,把几个需要出现的时间段的数值用个公式链接起来就可以了.
当时被面试要求设计21点游戏,尽量多赢玩家.
游戏规则:
游戏开始先由系统指定庄家并开始发牌,闲家分别与庄家对抗。发牌后,闲家先要牌力争使自己接近21点且不“爆牌”,即“不超过21点”,闲家选择完毕后,轮到庄家按照规则要牌,庄家结束选择后按照双方的牌点是否接近21点判断输赢。
2-9:牌面数值与分值相同。
10、J、Q、K:均为10分值
A:可为1或者11分值,当计算11分值时会爆牌,则自动记为1分值。
庄家与玩家同点或同爆时庄家胜利.
21点VS爆点时 赔率加倍.
*****************************************************************************
游戏流程设定:
玩家胜利计数器playerwin=0;//判断是否使用作弊AI
电脑胜利计数器ownerwin=0;
牌组初始化:把52张扑克牌赋值到数组b[52]上.
计数器a=0;
AI计数器a4=16 a5=36; a5为牌卡大于4的牌卡数量、a4为牌卡小于5的牌卡数量.
0,初始化庄家数组owner[5],初始化玩家数组player[5].
1,给庄家1张牌(暗)发牌函数(*owner).if(b[a]>4)a5--;else a4--; //AI计数判断,每次发牌加入AI计数判断下同如2所示
计数器a++
2,给玩家1张牌.发牌函数(*player) if(b[a]>4)a5--;else a4--; //AI计数判断
计数器a++
3,玩家下注.(玩家输入交互)
4.给庄家1张牌 发牌函数(*owner) 计数器a++
5,给玩家1张牌 发牌函数(*player) 计数器a++
6,玩家决定:a:要牌(if(点数计算(*player)>21)玩家判负 goto 9;else 给玩家发牌 goto 6)计数器a++;b:gotu 7
//点数判断函数(*char) 略.
//发牌函数()略
7, 庄家决定:a:要牌(if(playerwin>ownerwin) 作弊AI();else 判断AI() ) //玩家赢的比我多我就赖皮 ^_ ^
(if(点数计算(*owner)>21)gotu 8;else 给玩家发牌 goto 7)计数器a++;b:goto 8
8,比较玩家与庄家的点数决定胜负.if((点数计算(*player)>点数计算(*owner))ownerwin++;
else playerwin++;
9,牌余判断 if(计数器a>=42) gotu 牌组初始化; else goto 0 //2人玩此游戏所以是a>=42;3人玩次游戏则是37
********************************************************************************
庄家AI:
bool 判断AI()//判断是否要牌
{
判断临界点a=17;
owner=点数计算(*owner);
player=点数计算(*(player+1))+10;//电脑AI算牌 玩家桌面点数计算
if(player[1]='a')player-10; // 当玩家第2张抽到A时的情况
if(owner>=player)) return 不要牌;
//牌面上点数绝对大于玩家时,不要牌.
if(a5/a4>1)判断临界点a--; //算牌AI修正临界点值
else if(a5/a4<1)判断临界点a++;
else;
if(owner>=判断临界点a)return 不要牌;
return 要牌;
}
bool 作弊AI() //判断是否要牌
{
owner=点数计算(*owner);
player=点数计算(*player);
if(owner>=player) return 不要牌;
发牌函数(*owner);a--;//假装发牌,之后C--计数器a还原
if(点数计算(*owner)>21) return 不要牌
return 要牌;
}
3试:
当时把这个给他们,结果他们问我为什么临界点时17点.要从数学的角度来分析.
为什么能保证17点的胜率高过玩家.
说实话我也想不通16点啊,暴率蛮高的按每抽过牌的时候也有8/13 (我靠 还刚刚好是黄金分割点).
当时是参考大航海时代2里面酒吧小游戏的21点设计的,几次测试发现是17点.
但是没有那个比较牌面值的AI. 我加上了比较.
后来分析出由于10点牌数最多,所以影响胜率最大的应该是第1张牌拿到10.