题意:
21点游戏规则:http://baike.baidu.com/view/302185.htm
题目设定一玩家与一庄家对战,牌面有2-9、T、J、Q、K、A,T、J、Q、K是10,A是11或1,当爆牌(两手牌之和大于21)时,A变为1。
要求:输入卡片套数(DECK,每套牌52张),输入庄家翻过来的一张卡牌的点数和玩家手持两张卡牌的点数,
输出玩家的胜率。
重点:注意庄家那张明牌点数为11时的情况。
代码:
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int deck;
while(cin>>deck,deck)
{
double total=52*deck-3,sum;
int n0,dl,pl1,pl2,player;
char a,b,c;
cin>>a>>b>>c;
if(a>49&&a<58)dl=a-48;
else if(a=='A')dl=11;
else dl=10;
if(b>49&&b<58)pl1=b-48;
else if(b=='A')pl1=11;
else pl1=10;
if(c>49&&c<58)pl2=c-48;
else if(c=='A')pl2=11;
else pl2=10;
player=pl1+pl2==22?12:pl1+pl2;
if(dl!=11)
if(dl>=player-2){cout<<"0.000%"<<endl<<endl;continue;}
if(player-dl>11){cout<<"100.000%"<<endl<<endl;continue;}
n0=player-dl-2,sum=0;
if(dl==11)
//庄家的明牌点数为11
{
if(dl>=player-1){cout<<"0.000%"<<endl<<endl;continue;}
if(pl1==11)sum+=4*deck-2;
else if(pl2==11)sum+=4*deck-2;
else sum+=4*deck-1;
}
for(int i=0,j=2;i<n0;i++,j++)
{
if(j==dl)
{
if(j==10)
sum+=16*deck-1;
else sum+=4*deck-1;
if(j==pl1)sum-=1;
if(j==pl2)sum-=1;
continue;
}
if(j==pl1)
{
if(j==10)
sum+=16*deck-1;
else sum+=4*deck-1;
if(j==pl2)sum-=1;
continue;
}
if(j==pl2)
{
if(j==10)
sum+=16*deck-1;
else sum+=4*deck-1;
continue;
}
if(j==10)
sum+=16*deck;
else sum+=4*deck;
}
cout<<fixed<<setprecision(3)<<sum/total*100<<"%"<<endl<<endl;
}
return 0;
}
#include<iomanip>
using
int
{
}
本文介绍了一个基于C++实现的21点游戏玩家胜率计算程序。该程序能够根据玩家手上的牌和庄家的一张明牌来计算玩家获胜的概率。特别考虑了A牌作为1或11点数时的复杂情况。
893

被折叠的 条评论
为什么被折叠?



