鱼C论坛

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

[已解决]C 语言 poker

[复制链接]
发表于 2024-3-31 21:47:23 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>

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

  7. void shuffle(int array[], int length){
  8.         int index, temp, i;
  9.        
  10.         srand(time(NULL));
  11.         for(i = 0; i < length; i++){
  12.                 index = rand() % (length -i) + i;
  13.                 if(index != i){
  14.                         temp = array[i];
  15.                         array[i] = array[index];
  16.                         array[index] = temp;
  17.                 }
  18.         }
  19. }

  20. void deal(int array[], int player[3][14]){
  21.         int i, j ,k;

  22.         for(i = 0; i < 3; i++){
  23.                 for(j = 0; j < 14; j++){
  24.                         player[i][j] = array[k++];
  25.                 }
  26.         }
  27. }

  28. void show(char names[3][40], int player[3][14]){
  29.         int i, j, poker;

  30.         printf("\n方 = 方块 梅 = 梅花 红 = 红桃 黑 = 黑桃\n");

  31.         for(i = 0; i < 3; i++){
  32.                 printf("%s手上的牌是:",names[i]);
  33.                 for(j = 0; j < 14; j++){
  34.                         poker = player[i][j];
  35.                         if(poker < 11 && 0 < poker){
  36.                                 printf("方%d ", poker);
  37.                         }else if(poker < 21 && 10 < poker){
  38.                                 printf("梅%d ", poker -10);
  39.                         }else if(poker < 31 && 20 < poker){
  40.                                 printf("红%d ", poker -20);
  41.                         }else if(poker < 41 && 30 < poker){
  42.                                 printf("黑%d ", poker -30);
  43.                         }else{
  44.                                 switch(poker){
  45.                                         case 41: printf("方J "); break;
  46.                                         case 42: printf("方Q "); break;
  47.                                         case 43: printf("方K "); break;
  48.                                         case 44: printf("梅J "); break;
  49.                                         case 45: printf("梅Q "); break;
  50.                                         case 46: printf("梅K "); break;
  51.                                         case 47: printf("红J "); break;
  52.                                         case 48: printf("红Q "); break;
  53.                                         case 49: printf("红K "); break;
  54.                                         case 50: printf("黑J "); break;
  55.                                         case 51: printf("黑Q "); break;
  56.                                         case 52: printf("黑K "); break;
  57.                                         case 53: printf("小王 "); break;
  58.                                         case 54: printf("大王 "); break;
  59.                                 }
  60.                         }
  61.                 }
  62.                 printf("\n\n");
  63.         }
  64. }

  65. int main(){
  66.        
  67.         int array[54];
  68.         int player[3][14];
  69.         int i, ch;
  70.         char names[3][40];
  71.        
  72.         for(i = 0; i < 54; i++){
  73.                 array[i] = i + 1;
  74.         }

  75.         for(i = 0; i < 3; i++){
  76.                 printf("\n请输入%d号玩家的信息:", i + 1);
  77.                 scanf("%s", names[i]);
  78.         }

  79.         do{
  80.                 shuffle(array,54);
  81.                 deal(array, player);
  82.                 show(names,player);
  83.                        
  84.                 printf("重新洗牌(Y/N)");
  85.                 do{
  86.                         ch = getchar();
  87.                 }while(ch != 'Y' && ch != 'N');
  88.         }while(ch == 'Y');

  89.         return 0;
  90. }
复制代码


@FishC,我的代码哪里有问题,我跟着敲的。
最佳答案
2024-3-31 21:50:38
liyifeng295641 发表于 2024-03-31 21:50
我写的
#include
#include
#include

void sh ...


你的代码与小甲鱼的代码只有一处不同,即发牌函数 `deal()` 中的 `k` 的初始值。小甲鱼的代码将 `k` 初始化为0,而你的代码没有初始化 `k` 的值。

对于你的代码:

  1. void deal(int array, int player){
  2.     int i, j ,k;
  3.     for(i = 0; i < 3; i++){
  4.         for(j = 0; j < 14; j++){
  5.             player = array;
  6.         }
  7.     }
  8. }
复制代码


你定义了变量 `k` 但没有给它赋初值。这可能会导致发牌时出现错误。你可以将 `int k = 0;` 添加到 `deal()` 函数中的合适位置,以确保 `k` 被正确初始化。

修复后的代码如下:

  1. void deal(int array, int player){
  2.     int i, j ,k = 0; // 添加 k 的初始化
  3.     for(i = 0; i < 3; i++){
  4.         for(j = 0; j < 14; j++){
  5.             player = array;
  6.         }
  7.     }
  8. }
复制代码


这样就和小甲鱼的代码保持一致了。

希望以上解答对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-31 21:48:00 | 显示全部楼层
你好!看起来你的代码有几个小问题。我将逐个解释并提供修复方法:

1. 在函数中,传递数组要使用指针而不是整数。

  1. void shuffle(int *array, int length);
  2. void deal(int *array, int player);
  3. void show(char *names, int *player);
复制代码


2. 你需要分配内存来存储玩家的手牌。在 `main()` 函数中,可以声明一个二维数组来存储三位玩家的牌。

  1. int player[3][14];
