📄 kcard.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 + -