算法设计大作业_第1页
算法设计大作业_第2页
算法设计大作业_第3页
算法设计大作业_第4页
算法设计大作业_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

纸牌游戏一小猫钓鱼

文件开始插入设计切换动画幻灯片放映亩阅视图

子到弱,

J-

新建直

粘贴7B/nS4然导"三三一」形状旧例快速样式—

幻灯片▼AAaA"A」等室专基建圜-〕▼▼

剪贴板-幻灯片字体1辆G绘图

~1X

"S多小猫钓鱼游戏规则:

2^sa♦将一科扑克牌平均分成两份,每人拿一份,甲先拿出手中的第一眼扑

克牌放在桌上,战后乙也拿出手中的第一张扑克牌,希放在手刚打出

的扑克牌的上面:就这杵两人交售出牌■e出牌时:如果某人打出的牌

与桌上某限牌的牌面相同,即可将两张相冏的牌及其中所夹的牌全部

取走,并依次放到自己手中牌的末尾,当任意一人手中的牌全都出完

时,游戏结束,好手获胜,

41*一]

5|三K二]

|^-I

6|»«5?_I

规定:甲和乙手中的牌的牌面只有1~9。

分析:

1.甲有两种操作,分别是出牌和赢牌。一》出牌就是出队,赢牌就是入队。

2.乙有两种操作,分别是出牌和赢牌。——》出牌就是出队,赢牌就是入队。

3.桌子可以看做是一个栈。每打出一张牌放到桌上就相当于入栈。

当有人赢牌的时候,依次将牌从桌上拿走,这就相当于出栈。

1.首先创建结构体用来实现队列

ftinclude<stdio.h>

#include<string.h>

#include<stdlib.o>

structqueue

(

intdata[1000];

inthead;

inttail;

);

说明:

Head用来存储对头,tail用来存储队尾。数组data用来存储队列中的元素,数组data的

大小预设为lOOOo

2.再创建一个结构体来实现栈

structstack

intdata[10];

inttop;

);

说明:top用来存储栈顶,数组data用来存储栈中的元素,大小设置为10,因为只有9个

不同的牌面。

3.定义两个队列变量ql,和q2oql用来模拟甲手中的牌,q2用来模

拟乙手中的牌,定义一个栈变量s用来模拟桌上的牌。

structqueueql,ql;

structstacks;

4.初始化队列和栈

//初始化队列ql和q2为空,此时两人手中还没有牌

ql.head二1;

ql.tail=1;

q2.head二1;

q2.tail=1;

〃初始化栈S为空,最开始的时候桌子上也没有牌

5.分两次读入甲乙最初时手中的牌

//先读入6张牌,放到甲手上

for(inti=l;i<=6;i++)

