POJ 2005

本文介绍了一个基于C++实现的21点游戏玩家胜率计算程序。该程序能够根据玩家手上的牌和庄家的一张明牌来计算玩家获胜的概率。特别考虑了A牌作为1或11点数时的复杂情况。
题意:
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值