鱼C论坛

 找回密码
 立即注册
查看: 740|回复: 3

[已解决]洗牌程序,打印纸牌名字永远只有第一个花色‘方’,什么情况

[复制链接]
发表于 2020-11-26 18:35:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. //**************************************************************************
  6. //实现一个洗牌程序。所谓洗牌程序,就是将所有的扑克牌放入一个数组中,
  7. //要求把数组内的扑克牌顺序随机打乱,然后输出
  8. //每个人获得14张牌 ,我分牌的思路是牌在数组里面随机生成0~54的不重复的54个数,规定自然数0~12为 {"方","梅","红","黑","大王","小王"}里面的方,
  9. //13-26w为梅有,依次类推,最后剩余的52,53两个数分别对应大小王,对i循环从1-14,依次对应纸牌里面的1-13,然后成对输出
  10. int number_of_game = 3;
  11. int card = 13;
  12. //int print_card(int i,char name);
  13. //int distribution(int array,int member);
  14. //char **get_name(int num);
  15. //***********************生成54个0~54的整数,乱序***********************************
  16. //确保新生成的数组里面没有
  17. //返回1表示这个数在数组里面已经存在了
  18. int compare(int array[],int number,int length)
  19. {
  20.         int i;
  21.         int sign = 0;
  22. //        length = sizeof(array) / sizeof(array[0]);   array是数组形式,但实际上是一个指针,这样无法计算数组的长度
  23.         for(int i =0;i<length;i++)
  24.     {
  25.             if (array[i] == number)
  26.             {
  27.                     sign = 1;  
  28.                     break;
  29.                 }
  30.     }
  31.     return sign;
  32. }


  33. int *get_54_number_no_repeat(int num)
  34. {
  35.         int *total_card;         
  36.         int i,number,label;                        
  37.     total_card = (int *) malloc(sizeof(int) * num);        
  38.         for(int i =0;i<num;i++)
  39.     {
  40.             number = rand() % 54;
  41.             if (i == 0)
  42.             {
  43.                     total_card[i] = number;
  44.                 }
  45.         else
  46.         {
  47.                 label = compare(total_card,number,i);
  48. //                printf("label = %d\n",label) ;
  49.                 if (label == 0)
  50.                 {
  51.                         //printf("label = 0,未出现重复,程序继续") ;
  52.                         total_card[i] = number;
  53.                         }
  54.                         else
  55.                         {
  56.                                 //printf("label = 1,出现重复,重新获取随机数") ;
  57.                                 do
  58.                                 {
  59.                                         number = rand() % 54;
  60.                                         label = compare(total_card,number,i);
  61.                                         //printf("label = %d\n",label) ;
  62.                                 }while(label == 1);
  63.                                 total_card[i] = number;
  64.                         }
  65.                
  66.                 }
  67.     }
  68.     return total_card;
  69. }


  70. void print_card(int i , char name[] ,int people[13],char class_card[][7])
  71. {
  72. //   printf("**************%d*************\n",i);
  73.     int card = 13;
  74.     printf("the card of %s is:\n", name);
  75.    
  76.     for(int i =0;i<13;i++)
  77.     {
  78.             printf("in the function%s \n",class_card[i]);
  79. //        printf("in the function%d \n",people[i]);
  80.     }

  81.     for (int i = 0; i < card; i++)
  82.     {
  83.             if(people[i] < card - 1)  //小于13
  84.             {
  85.                     printf("<13 people[i] = %d\n",people[i]);
  86.                 printf("%s%d ",class_card[0],i);   //0~14给第一个字符
  87.                
  88.             }
  89.                
  90.             else if(card *2 > people[i] >= card)
  91.             {
  92.                     printf("26> >13 people[i] = %d\n",people[i]);
  93.                 printf("%s%d ",class_card[1],i);
  94.             }
  95.            
  96.             else if(card *3  > people[i] >= card *2)
  97.             {
  98.                     printf("39> >26 people[i] = %d\n",people[i]);
  99.                 printf("%s%d ",class_card[2],i);
  100.                
  101.             }      
  102.            
  103.             else if(52 > people[i] >= 39)
  104.             {
  105.                     printf("52> >39 people[i] = %d\n",people[i]);
  106.                 printf("%s%d ",class_card[3],i);
  107.                
  108.             }      

  109.             else if(people[i] == 53)
  110.             {
  111.                 printf("%s ",class_card[4]);
  112.             }
  113.             else if(people[i] == 54)
  114.             {
  115.                 printf("%s ",class_card[5]);
  116.             }               
  117.         }
  118. }

  119. void get_name(char name[][64] , int num)
  120. {
  121.         int i                                        ;
  122.         for(i = 0 ; i < number_of_game ; i ++)
  123.         {
  124.             printf("enter %d member's name :",i) ;
  125.             fgets(name[i] , 64 , stdin)          ;
  126.         }
  127. }


  128. int * distribution(int *array,int member)
  129. {
  130.         int * someone                                       ;
  131.         someone = (int *) malloc(sizeof(int) * 14)          ;
  132.         for(int i = 0 ; i < card ; i ++)
  133.         {
  134.             someone[i] = array[card * (member - 1) + i] ;
  135.         }
  136.         return someone                                      ;
  137. }


  138. int main()
  139. {
  140.     //输入玩家的名子
  141.     int i;
  142.     char name[3][64]                    ;
  143.     get_name(name , number_of_game)     ;
  144. //    for(i = 0; i < number_of_game; i++)
  145. //    {
  146. //            printf("the %d member's name is: %s'",i,name[i]);
  147. //    }
  148.       
  149.     //定义纸牌
  150.     //char *num[13] = {'J','Q','K'};
  151.     char num[13][4] = {"1","2","3","4","5","6","7","8","9","10","J","Q","K"} ;
  152.     char class_card[][7] = {"方","梅","红","黑","大王","小王"};
  153.    

  154.         //分配54张牌
  155.     int *person1,*person2,*person3;
  156.     int *people;
  157.    
  158.         people = get_54_number_no_repeat(54);
  159.        
  160.     person1 = distribution(people,1);
  161.     person2 = distribution(people,2);
  162.     person3 = distribution(people,3);
  163.    

  164.     //打印3个人分到的牌
  165.     print_card(1,name[0],person1,class_card);   
  166.     print_card(2,name[1],person2,class_card);   
  167.     print_card(3,name[2],person3,class_card);   
  168.    
  169.     free(person1);
  170.     free(person2);
  171.     free(person3);
  172.     return 0;
  173. }
