求助数据结构作业。。。(钓鱼游戏)

任务描述

本次作业:“钓鱼”游戏的设计与实现 任务描述:给定任意 6 张牌给甲、乙,设计一个程序判定“纸牌游戏-钓鱼”的胜者。。

相关知识

游戏规则:将一副扑克牌去掉花牌和10,只留下1~9的,即扑克牌只有0-9之间的数字,平均分成二份,每人拿一份,不妨设为甲、乙二人,甲先拿出手中的第一张扑克牌放在桌上,然后乙也拿出手中的第一张扑克牌,并放在刚打出的扑克牌的上面。出牌时,如果谁打出的牌与桌上某张牌面相同,可将二张牌及中间所夹的牌全部取走,并依次放到手中牌的末尾,然后继续出牌,直到打出的牌与桌上的牌都不相同,就这样两人交替出牌。当一人手中没牌可出时,游戏结束,对手获胜。

思路提示

分析游戏中的几种操作,分别是出牌和赢牌。 每个人的手牌可以设置成队列结构,这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。桌子可设置成一个的结构,每打出一张牌放到桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌上拿走,这就相当于出栈。如果某人打出的牌与桌子上的某张牌相同,即可将两张牌以及中间所夹的牌全部取走,即全部出栈,并且加入此人的队列。当一个人手中的牌先出完时,游戏结束,对方获胜。

本次任务使用顺序栈和循环队列

根据游戏的规则,定义二个队列,一个栈,二个队列交替出队,一个队列出队时,首先要在栈中查找是否有元素和此队列出队的元素相同,在顺序栈中查找是否有某张牌时,可以参考“顺序表按照值查找序号操作算法”

    int LocateElem_Sq(SqStack L, SElemType e, int (*compare)(SElemType, SElemType)) 
    {  
      // 在顺序栈L中查找第1个值与e满足compare()的元素的位序。
      // 若找到,则返回其在L中的位序,否则返回0。
      int i;
      SElemType *p;
      i = 0;        // i的初值为第1个元素的位序
      p = L.base;   // p的初值为第1个元素的存储位置
      int length = L.top-L.base;
      while (i <length && !(*compare)(*p++, e)) 
        ++i;
      if (i < length) 
          return i;
      else 
          return -1;
    }

当一个队列出队时,若出队的元素和栈中的某个元素k相同,则赢牌,出队的元素进入自己的队列,再将栈中的元素挨个出栈直到k,每出栈一个,就插入赢牌队列,赢牌队列在将栈中牌拿完以后,必须继续出牌,当栈中没有与出队元素相同的牌时,轮到另一个队列出牌。当某队列为空时,游戏结束,非空队列代表者获胜。

编程要求

根据提示,在右侧(这是原文)编辑器 Begin - End 之间补充代码(我把要补充的代码放下面了(╥_╥)),要注意的是出牌时,如果谁打出的牌与桌上某张牌面相同,将二张牌及中间所夹的牌全部取走后,应该继续出牌,直到打出的牌与桌上的牌都不相同。

测试说明

平台会对你编写的代码进行测试:

测试输入:

2 4 1 2 5 6

3 1 3 5 6 4

预期输出:

甲:4,1,2,5,6,

乙:1,3,5,6,4,

栈:2,3,

甲:1,2,5,6,

乙:3,5,6,4,

栈:2,3,4,1,

甲:6,1,1,2,4,3,2,

乙:5,6,4,

栈:5,3,

甲:1,2,4,3,2,

乙:4,5,6,3,5,

栈:6,1,

甲:2,4,3,2,1,4,1,

乙:5,6,3,5,

栈:6,

甲:4,3,2,1,4,1,

乙:6,3,5,

栈:6,2,5,

甲:2,1,4,1,3,3,

乙:5,6,4,5,2,6,

栈:

甲:1,4,1,3,3,

乙:6,4,5,2,6,

栈:2,5,

甲:4,1,3,3,

乙:4,5,2,6,

栈:2,5,1,6,

甲:3,3,

乙:4,4,5,6,1,5,2,2,

栈:6,1,

甲:3,

乙:4,5,6,1,5,2,2,

栈:6,1,4,3,

甲:

乙:6,1,5,2,2,4,3,4,

栈:6,1,5,3,

甲:

乙:6,1,5,2,2,4,3,4,

栈:6,1,5,3,

乙获胜

输入说明 第一行输入甲手中的6张牌; 第二行输入乙手中的6张牌。

输出说明 甲先出牌,如果发现桌面上有跟刚才打出的牌的数字相同的牌,则把从相同的那张牌开始的全部牌按次序放在自己手里的牌的末尾,再继续出牌,当桌面上没有跟刚才打出的牌的数字相同的牌时,分三行输出甲手里的牌,乙手里的牌,桌上的牌;同理,轮到乙出牌后,分三行输出甲手里的牌,乙手里的牌,桌上的牌,直到有一方获胜。


开始你的任务吧,祝你成功!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int SElemType;
typedef int QElemType;

#define STACK_INIT_SIZE   100  //存储空间初始分配量 
#define STACKINCREMENT    10   //存储空间分配增量  
#define MAX_QSIZE 20           //最大队列长度+1

typedef struct{   //定义顺序栈       
	SElemType *base;     //栈的基址即栈底指针          
    SElemType *top;      //栈顶指针          
	int stacksize;       //当前分配的空间 
}SqStack; 

