POJ 2005

来源:互联网 发布:pkpm钢结构计算软件 编辑:程序博客网 时间:2024/06/05 19:13
题意:
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;
}
原创粉丝点击