复制代码


3. 洗牌函数 `shuffle()` 中,你需要交换数组元素的值,而不是改变指针的指向。修复方法如下:

  1. void shuffle(int *array, int length){
  2.     int index, temp, i;
  3.    
  4.     srand(time(NULL));
  5.     for(i = 0; i < length; i++){
  6.         index = rand() % (length -i) + i;
  7.         if(index != i){
  8.             temp = array[i];
  9.             array[i] = array[index];
  10.             array[index] = temp;
  11.         }
  12.     }
  13. }
复制代码


4. 发牌函数 `deal()` 中,你需要将洗好的牌发给玩家。修复方法如下:

  1. void deal(int *array, int player){
  2.     int i, j ,k;
  3.     k = 0;
  4.     for(i = 0; i < 3; i++){
  5.         for(j = 0; j < 14; j++){
  6.             player[i][j] = array[k++];
  7.         }
  8.     }
  9. }
复制代码


5. 显示函数 `show()` 中,传递字符串应该使用字符数组而不是字符指针。

  1. void show(char names[], int *player)
复制代码


6. 在 `main()` 函数中,存储玩家姓名的变量 `names` 应该是一个字符数组而不是字符。

  1. char names[3][20];
复制代码


7. 在 `main()` 函数中,你没有为数组 `array` 分配内存,因此无法正确洗牌。你可以使用动态分配内存的方式来解决这个问题。

  1. int *array = malloc(sizeof(int) * 54);
复制代码


运行前记得在程序结束后释放刚刚分配的内存。

完整修复后的代码如下:

  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[][14]);
  6. void show(char names[][20], int player[][14]);

  7. void shuffle(int *array, int length){
  8.     int index, temp, i;
  9.    
  10.     srand(time(NULL));
  11.     for(i = 0; i < length; i++){
  12.         index = rand() % (length -i) + i;
  13.         if(index != i){
  14.             temp = array[i];
  15.             array[i] = array[index];
  16.             array[index] = temp;
  17.         }
  18.     }
  19. }

  20. void deal(int *array, int player[][14]){
  21.     int i, j ,k;
  22.     k = 0;
  23.     for(i = 0; i < 3; i++){
  24.         for(j = 0; j < 14; j++){
  25.             player[i][j] = array[k++];
  26.         }
  27.     }
  28. }

  29. void show(char names[][20], int player[][14]){
  30.     int i, j, poker;

  31.     printf("\n方 = 方块 梅 = 梅花 红 = 红桃 黑 = 黑桃\n");

  32.     for(i = 0; i < 3; i++){
  33.         printf("%s手上的牌是:",names[i]);
  34.         for(j = 0; j < 14; j++){
  35.             poker = player[i][j];
  36.             if(poker < 11 && 0 < poker){
  37.                 printf("方%d ", poker);
  38.             }else if(poker < 21 && 10 < poker){
  39.                 printf("梅%d ", poker -10);
  40.             }else if(poker < 31 && 20 < poker){
  41.                 printf("红%d ", poker -20);
  42.             }else if(poker < 41 && 30 < poker){
  43.                 printf("黑%d ", poker -30);
  44.             }else{
  45.                 switch(poker){
  46.                     case 41: printf("方J "); break;
  47.                     case 42: printf("方Q "); break;
  48.                     case 43: printf("方K "); break;
  49.                     case 44: printf("梅J "); break;
  50.                     case 45: printf("梅Q "); break;
  51.                     case 46: printf("梅K "); break;
  52.                     case 47: printf("红J "); break;
  53.                     case 48: printf("红Q "); break;
  54.                     case 49: printf("红K "); break;
  55.                     case 50: printf("黑J "); break;
  56.                     case 51: printf("黑Q "); break;
  57.                     case 52: printf("黑K "); break;
  58.                     case 53: printf("小王 "); break;
  59.                     case 54: printf("大王 "); break;
  60.                 }
  61.             }
  62.         }
  63.         printf("\n\n");
  64.     }
  65. }

  66. int main(){
  67.    
  68.     int *array = malloc(sizeof(int) * 54);
  69.     int player[3][14];
  70.     int i, ch;
  71.     char names[3][20];
  72.    
  73.     for(i = 0; i < 54; i++){
  74.         array[i] = i + 1;
  75.     }

  76.     for(i = 0; i < 3; i++){
  77.         printf("\n请输入%d号玩家的信息:", i + 1);
  78.         scanf("%s", names[i]);
  79.     }

  80.     do{
  81.         shuffle(array,54);
  82.         deal(array, player);
  83.         show(names,player);
  84.             
  85.         printf("重新洗牌(Y/N)");
  86.         do{
  87.             ch = getchar();
  88.         }while(ch != 'Y' && ch != 'N');
  89.     }while(ch == 'Y');

  90.     free(array);

  91.     return 0;
  92. }
复制代码


希望以上解答对您有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 21:50:23 | 显示全部楼层
FishC 发表于 2024-3-31 21:48
你好!看起来你的代码有几个小问题。我将逐个解释并提供修复方法:

