努力学好程序设计 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 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分