| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1238 人关注过本帖
标题:rand()函数的问题
取消只看楼主 加入收藏
落雨and无声
Rank: 2
等 级:论坛游民
帖 子:48
专家分:30
注 册:2012-10-5
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:4 
rand()函数的问题
题目是写一个扑克牌的发牌程序,并按照打牌的规则对手中的牌排序输出。我设计成斗地主的发牌,想用rand函数来做。结果。。。。。。每位玩家手里都有好多炸弹。。。就像牌没有洗开一样。我实在是不清楚是我程序的问题,还是rand函数本身存在缺陷了。。求助啊。。。拜托各位了
程序代码:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
///发牌函数/////////这里肯定有问题,不然不会满手的炸弹
void deal_poker(int num[],int poker[])
{
    int rand_num;
    for(int i=0;i<18;i++)
    {
        srand((int)time(0));
        rand_num=(rand())%15;
        while(4==num[rand_num])
        {
            srand((int)time(0));
            rand_num=(rand())%15;//对随机得到的数字所代表的牌已发出的情况进行处理
        }
        num[rand_num]++;
        switch(rand_num)//按照斗地主规则中牌的大小对poker赋值,以便排序
        {
        case 0:poker[i]=14;break;
        case 1:poker[i]=15;break;
        case 13:poker[i]=16;break;
        case 14:poker[i]=17;break;
        default:poker[i]=rand_num+1;break;
        }
    }
}
///排序函数
void rank(int poker[])
{
    int temp,k;
    for(int i=0;i<18;i++)
    {
        k=i;
        for(int j=i+1;j<18;j++)
        {
            if(poker[j]<poker[k])k=j;
        }
        if(k!=i)
        {
            temp=poker[k];
            poker[k]=poker[i];
            poker[i]=temp;
        }
    }
}
///输出函数
void print(int poker[])
{
    for(int i=0;i<18;i++)
    {
        switch(poker[i])
        {
        case 11:printf("%7s","J");break;
        case 12:printf("%7s","Q");break;
        case 13:printf("%7s","K");break;
        case 14:printf("%7s","Ace");break;
        case 15:printf("%7s","2");break;
        case 16:printf("%7s","Joker1");break;
        case 17:printf("%7s","Joker2");break;
        default:printf("%7d",poker[i]);break;
        }
        if(0==(i+1)%6)printf("\n");
    }
    printf("\n");
}
void main()
{
    char s;
    int num[15]={0};//记录每种牌的个数(为了区分大小王所以用了15个种类)
    int poker[18]={0};//记录手牌
    num[13]=3;
    num[14]=3;
    printf("说明:\n手牌按照多地主的规则从小到大排序Joker1代表大王,Joker2代表小王,请输入s开始发牌\n");
    while(EOF!=scanf("%c",&s))
    {
        for(int i=0;i<3;i++)
        {
            printf("玩家%d的手牌:\n",i+1);
            deal_poker(num,poker);
            rank(poker);
            print(poker);
        }
    }
}
搜索更多相关主题的帖子: 函数 
2012-10-31 23:07
落雨and无声
Rank: 2
等 级:论坛游民
帖 子:48
专家分:30
注 册:2012-10-5
收藏
得分:0 
回复 2楼 wp231957
我是用time为rand做种子的,在循环内是为了让每次的种子不同。
2012-11-02 23:31
落雨and无声
Rank: 2
等 级:论坛游民
帖 子:48
专家分:30
注 册:2012-10-5
收藏
得分:0 
回复 4楼 berchan
刚刚我运行了一下。。。仍然是满手的炸弹牌。。很不合理,我觉得这里有什么深入的问题,是与rand的产生有关的。rand产生的数字并不是完全随机的。我之所以用15个累,就是为了解决大小王的问题,我把大王跟小王分为两个类了。。。
2012-11-02 23:44
落雨and无声
Rank: 2
等 级:论坛游民
帖 子:48
专家分:30
注 册:2012-10-5
收藏
得分:0 
回复 2楼 wp231957
好吧,我试了试。原来rand函数没必要一直做新种,一直做新种反而容易引起错误。你是对的。谢谢了
2012-11-03 01:59
落雨and无声
Rank: 2
等 级:论坛游民
帖 子:48
专家分:30
注 册:2012-10-5
收藏
得分:0 
回复 9楼 berchan
谢谢
2012-11-09 00:47
快速回复:rand()函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014639 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved