回 帖 发 新 帖 刷新版面

主题:一个书上的程序,求大师解!!!

书上的一道题,要求:设计一个类DECK表示52张扑克牌,公有接口:洗牌,发牌,显示各方玩牌者所拿的牌,以及比较大小。
我的想法是,用一个二维数组card[4][13]表示牌,洗牌的时候将它打乱赋值给另一个数组fapai[4][13],发牌的时候将fapai[4][13]赋值给四个玩家的一维数组就行了,因为有比较大小的,所以一切数组都用的指针类型,在card[][]中出定义各牌的大小,比较时直接传地址就可以了。
洗牌那个实在是不会了,本想用随机函数的,可是有两个问题:1,可能会出现同一张牌发两次的情况,因为随机函数每次在所有的数中随机;2,想到一个可以解决的方法,就是每次赋值完后删除该牌,但srand(x)中的x是最大上限,如果第一次就取的最大,并且删掉了,第二次就只能去x-1了啊!
求高手帮忙特!以下是我编的部分代码,可能出了很多错误,多谢指正,关键是帮我想到解决方法啊!
#include<iostream>
#include<cstdlib>
using namespace std;
class deck{
public:
    xipai(){
        cout<<"开始发牌:"<<endl;
        for(i=0;i<4;i++){
            srand(12);
            for(j=0;j<13;j++){
                x=rand();
                fapai[i][j]=card[i][x];
                delete card[i][x];
            }
        }
        
    }
    fapai(){
        for(k=0,j=0;k<13,j<13;k++,j++)
            a[k]=fapai[0][j];
        for(k=0,j=0;k<13,j<13;k++,j++)
            b[k]=fapai[1][j];
        for(k=0,j=0;k<13,j<13;k++,j++)
            c[k]=fapai[2][j];
        for(k=0,j=0;k<13,j<13;k++,j++)
            d[k]=fapai[3][j];
    }
    xianshi(){
        cout<<"各玩家的牌为:"<<endl;
        cout<<a[]<<'\n'<<b[]<<'\n'<<c[]<<'\n'<<d[]<<'\n'<<endl;
    }
    bijiao(){}
private:
    char* card[4][13];
    int i,j,k,x;
    for(i=0;i<4;i++)
        card[i][]={'3','4','5','6','7','8','9','10','J','Q','K','A','2'};
    char* fapai[4][13];
    char* a[13];
    char* b[13];
    char* c[13];
    char* d[13];
}
    

回复列表 (共3个回复)

沙发

“srand(x)中的x是最大上限”
这样的理解是错误的。调用srand(x)函数,不论x的值如何,rand函数返回值的范围都不会被此限制住。rand返回值的范围是0到RAND_MAX。而RAND_MAX这个值是因实现而异的,如果我没记错的话,在VC系列编译器,RAND_MAX等于65535。换句话说,不管srand(x)之时x等于多少,rand都可能返回65535。

洗牌的办法:
总共54张牌,先随机拿出一张,还剩53张;再在剩下的牌中随机拿出一张,还剩52张。如此下去,直到所有的牌都被拿出,即可。
还有一个办法:随机拿出两张,交换它们的顺序。重复这个过程1000次,这样一来牌的顺序也足够乱了,达到洗牌的效果。

从楼主的程序看,很多基础知识不过关。比如靠近最后的那两行:
    for(i=0;i<4;i++)
        card[i][]={'3','4','5','6','7','8','9','10','J','Q','K','A','2'};
这段代码根本没有写在函数里面。这样是错误的。一般只有函数里面才能写for循环。

板凳


谢谢哈,确实都没怎么编过程,以前为了应付考试记得东西都忘了···希望在这儿可以跟众位高手多学习!

3 楼

寻找中国的最优秀的网商领袖精英  
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846 
占领市场第一先机,合力打造网商系统!
淘宝商盟官网   www.taobaosm.com
 http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度

我来回复

您尚未登录,请登录后再回复。点此登录或注册