void InitStack(SqStack &S){ //初始化栈
	if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
		exit(OVERFLOW); //存储分配失败
    S.top=S.base;
	S.stacksize=STACK_INIT_SIZE; 
}

void DestroyStack(SqStack &S){ //销毁栈
	free(S.base);
	S.base=NULL;
	S.top=NULL;
	S.stacksize=0; 
}

void ClearStack(SqStack &S){ //清空栈 
	S.top=S.base;
}

int StackEmpty(SqStack S){  //判断栈是否为空
	if(S.top==S.base)
		return TRUE;
	else
		return FALSE; 	
}

int StackLength(SqStack S){  //返回栈的元素个数 
	// 请在这里补充代码,完成本关任务
   /********** Begin **********/ 


   /********** End **********/
}

int GetTop(SqStack S,SElemType &e){ //求栈顶元素值
	if(S.top>S.base){
		e=*(S.top-1);
		return OK;
	}else
		return ERROR;
}

void Push(SqStack &S,SElemType e){ //进栈
	if(S.top-S.base>=S.stacksize){ // 栈满,追加存储空间
		S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
		if(!S.base)
			exit(OVERFLOW); // 存储分配失败
		S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
	}
	*(S.top)++=e; 
}

int Pop(SqStack &S,SElemType &e){  //出栈
	// 请在这里补充代码,完成本关任务
    /********** Begin **********/ 

   
    /********** End **********/
}

void StackTraverse(SqStack S,void(*visit)(SElemType)){  //遍历栈元素
	while(S.top>S.base)
		visit(*S.base++);
	printf("\n");
}


struct SqQueue{  //定义顺序队列
	QElemType *base; //初始化的动态分配存储空间
    int front; // 头指针,若队列不空,指向队列头元素
    int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
};

void InitQueue(SqQueue &Q){ //初始化队列
	Q.base=(QElemType *)malloc(MAX_QSIZE*sizeof(QElemType));
    if(!Q.base) // 存储分配失败
		exit(OVERFLOW);
    Q.front=Q.rear=0;
}

void DestroyQueue(SqQueue &Q){ //销毁循环队列Q 
    // 请在这里补充代码,完成本关任务
    /********** Begin **********/ 

   
    /********** End **********/
}

void ClearQueue(SqQueue &Q){    //将Q清为空循环队列
    Q.front=Q.rear=0;
}

int QueueEmpty(SqQueue Q){   //若循环队列Q为空队列,则返回TRUE;否则返回FALSE
	if(Q.front==Q.rear)    //队列空的标志
		return TRUE;  
    else
        return FALSE;
}

int QueueLength(SqQueue Q){     //返回Q的元素个数,即循环队列的长度
	// 请在这里补充代码,完成本关任务
    /********** Begin **********/ 

   
    /********** End **********/
}

int GetHead(SqQueue Q,QElemType &e){   //返回Q的队头元素
	if(Q.front==Q.rear) // 队列空
		return ERROR;
    e=Q.base[Q.front];
        return OK;
}

int EnQueue(SqQueue &Q,QElemType e){    //入队
	// 请在这里补充代码,完成本关任务
    /********** Begin **********/ 

   
   
    /********** End **********/
}
 
int DeQueue(SqQueue &Q,QElemType &e){    //出队
	if(Q.front==Q.rear) // 队列空
		return ERROR;
    e=Q.base[Q.front];
    Q.front=(Q.front+1)%MAX_QSIZE;
    return OK;
}

void QueueTraverse(SqQueue Q,void(*vi)(QElemType)){   //从队头到队尾依次对队列Q中每个元素调用函数vi()
	int i;
    i=Q.front;
    while(i!=Q.rear){
		vi(Q.base[i]);
        i=(i+1)%MAX_QSIZE;
	}
    printf("\n");
}

int LocateElem_Sq(SqStack L, SElemType e, int (*compare)(SElemType, SElemType)){  
  //在顺序栈L中查找第1个值与e满足compare()的元素的位序。
  //若找到,则返回其在L中的位序,否则返回0。
	int i;
    SElemType *p;
    i = 0;        //i的初值为第1个元素的位序
    p = L.base;   //p的初值为第1个元素的存储位置
    int length = L.top-L.base;
    while (i <length && !(*compare)(*p++, e)) 
		++i;
    if (i < length) 
		return i;
    else 
	    return -1;
} //LocateElem_Sq

void output(QElemType s){
	printf("%d,",s);	   
}

void input(QElemType &s){ 	
	scanf("%d",&s);	
}

void outputS(SElemType s){
	printf("%d,",s);	   
}

void inputS(SElemType &s){ 	
	scanf("%d",&s);	
}

int comp(SElemType a, SElemType b){
	if(a>b)
		return 0;
	else
		if(a == b)
			return 1;
		else
			return 0;
}


int  main(){
	SqQueue  q1,q2;            //定义二个队列,代表甲、乙手中的牌
	SqStack  s;                //定义一个栈,代表桌面上的牌
	int i,t,x,n;
	InitQueue(q1);
	InitQueue(q2);
	InitStack(s);	
	for(i=1;i<=6;i++)
	{
		scanf("%d",&t);
    	EnQueue(q1,t);
	}
	for(i=1;i<=6;i++)
	{
		scanf("%d",&t);
		EnQueue(q2,t);
	}
   // 请在这里补充代码,完成本关任务
   /********** Begin **********/ 






	/********** End **********/	
    return 0;
}


救命˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚有没有大佬,救救可怜的大学生吧!!!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值