鱼C论坛

 找回密码
 立即注册
查看: 1845|回复: 5

[已解决]S1E31洗牌发牌

[复制链接]
发表于 2021-10-7 20:02:11 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int str[52];//用于存放随机数 
//char str1[3][50] = {0};
const char *data[] = {"黑A","黑2","黑3","黑4","黑5","黑6","黑7","黑8","黑9","黑10",
                                 "红A","红2","红3","红4","红5","红6","红7","红8","红9","红10",
                                 "梅A","梅2","梅3","梅4","梅5","梅6","梅7","梅8","梅9","梅10",
                                 "方A","方2","方3","方4","方5","方6","方7","方8","方9","方10",
                                 "黑J","黑Q","黑K","红J","红Q","红K","梅J","梅Q","梅K","方J","方Q","方K",
                                 "大王","小王"};  

//洗牌
int Xipai()
{
        int i, j;
        time_t t;
        
        srand((unsigned)time(&t));
        
        //生成1-54的伪随机数
        for (i = 0;i < 52;i++)
        {
                str[i] = rand() % 54 + 1;
                //printf("%d ",str[i]);
                
        } 
        printf("\n");
} 
 
 
//发牌 一一对应 
char Fapai()
{
        int i, j, k = 0;
        char *p[52];
        
        //这里我想将洗牌后的地址对应的指针存入一个指针数组中,使数组中的指针指向洗牌后在data中对应的牌 
        for(i = 0;i < 52;i++) 
        {
                *p++ =  data + str[i];
        }        
        while (*p++ != '\0')
        {
                printf("%s ", *p);
                
        } 
}

我想将洗牌后的地址对应的指针存入一个指针数组中,使数组中的指针指向洗牌后在data中对应的牌,请问该怎么写?
最佳答案
2021-10-18 18:16:33
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const char * data[] = {"黑A","黑2","黑3","黑4","黑5","黑6","黑7","黑8","黑9","黑10","黑J","黑Q","黑K" ,
                      "红A","红2","红3","红4","红5","红6","红7","红8","红9","红10" ,"红J","红Q","红K" ,
                      "梅A","梅2","梅3","梅4","梅5","梅6","梅7","梅8","梅9","梅10","梅J","梅Q","梅K"  ,
                      "方A","方2","方3","方4","方5","方6","方7","方8","方9","方10","方J","方Q","方K"  ,
                      "大王","小王"}                                                                  ;  

void Xipai(int d[])
{
        int i , j , k                                         ;
        time_t  t                                             ;
       
        srand((unsigned)time(& t))                            ;
        for(i = 0 ; i < 54 ; i ++) d[i] = 0                   ;
        d[0] = rand() % 54 + 1                                ;
        for(i = 1 ; i < 54 ;) {
                k = rand() % 54 + 1                           ;
                for(j = 0 ; j < i ; j ++) if(d[j] == k) break ;
                if(j == i) d[i ++] = k                        ; 
        }
}

int main(void)
{
        int d[54] = {0} , i                                   ;
        Xipai(d)                                              ;
        for(i = 0 ; i < 54 ; i ++) {
                if(i) printf(",")                             ;
                printf("%s" , data[d[i] - 1])                 ;
        }
        printf("\n")                                          ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-18 17:21:53 | 显示全部楼层
       没看懂你的意图,你是想让本次发牌受前一次发牌的影响?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-18 17:34:23 | 显示全部楼层
jackz007 发表于 2021-10-18 17:21
没看懂你的意图,你是想让本次发牌受前一次发牌的影响?

之前我想的是,3个人一人14张牌,那就产生3X14=52个随机数,这52个随机数对应54张牌里面的52张,将这52个随机数作为存放54张牌数组的索引号,将随机数对应牌的地址通过指针存放在一个数组中,打印这52个指针指向的值就相当于洗牌了(当时没考虑到52个随机数可能会有重复)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-18 18:08:38 | 显示全部楼层
雨中漫步~ 发表于 2021-10-18 17:34
之前我想的是,3个人一人14张牌,那就产生3X14=52个随机数,这52个随机数对应54张牌里面的52张,将这52个 ...
void Xipai(int d[])
{
        int i , j , k                                         ;
        time_t  t                                             ;
       
        srand((unsigned)time(& t))                            ;
        for(i = 0 ; i < 52 ; i ++) d[i] = 0                   ;
        d[0] = rand() % 52 + 1                                ;
        for(i = 1 ; i < 52 ;) {
                k = rand() % 52 + 1                           ;
                for(j = 0 ; j < i ; j ++) if(d[j] == k) break ;
                if(j == i) d[i ++] = k                        ; 
        }
}
        调用这个函数,每次调用,数组 d 中都会有 52 个互相不重复,数值为 1 ~ 52 的不同数值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-18 18:16:33 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const char * data[] = {"黑A","黑2","黑3","黑4","黑5","黑6","黑7","黑8","黑9","黑10","黑J","黑Q","黑K" ,
                      "红A","红2","红3","红4","红5","红6","红7","红8","红9","红10" ,"红J","红Q","红K" ,
                      "梅A","梅2","梅3","梅4","梅5","梅6","梅7","梅8","梅9","梅10","梅J","梅Q","梅K"  ,
                      "方A","方2","方3","方4","方5","方6","方7","方8","方9","方10","方J","方Q","方K"  ,
                      "大王","小王"}                                                                  ;  

void Xipai(int d[])
{
        int i , j , k                                         ;
        time_t  t                                             ;
       
        srand((unsigned)time(& t))                            ;
        for(i = 0 ; i < 54 ; i ++) d[i] = 0                   ;
        d[0] = rand() % 54 + 1                                ;
        for(i = 1 ; i < 54 ;) {
                k = rand() % 54 + 1                           ;
                for(j = 0 ; j < i ; j ++) if(d[j] == k) break ;
                if(j == i) d[i ++] = k                        ; 
        }
}

int main(void)
{
        int d[54] = {0} , i                                   ;
        Xipai(d)                                              ;
        for(i = 0 ; i < 54 ; i ++) {
                if(i) printf(",")                             ;
                printf("%s" , data[d[i] - 1])                 ;
        }
        printf("\n")                                          ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-18 18:34:40 | 显示全部楼层

我何时才能如此优秀,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 17:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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