⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kcard.cpp

📁 在金山软件公司做的练习,纸牌游戏!多谢
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////
//
// FileName	: Kcard.cpp
// Creator	: 黄    坚
// Date		: 2007-7-23
// Comment	: 当空接龙游戏
//////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "malloc.h"
#include "windows.h"
#include <iostream.h> 
#define Size 4
#define  CARDNUMBER  52						// 总共52张牌
#define  ROW  20							// 行数
#define	 COLUMN    8						// 游戏一共8列


// 牌的结构
struct Card 
{
	int suit;		// 牌色
	int  face;		// 牌面的大小
};

// 把牌发到对应的盒子里面
struct CardBox 
{
	bool isFill;		 // 用来记录该位置是否已经存了牌
	struct Card card;	//牌
};
//游戏开始,对游戏界面进行初始化
bool  GameStart(CardBox tempCard[],CardBox cardRecycle[],CardBox cardSentBox[][COLUMN]);   

//随机生成一张牌
Card* CreateOneCard();    

//显示游戏界面
bool DisplayGame(CardBox cardBuffer[],CardBox cardRecycle[],CardBox CardArr[ROW][COLUMN]);

//显示缓冲区和回收区
bool  DisplayTempAndRecycle(CardBox cardTemp[],CardBox cardRecycle[]); //显示缓冲区和回收区

//对一张牌花色和大小进行显示 
bool  ShowCard(Card &card);

//对牌进行操作
bool CardOperation(int choose,CardBox cardBuffer[Size],CardBox cardRecycle[Size],CardBox cardSentBox[ROW][COLUMN]);

//把牌移动到缓冲区
bool CardBox_To_Buffer(int x,int y,CardBox cardBuffer[],CardBox cardRecycle[],CardBox cardSentBox[ROW][COLUMN]);

bool Buffer_To_CardBox(int x,int y,CardBox cardBuffer[Size],CardBox cardRecycle[],CardBox cardSentBox[ROW][COLUMN]);

//游戏操作帮助
int getOperation();

//////////////////////////////////////////////////////////////////////////
int   main(int argc, char* argv[])
{
	srand(time(NULL));		 

	CardBox cardBuffer[Size];	// 缓冲区
	CardBox cardRecycle[Size];	// 回收区
	CardBox carSentdBox[ROW][COLUMN];   //放牌的盒子,也就是发的牌放到对应的位置	
	GameStart(cardBuffer,cardRecycle,carSentdBox);
	return true;
}

//////////////////////////////////////////////////////////////////////////
Card* CreateOneCard()
	{
		Card *card = (Card *)malloc(sizeof(Card)); 
		card->suit = rand()%4 + 1;               //随机1---4,以后用1---4转化为相应的花色
		card->face = rand()%13 + 1;			    // 随机生成牌的大小 11---13将来转化为J Q K
		return card;
		
	}
//////////////////////////////////////////////////////////////////////////
bool ShowCard(Card &card)
{
	switch(card.suit)// 显示花色
	{	
	case 1:
		printf("\x06");		// 4黑桃
		break;
	case 2:
		printf("\x03");		// 1红心
		break;
	case 3:
		printf("\x05");		// 3梅花
		break;
	case 4:
		printf("\x04");		// 2方块
		break;
	default:
		break;
	}	
	
	switch(card.face)
	{
	case 11:
		printf("J\t");		
		break;
	case 12:
		printf("Q\t");		
		break;
	case 13:
		printf("K\t");		
		break;
	default:
		printf("%d\t",card.face);
		break;
	}		
	return true;
}
//////////////////////////////////////////////////////////////////////////
bool GameStart(CardBox cardBuffer[Size],CardBox cardRecycle[Size],CardBox cardSentBox[ROW][COLUMN])
{
	
	Card temp;    //用
	int i, j ,count = 1;
	//下面的for循环对缓冲区和回收的盒子进行初始
	for(i=0;i<4;i++)  
	{
		cardBuffer[i].isFill = false;    //false表示里面没有牌
		cardRecycle[i].isFill = false;
	}	

	//下面的循环是对放每张牌的位置进行初始化
	for (i=0;i<ROW;i++)		 
		for ( j=0;j<COLUMN;j++)		
			cardSentBox[i][j].isFill = false;
		
				

	//CardBox *pCardArr = (CardBox *)cardSentBox;
	
	//先打印前面的6行
	for(i=0;i<6;i++)  //6行
	{
		for (j=0;j<COLUMN;j++)//for (j=0;j<COLUMN;j++)	// 8 列
		{	
			while (true)
			{
				temp  = *CreateOneCard();					//随机生成一张牌
				for (int k=0;k < i*COLUMN+j;k++)   // 判断与前面的牌是否有相同的,如果相同继续生成
				{
					if((*((CardBox *)cardSentBox+k)).card.suit == temp.suit &&
					  (*((CardBox *)cardSentBox+k)).card.face	== temp.face)
						break;
				}
				if(k == i*COLUMN+j)		// 当前面没有与当前重复的牌时		  
					break;
			}
			cardSentBox[i][j].card  = temp;
			cardSentBox[i][j].isFill = true;
			//cout<<cardSentBox[i][j].card.suit<<cardSentBox[i][j].card.face<<endl;
		}
		
	}
	//再打印第7行的前四个,判断其与前面6*8个相同与否
	for (j=0;j<4;j++)
	{
		while (true)
			{
				temp  = *CreateOneCard();
				for (int k=0;k<48+j;k++) // 判断是否与已经生成的扑克相同
				{
					if((*((CardBox *)cardSentBox+k)).card.suit == temp.suit &&
						(*((CardBox *)cardSentBox+k)).card.face	== temp.face)
						break;
				}
				if(k == i*COLUMN+j)
					break;
			}
		cardSentBox[i][j].card  = temp;
		cardSentBox[i][j].isFill = true;
	}

	DisplayGame(cardBuffer,cardRecycle,cardSentBox);
	while (true)
	{
		CardOperation(getOperation(),cardBuffer,cardRecycle,cardSentBox);	
	}
	
	return true;

}
//////////////////////////////////////////////////////////////////////////
bool DisplayGame(CardBox cardBuffer[Size],CardBox cardRecycle[Size],CardBox CardArr[ROW][COLUMN])
{
	DisplayTempAndRecycle(cardBuffer,cardRecycle);  //先打印缓冲区

	for (int i=0;i<ROW;i++)
	{
		for (int j=0;j<COLUMN;j++)
		{
			if (CardArr[i][j].isFill)//如果放牌的位置不为空,就打印出来
			{
				ShowCard(CardArr[i][j].card);
			}
			else
				printf(" \t");
		}
		printf("\n");
	}
	
	return true;
}
//////////////////////////////////////////////////////////////////////////
//显示缓冲区和回收区
bool DisplayTempAndRecycle(CardBox cardTemp[Size],CardBox cardRecycle[Size])
{
	int i;
	printf("临时缓冲区:");
	for(i=0;i<4;i++)
	{
		if(cardTemp[i].isFill)
		{
			ShowCard(cardTemp[i].card);
		}			
		else
			printf("[ ]");
	}
	printf("\t\t");
	printf("回收区:");
	for(i=0;i<4;i++)
		if(cardRecycle[i].isFill)
		{
			ShowCard(cardRecycle[i].card);
		}			
		else
			printf("[ ]");
		printf("\n");
	
	return true;
}

