首先给小哼和小哈发牌,然后按照先小哼后小哈的出牌顺序出牌。出牌时,若某人打出的牌面与桌子上的某张牌面相同,则这个人将两张相同和之间的牌全部取走,并依次放在自己手中牌的末尾。当任意一人手中的牌全部取完时,游戏结束,对手获胜。
分析:
不管小哼还是小哈,他们总共只有两种操作--出牌和赢牌,这就可以很好地用出列和入列模拟,用栈模拟桌子,能够很好地清楚桌子上的牌的情况。
#include"stdio.h"
struct queue
{ //定义队列
int data[1000];
int head;
int tail;
};
struct stack
{
//定义栈
int data[10];
int top;
};
int main()
{
struct queue q1,q2;//分别模拟小哼、小哈
struct stack s;//模拟桌子
int i,t,book[10]={0};
//初始化队列
q1.head=1;q1.tail=1;
q2.head=1;q2.tail=1;
//初始化栈
s.top=0;
//给小哼发牌
for(i=1;i<=6;i++)
{
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
//给小哈发牌
for(i=1;i<=6;i++)
{
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
while(q1.head<q1.tail&&q2.head<q2.tail)//当小哼或者小哈手上的牌打完,则判断游戏结束
{ //小哼出牌阶段
t=q1.data[q1.head];//标记小哼打出的牌
if(book[t]==0)//小哼打出的牌没有和桌子上一致,则没有赢牌
{
q1.head++;//打出的牌出列
s.data[++s.top]=t;//打出的牌入栈
book[t]=1;//记下桌子上小哼打出的牌
}
else//小哼发现打出的牌与桌子上某一张一样,则说明赢牌
{
q1.head++;//打出的牌出列
q1.data[q1.tail]=t;//打出的牌入列
q1.tail++;
//小哼收下两张一样的牌中间的牌,并将它们放到手牌后面
while(s.data[s.top]!=t)
{
book[s.data[s.top]]=0;//每收下一张牌取消标记
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
}
//收下另一张与打出的牌相同的牌,并将它们放到手牌后面
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
book[t]=0;//此时小哼打出的牌在桌子上的出现次数归零
}
if(q1.head==q1.tail) break;//如果小哼打完手中牌,则游戏结束
//小哈出牌阶段
t=q2.data[q2.head];//标记小哈打出的牌
if(book[t]==0)//小哈打出的牌没有和桌子上一致,则没有赢牌
{
q2.head++;//打出的牌出列
s.data[++s.top]=t;//打出的牌入栈
book[t]=1;//记下小哈打出的牌
}
else//小哈发现打出的牌与桌子上某一张一样,则说明赢牌
{
q2.head++; //打出的牌出列
q2.data[q2.tail]=t;//打出的牌入列
q2.tail++;
//小哈收下两张一样的牌中间的牌,并将它们放到手牌末尾
while(s.data[s.top]!=t)
{
book[s.data[s.top]]=0;//每收下一张牌就取消标记
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
//小哈收下与打出的牌相同的牌
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
book[t]=0;//此时小哈打出的牌在桌子上在桌子上的出现次数归零
}
}
if(q1.head==q1.tail)
{
printf("小哈win\n小哈当前手中的牌是:");
for(i=q2.head;i<q2.tail;i++)
printf(" %d",q2.data[i]);//依次输出小哈手上的牌
printf("\n");
if(s.top==0)//判断栈顶是否为0,从而判断桌子是否还有牌
printf("桌子上没有牌了\n");
else{
printf("桌子上的牌是:");
for(i=1;i<=s.top;i++)
printf(" %d",s.data[i]);//依次输出桌子上的牌
printf("\n");
}
}
else
{
printf("小哼win\n小哼当前手中的牌是:");
for(i=q1.head;i<q1.tail;i++)
printf(" %d",q1.data[i]);//依次输出小哼手上的牌
printf("\n");
if(s.top==0)//判断栈顶是否为0,从而判断桌子是否还有牌
printf("桌子上没有牌了\n");
else{
printf("桌子上的牌是:");
for(i=1;i<=s.top;i++)
printf(" %d",s.data[i]);//依次输出桌子上的牌
printf("\n");
}
}
return 0;
}
运行结果:
总结:
首先联想这个游戏的过程,然后利用队列和栈进行模拟此过程。代码改了很多次才改对,很多都是逻辑上没有错误,只是一点打错的错误。这点错误看了很久才看出来,这是不应该,所以以后调试代码的时候不要太急,沉下心来慢慢找。
转载请注明原文地址: https://ju.6miu.com/read-661358.html