大佬们,为什么我这样子会发牌重复呢?
#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: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]