(

scanf("%d”,&ql.data[ql.tail]);〃读入一个数到队尾

ql.tail++;〃队尾往后挪一位

)

〃再读入6张牌,放到乙手中

for(inti=l;i〈=6;i++)

(

scanf("%d”,&q2.data[q2.tail]);〃读入-一个数到队尾

q2.tail++;//队尾往后挪一位

6.甲先出牌

t=ql.data[ql.head];〃甲先亮出一张牌

7判断打出的牌和桌上的牌有没有相同

flag=0;

for(inti=l;i<=top;i++)

(

if(t==s[i])

(

flag=1;

break;

}

)

8.如果flag的值为0,表示甲没能赢得桌上的牌,将打出的牌留在

桌上

if(flag==0){

〃甲此轮没有赢牌

ql.head++;〃甲已经打出一张牌,所有要把打出的牌出队

s.top++;

s.data[s.top]=t;〃再把打出的牌放到桌上,即入栈

}

9.如果flag的值为1就表明可以赢得桌上的牌,需要将赢得的牌依

次放入甲的手中

if(flage=l)

(

〃甲此轮可以赢牌

ql.head++;

ql.data[ql.tail]=t;

ql.tail++;

while(s.data[s.top]!=t)

(

ql.data[ql.tail]=s.data[s.top];

ql.tail++;

s.top——;

)

10.甲乙流程一样,判断游戏结束

while(ql.head<ql.tail&&q2.head<q2.tail)

IL输出最终谁赢得游戏

if(q2.head==q2.tail)

(

printf(“甲游戏获胜”);

printf(“甲当前手中的牌是:”);

for(inti=ql.head;i<=ql.tail;i++)

printf("%d”,ql.data[i]);

if(s.top>0)

{

printf("\n桌上的牌是:”);

for(inti=l;i〈=s.top;i++)

printf("%d",s.data[i]);

)

else

{

printf("\n桌上已经没有牌了”);

)

)

优化:定义一个大小为10的数组来记录当前桌上已经有哪些牌面就可以了

intbook[10];

将数组book[lpbook[9]初始化为0,因此刚开始桌面上一张牌也没有

for(inti=l;i<=9;i++)

book[i]=0;

如果桌上增加了一张牌面为2的牌,那就需要将book[2]设置为1,表示牌面为2的牌桌面

上已经有了,如果这张牌面为2的牌被拿走后,需要及时将book[2]重新设置问为0,表示

桌上已经没有牌面为2的牌了。

t=ql.data[ql.head];

if(book[t]==0)

(

ql.head++;

s.top++;

s.data[s.top]=t;

book[t]=1;

结果

具体相关程序代码

ttinclude<stdio.h>

ttinclude<string.h>

^include<stdlib.h>

structqueue

(

intdata[1000];

inthead;

inttail;

};

structstack

(

intdata[10];

inttop;

);

intmain()

(

structqueueql,q2;

structstacks;

intbook[10];

inti,t;

〃初始化队列

ql.head=1;

ql.tail二1;

q2.head=1;

q2.tail二1;

//初始化栈

s.top=0;

〃初始化用来标记的数组,用来标记哪些牌已经在桌上

for(i=1;i<=9;i++)

book[i]=0;

〃依次向队列插入6个数

〃甲手中的6张牌

for(i=1;i<=6;i++)

(

scanf("%d”,&ql.data[ql.tail]);

ql.tail++;

)

〃乙手上的6张牌

for(i=1;i<=6;i++)

(

scanf("%d”,&q2.data[q2.tail]);

q2.tail++;

)

while(ql.head<ql.tail&&q2.head<q2.tail)〃当队列不为空的时候执行循环

(

t=ql.data[ql.head];〃甲出一■张牌

〃判断甲当前打出的牌是否能赢牌

if(book[t]==0)〃表明桌上没有牌面为t的牌

(

〃甲此轮没有赢牌

ql.head++;〃甲已经打出一张牌,所以要把打出的牌出队

s.top++;

s.data[s.top]=t;〃再把打出的牌放到桌上,即入栈

book[t]=1;〃标记桌上现在已经有牌面为t的牌

else

{

〃甲此轮可以赢牌

ql.head++;〃甲已经打出一张牌,所以要把打出的牌出队

ql.data[ql.tail]=t;//紧接着把打出的牌放到手中牌的末尾

ql.tail++;

while(s.data[s.top]!=t)〃把桌上可以赢的牌依次放到手中牌的末尾

(

book[s.data[s.top]]=0;//取消标记

ql.data[ql.tail]=s.data[s.top];//依次放入队尾

ql.tail++;

s.top—;〃栈中少了一张牌,所以栈顶要减1

)

)

t=q2.data[q2.head];//乙出一■张牌

〃判断乙当前打出的牌是否能赢牌

if(book[t]==0)

(

q2.head++;//乙已经打出一张牌,所以要把打出的牌出队

s.top++;

s.data[s.top]=t;〃再把打出的牌放到桌上,即入栈

book[t]=1;〃标记桌上现在已经有牌面为t的牌

)

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—;〃栈中少了一张牌,所以栈顶要减1

)

)

}

if(q2.head=q2.tail)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论