纸牌游戏——⼩猫钓鱼
⼀、游戏规则
将⼀副扑克牌平均分成两份,每⼈拿⼀份。⼩哼先拿出⼿中的第⼀张扑克牌放在桌上,然后⼩哈也拿出⼿中的第⼀张扑克牌,并放在⼩哼刚打出的扑克牌的上⾯,就像这样两⼈交替出牌。出牌时,如果某⼈打出的牌与桌上某张牌的牌⾯相同,即可将两张相同的牌及其中间所夹的牌全部取⾛,并依次放到⾃⼰⼿中牌的末尾。当任意⼀⼈⼿中的牌全部出完时,游戏结束,对⼿获胜。(⼩哼和⼩哈⼿中牌的牌⾯只有1~9)
⼆、题⽬分析
⼩哼和⼩哈有两种操作,分别是出牌和赢牌,这恰好对应队列的两个操作,出牌就是出队,赢牌就是⼊队。
桌⼦就是⼀个栈,每打出⼀张牌放到桌上就相当于⼊栈。当有⼈赢牌的时候,依次将牌从桌上拿⾛,这就相当于出栈。
枚举桌上的每⼀张牌,如果某⼈打出的牌与桌⼦上的某张牌相同,即可将两张牌以及中间所夹的牌全部取⾛。
综上所述,我们需要两个队列、⼀个栈来模拟整个游戏。
1,⾸先我们来创建⼀个结构体⽤来实现队列:
struct queue{
int data[1000]; //数组data⽤来存储队列中的元素
int head; //head⽤来存储队头
int tail; //tail⽤来存储队尾
};
2,再创建⼀个结构体⽤来实现栈:
struct stack{
int data[10]; //数组data⽤来存储栈中的元素
int top; //top⽤来存储栈顶
};
3,定义两个队列变量q1和q2:
struct queue q1,q2; //q1⽤来模拟⼩哼⼿中的牌,q2⽤来模拟⼩哈⼿中的牌
struct stack s; //栈变量s⽤来模拟桌上的牌
4,初始化队列和栈:
/*初始化队列q1和q2为空,因为此时两⼈⼿中都还没有牌*/
q1.head=1;q1.tail=1;
q2.head=1;q2.tail=1;
5,读⼊⼩哼和⼩哈最初时⼿中的牌,分两次读⼊,每次读⼊6个数,分别插⼊q1和q2中:
for(i=1;i<=6;i++){ //先读⼊6张牌,放到⼩哼⼿上
scanf("%d",&q1.data[q1.tail]); //读⼊⼀个数到队尾
q1.tail++; //队尾往后挪⼀位
}
for(i=1;i<=6;i++){ //再读⼊6张牌,放到⼩哈⼿上
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
6,游戏开始,⼩哼先出牌:
t=q1.data[q1.head]; //⼩哼先亮出⼀张牌
7,枚举桌上的每⼀张牌与t⽐较(判断桌上的牌与t有没有相同的):
if(flag==0)
{
q1.head++; //⼩哼已经打出⼀张牌,所以要把打出的牌出队
s.p]=t; //再把打出的牌放到桌上,即⼊栈
}
8,如果flag的值为1就标明⼩哼可以赢得桌上的牌,所以需要将赢得的牌依次放⼊⼩哼的⼿中:
if(flag==1) //⼩哼此轮可以赢牌
q1.data[q1.tail]=t; //因为此轮可以赢牌,所以紧接着把刚才打出的牌⼜放到⼿中牌的末尾
q1.tail++;
while(s.p]!=t) //把桌上可以赢得的牌依次放到⼿中牌的末尾
{
q1.data[q1.tail]=s.p]; //依次放⼊队尾
q1.tail++;
}
}
9,⾄此,⼩哼出牌的所有阶段就模拟完了(⼩哈类似)。接下来我们要判断游戏如何结束:即只要两⼈中有⼀个⼈的牌⽤完了游戏就结束。因此我们需要在模拟两⼈出牌代码的外⾯加⼀个while循环来判断:
博客为什么没人用了while(q1.head<q1.tail && q2.head<q2.tail){ //当队列不为空的时候执⾏循环
10,输出谁最终赢得了游戏,以及游戏结束后获胜者⼿中的牌和桌上的牌。(以⼩哼为例)
if(q2.head==q2.tail)//如果⼩哼获胜那么⼩哈⼿中⼀定没有牌了(队列q2为空)
{
printf("⼩哼win\n");
printf("⼩哼当前⼿中的牌是");
for(i=q1.head;i<=q1.tail-1;i++)
printf(" %d",q1.data[i]);
p>0) //如果桌上有牌则依次输出桌上的牌
{
printf("\n桌上的牌是");
for(i=1;i<=s.top;i++)
printf(" %d",s.data[i]);
}
else
printf("\n桌上已经没有牌了");
}
三、完整代码如下
#include<stdio.h>
struct queue{
int data[1000]; //数组data⽤来存储队列中的元素
int head; //head⽤来存储队头
int tail; //tail⽤来存储队尾
};
struct stack{
int data[10]; //数组data⽤来存储栈中的元素
int top; //top⽤来存储栈顶
};
int main()
{
struct queue q1,q2; //q1⽤来模拟⼩哼⼿中的牌,q2⽤来模拟⼩哈⼿中的牌
struct stack s; //栈变量s⽤来模拟桌上的牌
int book[10];
int i,t;
/*初始化队列q1和q2为空,因为此时两⼈⼿中都还没有牌*/
q1.head=1;q1.tail=1;
q2.head=1;q2.tail=1;
for(i=1;i<=9;i++)
book[i]=0;
for(i=1;i<=6;i++){ //先读⼊6张牌,放到⼩哼⼿上
scanf("%d",&q1.data[q1.tail]); //读⼊⼀个数到队尾
q1.tail++; //队尾往后挪⼀位
}
for(i=1;i<=6;i++){ //再读⼊6张牌,放到⼩哈⼿上
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)
s.p]=t; //再把打出的牌放到桌上,即⼊栈
book[t]=1;
}
else
{
q1.head++; //⼩哼已经打出⼀张牌,所以要把打出的牌出队
q1.data[q1.tail]=t; //因为此轮可以赢牌,所以紧接着把刚才打出的牌⼜放到⼿中牌的末尾 q1.tail++;
while(s.p]!=t) //把桌上可以赢得的牌依次放到⼿中牌的末尾
{
book[s.p]]=0; //取消标记
q1.data[q1.tail]=s.p]; //依次放⼊队尾
q1.tail++;
}
book[s.p]]=0;
q1.data[q1.tail]=s.p];
q1.tail++;
}
if(q1.head==q1.tail) break;
t=q2.data[q2.head];
if(book[t]==0)
{
q2.head++;
s.p]=t;
book[t]=1;
}
else
{
q2.head++;
q2.data[q2.tail]=t;
q2.tail++;
while(s.p]!=t)
{
book[s.p]]=0;
q2.data[q2.tail]=s.p];
q2.tail++;
}
book[s.p]]=0;
q2.data[q2.tail]=s.p];
q2.tail++;
}
}
if(q2.head==q2.tail)//如果⼩哼获胜那么⼩哈⼿中⼀定没有牌了(队列q2为空)
{
printf("⼩哼win\n");
printf("⼩哼当前⼿中的牌是");
for(i=q1.head;i<=q1.tail-1;i++)
printf(" %d",q1.data[i]);
p>0) //如果桌上有牌则依次输出桌上的牌
{
printf("\n桌上的牌是");
for(i=1;i<=s.top;i++)
printf(" %d",s.data[i]);
}
else
printf("\n桌上已经没有牌了");
}
else
{
printf("⼩哈win\n");
printf("⼩哈当前⼿中的牌是");
for(i=q2.head;i<=q2.tail-1;i++)
printf(" %d",q2.data[i]);
p>0)
{
printf("\n桌上的牌是");
for(i=1;i<=s.top;i++)
printf(" %d",s.data[i]);
}
else
printf("\n桌上已经没有牌了"); }
return0;
}
⼩猫钓鱼
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论