复制代码
最佳答案
2020-11-27 00:40:40
我这里之前回复过的一洗牌、发牌程序,供你参考一下
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>

  4. void shuffle(int array[], int length);
  5. void deal(int array[], int player[3][14]);
  6. void show(char names[3][20], int player[3][14]);

  7. void shuffle(int array[], int length)    // 调用函数 shuffle 进行洗牌
  8. {
  9.         int index, temp, i;

  10.         srand(time(NULL));               // 使用当前时间进行随机数发生器的初始化
  11.         for (i = 0; i < length; i++)
  12.         {
  13.                 index = rand() % (length - i + 1) + i; // 产生一个随机数
  14.                 if (index != i)                        // 如果 index 不等于 i,这是为了充分打乱 array 中的原值,即109行所赋的值
  15.                 {
  16.                         temp = array[i];               // 将原值(第 i 张牌)赋给临时变量
  17.                         array[i] = array[index];       // 将第 index 张牌替换原值
  18.                         array[index] = temp;           // 将第 i 张牌换到第 index 张牌的位置
  19.                 }
  20.         }
  21. }

  22. void deal(int array[], int player[3][14])
  23. {
  24.         int i, j, k = 0;

  25.         // 模拟发牌:拿起一副无序的扑克每人轮流发一张牌
  26.         for (i = 0; i < 14; i++)
  27.         {
  28.                 for (j = 0; j < 3; j++)
  29.                 {
  30.                         player[j][i] = array[k++];
  31.                 }
  32.         }
  33. }

  34. void show(char names[3][20], int player[3][14])
  35. {
  36.         int i, j, poker;

  37.         printf("\n方=方角,梅=梅花,红=红桃,黑=黑桃\n\n");

  38.         for (i = 0; i < 3; i++)
  39.         {
  40.                 printf("%s手上的牌是:", names[i]);
  41.                 for (j = 0; j < 14; j++)
  42.                 {
  43.                        poker = player[i][j];

  44.                        if (poker < 11 && 0 < poker)
  45.                        {
  46.                                printf("方%d ", poker);
  47.                        }
  48.                        else if (poker < 21 && 10 < poker)
  49.                        {
  50.                                printf("梅%d ", poker-10);
  51.                        }
  52.                        else if (poker < 31 && 20 < poker)
  53.                        {
  54.                                printf("红%d ", poker-20);
  55.                        }
  56.                        else if (poker < 41 && 30 < poker)
  57.                        {
  58.                                printf("黑%d ", poker-30);
  59.                        }
  60.                        else
  61.                        {
  62.                                switch (poker)
  63.                                {
  64.                                        case 41: printf("方J "); break;
  65.                                        case 42: printf("方Q "); break;
  66.                                        case 43: printf("方K "); break;
  67.                                        case 44: printf("梅J "); break;
  68.                                        case 45: printf("梅Q "); break;
  69.                                        case 46: printf("梅K "); break;
  70.                                        case 47: printf("红J "); break;
  71.                                        case 48: printf("红Q "); break;
  72.                                        case 49: printf("红K "); break;
  73.                                        case 50: printf("黑J "); break;
  74.                                        case 51: printf("黑Q "); break;
  75.                                        case 52: printf("黑K "); break;
  76.                                        case 53: printf("小王 "); break;
  77.                                        case 54: printf("大王 "); break;
  78.                                }
  79.                        }

  80.                 }
  81.                 printf("\n\n");
  82.         }

  83. }

  84. int main(void)
  85. {
  86.         int array[54];
  87.         int player[3][14];
  88.         int i,ch;
  89.         char names[3][20];

  90.         // 初始化扑克牌
  91.         // 1~10代表方(角)1~10, 41、42、43代表方(角)J、Q、K
  92.         // 11~20代表梅(花)1~10, 44、45、46代表梅(花)J、Q、K
  93.         // 21~30代表红(桃)1~10, 47、48、49代表红(桃)J、Q、K
  94.         // 31~40代表黑(桃)1~10, 50、51、52代表黑(桃)J、Q、K
  95.         // 53、54当然就代表小王大王啦~
  96.         for (i = 0; i < 54; i++)
  97.         {
  98.                 array[i] = i + 1;
  99.         }

  100.         for (i = 0; i < 3; i++)
  101.         {
  102.                 printf("\n请输入%d号玩家的名字:", i+1);
  103.                 scanf("%s",names[i]);
  104.         }
  105.         do
  106.         {
  107.                 shuffle(array, 54);
  108.                 deal(array, player);
  109.                 show(names, player);

  110.                 printf("重新洗牌(Y/N)?");
  111.                 do
  112.                 {
  113.                         ch = getchar(); // 过滤输入缓冲区的其他字符
  114.                 } while (ch != 'Y' && ch != 'N');
  115.         } while (ch == 'Y');

  116.         return 0;
  117. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-26 20:54:39 From FishC Mobile | 显示全部楼层
这个应该是生成的只有伪随机数,首次编译得到的字节码完全文件决定了后面会出现的随机数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-26 22:34:14 | 显示全部楼层
倒戈卸甲 发表于 2020-11-26 20:54
这个应该是生成的只有伪随机数,首次编译得到的字节码完全文件决定了后面会出现的随机数

我打印传进print_card里面的数组,确实是54个不同的随机数,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-27 00:40:40 | 显示全部楼层    本楼为最佳答案   
我这里之前回复过的一洗牌、发牌程序,供你参考一下
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>

  4. void shuffle(int array[], int length);
  5. void deal(int array[], int player[3][14]);
  6. void show(char names[3][20], int player[3][14]);

  7. void shuffle(int array[], int length)    // 调用函数 shuffle 进行洗牌
  8. {
  9.         int index, temp, i;

  10.         srand(time(NULL));               // 使用当前时间进行随机数发生器的初始化
  11.         for (i = 0; i < length; i++)
  12.         {
  13.                 index = rand() % (length - i + 1) + i; // 产生一个随机数
  14.                 if (index != i)                        // 如果 index 不等于 i,这是为了充分打乱 array 中的原值,即109行所赋的值
  15.                 {
  16.                         temp = array[i];               // 将原值(第 i 张牌)赋给临时变量
  17.                         array[i] = array[index];       // 将第 index 张牌替换原值
  18.                         array[index] = temp;           // 将第 i 张牌换到第 index 张牌的位置
  19.                 }
  20.         }
  21. }

  22. void deal(int array[], int player[3][14])
  23. {
  24.         int i, j, k = 0;

  25.         // 模拟发牌:拿起一副无序的扑克每人轮流发一张牌
  26.         for (i = 0; i < 14; i++)
  27.         {
  28.                 for (j = 0; j < 3; j++)
  29.                 {
  30.                         player[j][i] = array[k++];
  31.                 }
  32.         }
  33. }

  34. void show(char names[3][20], int player[3][14])
  35. {
  36.         int i, j, poker;

  37.         printf("\n方=方角,梅=梅花,红=红桃,黑=黑桃\n\n");

  38.         for (i = 0; i < 3; i++)
  39.         {
  40.                 printf("%s手上的牌是:", names[i]);
  41.                 for (j = 0; j < 14; j++)
  42.                 {
  43.                        poker = player[i][j];

  44.                        if (poker < 11 && 0 < poker)
  45.                        {
  46.                                printf("方%d ", poker);
  47.                        }
  48.                        else if (poker < 21 && 10 < poker)
  49.                        {
  50.                                printf("梅%d ", poker-10);
  51.                        }
  52.                        else if (poker < 31 && 20 < poker)
  53.                        {
  54.                                printf("红%d ", poker-20);
  55.                        }
  56.                        else if (poker < 41 && 30 < poker)
  57.                        {
  58.                                printf("黑%d ", poker-30);
  59.                        }
  60.                        else
  61.                        {
  62.                                switch (poker)
  63.                                {
  64.                                        case 41: printf("方J "); break;
  65.                                        case 42: printf("方Q "); break;
  66.                                        case 43: printf("方K "); break;
  67.                                        case 44: printf("梅J "); break;
  68.                                        case 45: printf("梅Q "); break;
  69.                                        case 46: printf("梅K "); break;
  70.                                        case 47: printf("红J "); break;
  71.                                        case 48: printf("红Q "); break;
  72.                                        case 49: printf("红K "); break;
  73.                                        case 50: printf("黑J "); break;
  74.                                        case 51: printf("黑Q "); break;
  75.                                        case 52: printf("黑K "); break;
  76.                                        case 53: printf("小王 "); break;
  77.                                        case 54: printf("大王 "); break;
  78.                                }
  79.                        }

  80.                 }
  81.                 printf("\n\n");
  82.         }

  83. }

  84. int main(void)
  85. {
  86.         int array[54];
  87.         int player[3][14];
  88.         int i,ch;
  89.         char names[3][20];

  90.         // 初始化扑克牌
  91.         // 1~10代表方(角)1~10, 41、42、43代表方(角)J、Q、K
  92.         // 11~20代表梅(花)1~10, 44、45、46代表梅(花)J、Q、K
  93.         // 21~30代表红(桃)1~10, 47、48、49代表红(桃)J、Q、K
  94.         // 31~40代表黑(桃)1~10, 50、51、52代表黑(桃)J、Q、K
  95.         // 53、54当然就代表小王大王啦~
  96.         for (i = 0; i < 54; i++)
  97.         {
  98.                 array[i] = i + 1;
  99.         }

  100.         for (i = 0; i < 3; i++)
  101.         {
  102.                 printf("\n请输入%d号玩家的名字:", i+1);
  103.                 scanf("%s",names[i]);
  104.         }
  105.         do
  106.         {
  107.                 shuffle(array, 54);
  108.                 deal(array, player);
  109.                 show(names, player);

  110.                 printf("重新洗牌(Y/N)?");
  111.                 do
  112.                 {
  113.                         ch = getchar(); // 过滤输入缓冲区的其他字符
  114.                 } while (ch != 'Y' && ch != 'N');
  115.         } while (ch == 'Y');

  116.         return 0;
  117. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 17:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表