正文

跟电脑比智慧--十点半游戏2005-04-10 13:12:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/goal00001111/507.html

分享到:


/*一副扑克(除去王)玩者先取一张牌,电脑跟着取一张牌。之后玩者根据自己的牌总的点数
选择继续要牌或比较大小。j q k算0。5点。 如果牌总的点数都大于10。5 或都小于10。5,大者赢;
如果一个大于10。5而另一个小于10。5,小于10。5者胜。*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct book{
   int color;
   char number;
   float num;
} Card[52];/*用来存储牌的花色,数字及所代表的点数*/

void Build_Show(int HuaSe[], float DianShu[], char ShuZi[]);/*建立一副新牌,并显示给游戏者检查*/
void Wash_Card(void);/*洗牌*/
void Get_Card(void) ;/*按顺序发牌并公布结果*/

int main(void)
{
   int  flag;
   int HuaSe[4]={3,4,5,6};/*存储花色*/
   char ShuZi[13]={'A','K','Q','J','0','9','8','7','6','5','4','3','2'};/*存储数字*/
   float DianShu[13]={1,0.5,0.5,0.5,10,9,8,7,6,5,4,3,2};/*存储点数*/
   
   Build_Show(HuaSe, DianShu, ShuZi);/*建立一副新牌,并显示给游戏者检查*/
   do{
      Wash_Card();/*洗牌*/
      Get_Card();/*发牌并公布结果*/
      do{
         puts("\n你还要玩吗?输入1表示要,输入0表示不要:");
          fflush(stdin);
          scanf("%d", &flag);
      }  while(flag != 1 && flag != 0);
   } while(flag == 1);   
   system("pause");
   return 0;
}  

void Build_Show(int HuaSe[], float DianShu[], char ShuZi[])
{
   int i, j;
   for(i=0; i<4; i++)/*建立一副新牌*/
       for(j=0; j<13; j++)
       {
          Card[j+13*i].color = HuaSe[i];
          Card[j+13*i].number = ShuZi[j];
          Card[j+13*i].num = DianShu[j];
       }
    puts("这是一付新牌:"); /*显示整副牌给游戏者检查*/
       for(i=0,j=0; i<52; i++,j++)
    {
      if(!(j%13))
          printf("\n");
         printf("  %c%c", Card[i].color , Card[i].number);
    }
}

void Wash_Card(void)
{
    int i, j, hua;
    char dian;
    float shu;
    
   srand( (unsigned) time(NULL));
   for(i=0; i<52; i++)
   {
      j=rand()%(52-i);/*随机换牌,把牌的顺序打乱*/
      hua=Card[j].color;
      Card[j].color=Card[51-i].color;
      Card[51-i].color=hua;
      
      dian=Card[j].number;
      Card[j].number=Card[51-i].number;
      Card[51-i].number=dian;
      
      shu=Card[j].num;
      Card[j].num=Card[51-i].num;
      Card[51-i].num=shu;
   }   
}  

void Get_Card(void) /*按顺序发牌并公布结果*/
{
   int i=0, j=0, k=0, flag=1;
   float sum_m=0, sum_c=0;
   struct book Man[52], Computer[52];
   
   while(flag && i < 52)
   {
      Man[j++]=Card[i++];/*人先拿牌*/
      sum_m += Man[j-1].num;/*累计人拿到的总点数*/
      if(i < 52 && (sum_m <= 10.5 && sum_c <= sum_m && (sum_c + Card[i].num) <= 10.5
          || sum_m > 10.5 && sum_c > 10.5 && sum_c <= sum_m ))/*让电脑尽可能赢*/
      {
         Computer[k++]=Card[i++];/*电脑拿牌*/
         sum_c += Computer[k-1].num;/*累计电脑拿到的总点数*/
      }   
      printf("\n");
      puts("你现在拿到的牌为:");
      for(int i=0; i<j; i++)
          printf("  %c%c", Man[i].color , Man[i].number);
         printf("\n你现在拿到的总点数为:%f\n", sum_m);
         do{
          puts("你还要牌吗?输入1表示要,输入0表示不要:");
          fflush(stdin);
          scanf("%d", &flag);
      }  while(flag != 1 && flag != 0);
      if(i == 52)
      {
            puts("牌已经拿光了!");  
         system("pause");
      }       
   }   /*人不要牌后,电脑根据需要可以再拿一张牌*/
   if((sum_m <= 10.5 && sum_c <= sum_m && (sum_c+Card[i].num) <= 10.5
          || sum_m > 10.5 && sum_c > 10.5 && sum_c <= sum_m ) && i < 52)
   {
      Computer[k++]=Card[i++];
      sum_c += Computer[k-1].num;
   }
   puts("好,现在公布结果:");
   puts("你现在拿到的牌为:");
   for(int i=0; i<j; i++)
          printf("  %c%c", Man[i].color , Man[i].number);
      printf("\n你现在拿到的总点数为:%f\n", sum_m);
      puts("电脑现在拿到的牌为:");
   for(int i=0; i<k; i++)
          printf("  %c%c", Computer[i].color , Computer[i].number);
      printf("\n电脑现在拿到的总点数为:%f\n", sum_c);
      if((sum_m > 10.5 && sum_c > 10.5)||(sum_m <= 10.5 && sum_c <= 10.5))
         if(sum_m > sum_c)
             puts("你竟然赢了电脑!真是不可思议!");
      else if(sum_m == sum_c)
          puts("和电脑打成了平手,你的确实不错");
         else
          puts("你输给了电脑!看来需要多加练习!");
      else if(sum_m <= 10.5 && sum_c > 10.5)
          puts("你竟然赢了电脑!真是不可思议!");
   else
       puts("你输给了电脑!看来需要多加练习!");
}       

阅读(3873) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册