1. 在函数中,传递数组要使用指针而 ...

我写的
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>

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

  7. void shuffle(int array[], int length){
  8.         int index, temp, i;
  9.        
  10.         srand(time(NULL));
  11.         for(i = 0; i < length; i++){
  12.                 index = rand() % (length -i) + i;
  13.                 if(index != i){
  14.                         temp = array[i];
  15.                         array[i] = array[index];
  16.                         array[index] = temp;
  17.                 }
  18.         }
  19. }

  20. void deal(int array[], int player[3][14]){
  21.         int i, j ,k;

  22.         for(i = 0; i < 3; i++){
  23.                 for(j = 0; j < 14; j++){
  24.                         player[i][j] = array[k++];
  25.                 }
  26.         }
  27. }

  28. void show(char names[3][40], int player[3][14]){
  29.         int i, j, poker;

  30.         printf("\n方 = 方块 梅 = 梅花 红 = 红桃 黑 = 黑桃\n");

  31.         for(i = 0; i < 3; i++){
  32.                 printf("%s手上的牌是:",names[i]);
  33.                 for(j = 0; j < 14; j++){
  34.                         poker = player[i][j];
  35.                         if(poker < 11 && 0 < poker){
  36.                                 printf("方%d ", poker);
  37.                         }else if(poker < 21 && 10 < poker){
  38.                                 printf("梅%d ", poker -10);
  39.                         }else if(poker < 31 && 20 < poker){
  40.                                 printf("红%d ", poker -20);
  41.                         }else if(poker < 41 && 30 < poker){
  42.                                 printf("黑%d ", poker -30);
  43.                         }else{
  44.                                 switch(poker){
  45.                                         case 41: printf("方J "); break;
  46.                                         case 42: printf("方Q "); break;
  47.                                         case 43: printf("方K "); break;
  48.                                         case 44: printf("梅J "); break;
  49.                                         case 45: printf("梅Q "); break;
  50.                                         case 46: printf("梅K "); break;
  51.                                         case 47: printf("红J "); break;
  52.                                         case 48: printf("红Q "); break;
  53.                                         case 49: printf("红K "); break;
  54.                                         case 50: printf("黑J "); break;
  55.                                         case 51: printf("黑Q "); break;
  56.                                         case 52: printf("黑K "); break;
  57.                                         case 53: printf("小王 "); break;
  58.                                         case 54: printf("大王 "); break;
  59.                                 }
  60.                         }
  61.                 }
  62.                 printf("\n\n");
  63.         }
  64. }

  65. int main(){
  66.        
  67.         int array[54];
  68.         int player[3][14];
  69.         int i, ch;
  70.         char names[3][40];
  71.        
  72.         for(i = 0; i < 54; i++){
  73.                 array[i] = i + 1;
  74.         }

  75.         for(i = 0; i < 3; i++){
  76.                 printf("\n请输入%d号玩家的信息:", i + 1);
  77.                 scanf("%s", names[i]);
  78.         }

  79.         do{
  80.                 shuffle(array,54);
  81.                 deal(array, player);
  82.                 show(names,player);
  83.                        
  84.                 printf("重新洗牌(Y/N)");
  85.                 do{
  86.                         ch = getchar();
  87.                 }while(ch != 'Y' && ch != 'N');
  88.         }while(ch == 'Y');

  89.         return 0;
  90. }
复制代码


小甲鱼写的:
  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][40], int player[3][14]);

  7. void shuffle(int array[], int length)
  8. {
  9.         int index, temp, i;

  10.         srand(time(NULL));
  11.         for (i = 0; i < length; i++)
  12.         {
  13.                 index = rand() % (length - i) + i;
  14.                 if (index != i)
  15.                 {
  16.                         temp = array[i];
  17.                         array[i] = array[index];
  18.                         array[index] = temp;
  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][40], 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][40];

  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
回复 支持 反对

使用道具 举报

发表于 2024-3-31 21:50:38 | 显示全部楼层    本楼为最佳答案   
liyifeng295641 发表于 2024-03-31 21:50
我写的
#include
#include
#include

void sh ...


你的代码与小甲鱼的代码只有一处不同,即发牌函数 `deal()` 中的 `k` 的初始值。小甲鱼的代码将 `k` 初始化为0,而你的代码没有初始化 `k` 的值。

对于你的代码:

  1. void deal(int array, int player){
  2.     int i, j ,k;
  3.     for(i = 0; i < 3; i++){
  4.         for(j = 0; j < 14; j++){
  5.             player = array;
  6.         }
  7.     }
  8. }
复制代码


你定义了变量 `k` 但没有给它赋初值。这可能会导致发牌时出现错误。你可以将 `int k = 0;` 添加到 `deal()` 函数中的合适位置,以确保 `k` 被正确初始化。

修复后的代码如下:

  1. void deal(int array, int player){
  2.     int i, j ,k = 0; // 添加 k 的初始化
  3.     for(i = 0; i < 3; i++){
  4.         for(j = 0; j < 14; j++){
  5.             player = array;
  6.         }
  7.     }
  8. }
复制代码


这样就和小甲鱼的代码保持一致了。

希望以上解答对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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