int getOperation()
{
	int op ;
	printf("选择你要操作:\n");
	printf("1.牌到缓冲区\n");
	printf("2.缓冲区到牌阵\n");
	printf("3.牌到回收区\n");
	printf("4.牌列到牌列\n");
	printf("5.帮助\n");
	printf("6.退出\n");
	cin>>op;
	return op;
}

bool CardOperation(int choose,CardBox cardBuffer[Size],CardBox cardRecycle[Size],CardBox cardSentBox[ROW][COLUMN])
{
	switch(choose)
	{
	case 1:	
		int x,y;
		printf("请输入要移动的牌和移动的位置(如1 3)也就是把第一列的最后一张牌放到1号缓冲区:\n");
LABEL:		scanf("%d%d",&x,&y);
		if (x>8 || x<1 || y>4 || y<1)
		{
			cout<<"你输入值的范围不对,请重新输入!"<<endl;
			goto LABEL;
		}
		CardBox_To_Buffer(x,y,cardBuffer,cardRecycle,cardSentBox);
		break;


	case 2:	
			printf("请输入要移动的牌和移动的位置(如1 3)也就是把1号缓冲区的牌放到第3列的最后:\n");
LABEL2:		scanf("%d%d",&x,&y);
			if (x>4 || x<1 || y>9 || y<1)
			{
				cout<<"你输入值的范围不对,请重新输入!"<<endl;
				goto LABEL2;
			}
			Buffer_To_CardBox(x,y,cardBuffer,cardRecycle,cardSentBox);
			break;
	}
	return true;
}

//把牌暂时存放在缓冲区中
bool CardBox_To_Buffer(int x,int y,CardBox cardBuffer[Size],CardBox cardRecycle[],CardBox cardSentBox[ROW][COLUMN])
{
	
	int i;
	for(i=0;i<20;i++)
		if (cardSentBox[i][x-1].isFill == false)	
			break;
	if (cardBuffer[y-1].isFill ==true)
			cout<<"你要放的缓冲区已经有牌存在!"<<endl;
	else
	{		system("cls");
			cout<<cardSentBox[i-2][x-1].card.suit<<cardSentBox[i-2][x-1].card.face<<endl;	
			cardSentBox[i-1][x-1].isFill = false;
			cardBuffer[y-1].card= cardSentBox[i-1][x-1].card;
			cardBuffer[y-1].card = cardSentBox[i-1][x-1].card;
			cardBuffer[y-1].isFill = true;
			DisplayGame(cardBuffer,cardRecycle,cardSentBox);
	}
	return true;
}

//把缓冲区中中的牌存放在指定的牌阵中
bool Buffer_To_CardBox(int x,int y,CardBox cardBuffer[Size],CardBox cardRecycle[Size],CardBox cardSentBox[ROW][COLUMN])
 {
 	int i;
 
 	if (cardBuffer[x-1].isFill == false)
 			cout<<"你要取的缓冲区没有牌存在!"<<endl;
	for(i=0;i<20;i++)
	{
 		if (cardSentBox[i][y-1].isFill == false)	
 			break;
	}
	if (((cardSentBox[i][y-1].card.suit + cardSentBox[i-1][y-1].card.suit != 6) ||
		(cardSentBox[i][y-1].card.suit + cardSentBox[i-1][y-1].card.suit != 4)) &&
		 cardSentBox[i][y-1].card.face+1 != cardSentBox[i-1][y-1].card.face)
	{
		system("cls");
		cardSentBox[i][y-1].card = cardBuffer[x-1].card;
		cardSentBox[i][y-1].isFill = true;
		cardBuffer[x-1].isFill = false;
 		DisplayGame(cardBuffer,cardRecycle,cardSentBox);
 	}
	else
	{
		printf("对不起:不能这样移牌!");
		DisplayGame(cardBuffer,cardRecycle,cardSentBox);
				return false;
		
	}
 	return true;
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -