黑人问号 发表于 2019-12-12 11:14:17

大佬们,为什么我这样子会发牌重复呢?

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
        int a,i,w,t;
        void judge(int p[]);//定义判断函数
        srand((unsigned)time(NULL));//定义排序函数
        for (i=0;i<52;i++)//填满数组
      a=i+1;
        for (i=52-1;i>0;i--)//通过随机函数赋值给w,然后通过交换下标来保证随机的效果
        {
                w=rand()%i;//运用随机函数来给w赋值
                t=a;
                a=a;//交换下标
                a=t;
        }
        printf("玩家1的手牌有:");
        judge(a);
        printf("\n玩家2的手牌有:");
        judge(a+13);
        printf("\n玩家3的手牌有:");
        judge(a+26);
        printf("\n玩家4的手牌有:");
        judge(a+39);
        printf("\n");
        return 0;
}
void judge(int p[])//判断手牌花色
{
        int i;
        void sorting(int p[],int n);
        sorting(p,13);
        for(i=0;i<13;i++)
        {
                if(p<=13&&p>=1)
                {
                        if(p == 1)
                                printf("方块A ");
                        else if(p == 11)
                                printf("方块J ");
                        else if(p == 12)
                                printf("方块Q ");
                        else if(p == 13)
                                printf("方块K ");
                        else
                                printf("方块%d ",p);
                }
                else if(p<=26&&p>=14)
                {
                        if(p==14)
                                printf("梅花A ");
                        else if(p==24)
                                printf("梅花J ");
                        else if(p==25)
                                printf("梅花Q ");
                        else if(p==26)
                                printf("梅花K ");
                        else
                                printf("梅花%d ",p-13);
                }
                else if(p<=39&&p>=27)
                {
                        if(p==27)
                                printf("黑桃A ");
                        else if(p==37)
                                printf("黑桃J ");
                        else if(p==38)
                                printf("黑桃Q ");
                        else if(p==39)
                                printf("黑桃K ");
                        else
                                printf("黑桃%d ",p-26);
                }
                else if(p<=52&&p>=40)
                {
                        if(p==40)
                                printf("红桃A ");
                        else if(p==50)
                                printf("红桃J ");
                        else if(p==51)
                                printf("红桃Q ");
                        else if(p==52)
                                printf("红桃K ");
                        else
                                printf("红桃%d ",p-39);
                }
        }
}
void sorting(int p[],int n)//排序函数
{
        int i,k,j,t;
        int z;
        for(i=0;i<13;i++)//先把数值变为1-13,并记录下所变的数的位置
        {
                if (p<=13)
                {
                        z = 0;
                }
                else if(p>13&&p<=26)
                {
                        z = 1;
                        p = p-13*z;
                }
                else if(p>26&&p<=39)
                {
                        z = 2;
                        p = p-13*z;
                }
                else if(p>39&&p<=52)
                {
                        z = 3;
                        p = p-13*z;
                }
        }
        for(i=0;i<n-1;i++)//通过数值大小来排序
        {
                k=i;
                for(j=i+1;j<n;j++)
                {
                        if(p<p)
                                k = j;
                }
                t = p;
                p = p;
                p = t;
        }
        for(i=0;i<13;i++)//通过刚刚记录下的位置来还原数值
        {
                        p = p+13*z;
        }
}

superbe 发表于 2019-12-12 13:19:35

本帖最后由 superbe 于 2019-12-12 13:23 编辑

问题出在sorting函数,在交换两张牌时,数组z中没有相应交换,导致最后还原时加回发生了“错位”。
把排序的嵌套for循环修改如下:
for (i = 0; i < n - 1; i++)//通过数值大小来排序
{
    for (j = i + 1; j < n; j++)
    {
      if (p < p) {
            t = p;
            p = p;
            p = t;

            t = z;
            z = z;
            z = t;
      }
    }
}
页: [1]
查看完整版本: 大佬们,为什么我这样子会发牌重复呢?