努力学好程序设计 2022-12-21 15:58 采纳率: 33.3%
浏览 25
已结题

洗牌和发牌模拟,在中间补写过程

问题遇到的现象和发生背景
遇到的现象和发生背景,请写出第一个错误信息
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
运行结果及详细报错内容
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/******************Begin********************/ 
/*********在此定义结构体类型CARD************/ 
typedef struct card{
    char card[52];
}CARD;    
        
/*******************End*********************/

void FillCard(CARD card[]); //生成牌
void Deal(CARD card[], int result[]);   //发牌的应用
void Wash(int result[]);

int main()
{
    int result[52];
    //模拟洗发牌
    CARD card[52];
    FillCard(card);
    Wash(result);
    Deal(card,result);
    return 0;
}

//生成无规则的乱序的洗牌数组
void Wash(int result[])
{
    //srand((unsigned)time(NULL));
    int seed;
    scanf("%d",&seed);
    srand(seed);
    int randnum = 0 ,temp = 0;
    //对所有的数组元素进行初始化
    for(int i = 0;i < 52; i++)
    {
        result[i] = i;
    }
    //生成随机的数列
    for(int i = 0; i< 52;i ++)
    {
        randnum = rand() % 52;
        temp = result[randnum];
        result[randnum] = result[i];
        result[i] = temp;
    }
    return ;
}

//发牌,传入对应的结构体的数组和随机打乱的数组序列
//输出4行代表发给4位不同玩家的扑克牌 
void Deal(CARD card[],int result[])
{
   
    for(int i = 0;i < 52;i ++)
    {
        /******************Begin********************/ 
        /*****把card按照result的乱序结果重新排列****/ 
        
        
        /*******************End*********************/ 
    }
}

//构成扑克牌
void FillCard(CARD card[])
{
    char *face[] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    char *suit[] = {"S","H","C","D"};
    int i = 0;

    for(;i < 52;i ++)
    {
        strcpy(card[i].face,face[i % 13]);
        strcpy(card[i].suit,suit[i / 13]);
    }
}


  • 写回答

3条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2022-12-21 16:09
    关注

    ChatGPT尝试为您解答,仅供参考
    在Deal函数中,可以使用临时变量temp来保存card[i]的值,然后将card[i]的值赋为card[result[i]],最后将temp赋值给card[result[i]]。具体实现如下:

    void Deal(CARD card[],int result[])
    {
        for(int i = 0;i < 52;i ++)
        {
            CARD temp = card[i];
            card[i] = card[result[i]];
            card[result[i]] = temp;
        }
    }
    

    发牌时,可以使用循环来分别输出4位玩家的牌。具体实现如下:

    void Deal(CARD card[],int result[])
    {
        for(int i = 0;i < 52;i ++)
        {
            CARD temp = card[i];
            card[i] = card[result[i]];
            card[result[i]] = temp;
        }
    
        for (int i = 0; i < 52; i++)
        {
            printf("%s%s ", card[i].face, card[i].suit);
            if ((i + 1) % 13 == 0)
            {
                printf("\n");
            }
        }
    }
    

    最后,在main函数中调用Deal函数即可完成发牌的模拟。


    在main函数中,您可以添加一个循环来模拟多局游戏。每次循环,您可以输入一个随机数种子,然后调用Wash函数洗牌,最后调用Deal函数发牌。具体实现如下:

    int main()
    {
        int result[52];
        CARD card[52];
        FillCard(card);
    
        int game_rounds;
        scanf("%d", &game_rounds);
        for (int i = 0; i < game_rounds; i++)
        {
            int seed;
            scanf("%d", &seed);
            srand(seed);
            Wash(result);
            Deal(card, result);
        }
    
        return 0;
    }
    

    您还可以在Deal函数中输出玩家的编号,方便您区分不同玩家的手牌。具体实现如下:

    void Deal(CARD card[],int result[])
    {
        for(int i = 0;i < 52;i ++)
        {
            CARD temp = card[i];
            card[i] = card[result[i]];
            card[result[i]] = temp;
        }
    
        for (int i = 0; i < 52; i++)
        {
            printf("player %d: %s%s ", (i % 4) + 1, card[i].face, card[i].suit);
            if ((i + 1) % 13 == 0)
            {
                printf("\n");
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月30日
  • 已采纳回答 12月22日
  • 创建了问题 12月21日

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?