POJ 2005 Blackjack(水题,考验耐心。极易出错)

题意:21点游戏,玩家和庄家各从牌堆中抽两张牌。分别有A,2,3,4,5,6,7,8,9,T,J,Q,K这几种牌。T,J,Q,K对应的数值都是10,A对应的数值可能是11或者1,但是只有当两张牌同时为A的情况下,其中的一个才能为1.

输入,牌堆个数deck,然后依次输入三个数,分别为庄家明牌,玩家的两张牌。玩家根据庄家的明牌计算自己胜利的概率。

 

分析:一定要特别注意两张牌都为A的情况,和为12.要注意一下。

用一个长度大于或等于14的数组,存储一下,每张牌对应出现的情况,方便之后在计算总数时减去。

 

贴一下代码:(240k,47ms)

 

C++语言:
#include<iostream>
using  namespace  std;
int  score( char  ch)       //将输入的字符转换成整型
{
    if( ch == 'A')
        return  11;
    else if( ch == 'T' || ch == 'J'|| ch == 'Q'|| ch == 'K')
        return  10;
    else
        return  ch - '0';
}

int main()
{
    int deck , i;
    char card [ 3 ];   //存储输入数据
    int a [ 3 ];
    int sum , player , dealer;
      //sum为玩家能赢的所有情况,player为玩家手牌的点数
      while( cin >> deck , deck)
    {
        int  count [ 14 ] = { 0 };     //用于存储对应位置的牌出现的次数
        memset( a , 0 , 3);
        double  left = deck * 52 - 3;
        sum  player = dealer = 0;        
        for( i = 0 ; i 3;i ++)
      {
         cin>>card[i];
         a[i]=score(card[i]);
         count[a[i]]++;
      }
      player a[1]+a[2];
      if(player == 22 )       //当玩家的两个牌都是A的时候,相加是等于11+1的。
         player=12;
      dealer=a[0];
      for(i=2 ;i<= 11 ;i  ++)
      {
         if( ( (dealer+i==22)? 12: dealer+i<player)  
             //判断dealer +i的值是否等于22,如果是相当于就是两个A,所以取值为12.如果庄家手牌和小于玩家,玩家赢
         {
             if(i==10)sum+=deck*4*4 - count[i];    //四个10。
             else sum +=deck*4-count[i];   //如果出现过,就要减去
         }
      }
      printf("%0.3f%%\n\n",(double)sum*100/left);
   }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值