//////////////////////////////////////////////////////////////////////////
//
// FileName : game1.cpp
// Creator : 刘劲竹
// Date : 2008-7-25
// Comment : 空当接龙文件
// Edition : 1.0.7.25
//
//////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iomanip>
#include <windows.h>
using namespace std;
/**
* 定义花色枚举
*/
enum EMODE
{ //定义花色
HEARTS = 003, ///红心
DIAMONDS = 004,///方块
CLUBS = 005, ///梅花
SPADE = 006 ///黑桃
};
/**
* 定义扑克结构体
*/
struct SSORT
{ //定义扑克。
int color; ///每张扑克的花色
char number; ///每张扑克的号码
int figure; ///每张扑克所对应的数字
int b; ///是否存在
};
///定义扑克
int g_nCard[53];
///定义收集扑克的四个盒子
SSORT g_sHEARTS_BOX, g_sDIAMONDS_BOX, g_sCLUBS_BOX, g_sSPADE_BOX;
///临时的四个格子
SSORT g_sTemp_Box[4];
///临时格子有几个是空的
int g_nNum = 4;
///定义八个列,存放八列扑克。
SSORT g_sFirstCard[20], g_sSecondCard[20], g_sThirdCard[20], g_sFourthCard[20];
SSORT g_sFifthCard[20], g_sSixthCard[20], g_sSeventhCard[20], g_sEighthCard[20];
///标示每列当前的长度
int g_nl1 = 0, g_nl2 = 0, g_nl3 = 0, g_nl4 = 0;
int g_nl5 = 0, g_nl6 = 0, g_nl7 = 0, g_nl8 = 0;
///最长一列的长度
int g_nLength = 0;
///各个符号
char g_cFigure[] = {'0','K', 'A', '2', '3', '4', '5', '6', '7', '8', '9', 'S', 'J', 'Q'};
/**
* @brief 随机产生一局新游戏
*/
bool Deal(void)
{ //发牌
srand(time(NULL));
g_nCard[0] = 0;
int card, i, length = 0; ///card 产生的随机数用来判断,length用来标记有用的牌的张数。
for ( ; ; )
{
i = 1;
if (52 == length)
{ //查看是否产生够52张扑克。
break;
}
card = rand() % 52 + 1;
for ( ; i <= length; i++)
{ //判断是否已经产生过此数字,是就跳过
if (g_nCard[i] == card)
{
break;
}
}
if (i > length)
{
g_nCard[i] = card;
length++;
}
}
return true;
}
/**
* @brief 根据传入的数字返回列名
* @param Row 所属列
* @return SSORT* 当前格子的名称
*/
SSORT* NumToName(int Row)
{
if (1 == Row)
{
return g_sFirstCard;
}
if (2 == Row)
{
return g_sSecondCard;
}
if (3 == Row)
{
return g_sThirdCard;
}
if (4 == Row)
{
return g_sFourthCard;
}
if (5 == Row)
{
return g_sFifthCard;
}
if (6 == Row)
{
return g_sSixthCard;
}
if (7 == Row)
{
return g_sSeventhCard;
}
if (8 == Row)
{
return g_sEighthCard;
}
else
{
return NULL;
}
}
/**
* @brief 最大数字
* @param Row 所属列
* @return SSORT 当前格子的名称
*/
SSORT MaxNumToName(int Row)
{
if (9 == Row)
{
return g_sTemp_Box[0];
}
if (10 == Row)
{
return g_sTemp_Box[1];
}
if (11 == Row)
{
return g_sTemp_Box[2];
}
if (12 == Row)
{
return g_sTemp_Box[3];
}
//return g_sTemp_Box[0];
}
/**
* @brief 把随机产生的数,分别赋值给每一列
*/
bool Evaluate(void)
{ //赋值
int nTemp;
for (int i = 1; i <= 52; i++)
{
nTemp = (g_nCard[i] - 1) / 13 + 3;
if (1 == i % 8)
{ //赋值给第一列
g_sFirstCard[++g_nl1].number = g_cFigure[g_nCard[i] % 13 + 1];
g_sFirstCard[g_nl1].color = nTemp;
g_sFirstCard[g_nl1].figure = g_nCard[i] % 13 + 1;
if (g_sFirstCard[g_nl1].figure == 1)
{ //K赋值为13
g_sFirstCard[g_nl1].figure = 14;
}
g_sFirstCard[g_nl1].b = 1;
if (g_nLength < g_nl1)
{
g_nLength = g_nl1;
}
}
if (2 == i % 8)
{ //赋值给第二列
g_sSecondCard[++g_nl2].number = g_cFigure[g_nCard[i] % 13 + 1];
g_sSecondCard[g_nl2].color = nTemp;
g_sSecondCard[g_nl2].figure = g_nCard[i] % 13 + 1;
if (g_sSecondCard[g_nl2].figure == 1)
{
g_sSecondCard[g_nl2].figure = 14;
}
g_sSecondCard[g_nl2].b = 1;
if (g_nLength < g_nl2)
{
g_nLength = g_nl2;
}
}
if (3 == i % 8)
{ //赋值给第三列
g_sThirdCard[++g_nl3].number = g_cFigure[g_nCard[i] % 13 + 1];
g_sThirdCard[g_nl3].color = nTemp;
g_sThirdCard[g_nl3].figure = g_nCard[i] % 13 + 1;
if (g_sThirdCard[g_nl3].figure == 1)
{
g_sThirdCard[g_nl3].figure = 14;
}
g_sThirdCard[g_nl3].b = 1;
if (g_nLength < g_nl3)
{
g_nLength = g_nl3;
}
}
if (4 == i % 8)
{ //赋值给第四列
g_sFourthCard[++g_nl4].number = g_cFigure[g_nCard[i] % 13 + 1];
g_sFourthCard[g_nl4].color = nTemp;
g_sFourthCard[g_nl4].figure = g_nCard[i] % 13 + 1;
if (g_sFourthCard[g_nl4].figure == 1)
{
g_sFourthCard[g_nl4].figure = 14;
}
g_sFourthCard[g_nl4].b = 1;
if (g_nLength < g_nl4)
{
g_nLength = g_nl4;
}
}
if (5 == i % 8)
{ //赋值给第五列
g_sFifthCard[++g_nl5].number = g_cFigure[g_nCard[i] % 13 + 1];
g_sFifthCard[g_nl5].color = nTemp;
g_sFifthCard[g_nl5].figure = g_nCard[i] % 13 + 1;
if (g_sFifthCard[g_nl5].figure == 1)
{
g_sFifthCard[g_nl5].figure = 14;
}
g_sFifthCard[g_nl5].b = 1;
if (g_nLength < g_nl5)
{
g_nLength = g_nl5;
}
}
if (6 == i % 8)
{ //赋值给第六列
g_sSixthCard[++g_nl6].number = g_cFigure[g_nCard[i] % 13 + 1];
g_sSixthCard[g_nl6].color = nTemp;
g_sSixthCard[g_nl6].figure = g_nCard[i] % 13 + 1;
if (g_sSixthCard[g_nl6].figure == 1)
{
g_sSixthCard[g_nl6].figure = 14;
}
g_sSixthCard[g_nl6].b = 1;
if (g_nLength < g_nl6)
{
g_nLength = g_nl6;
}
}
if (7 == i % 8)
{ //赋值给第七列
g_sSeventhCard[++g_nl7].number = g_cFigure[g_nCard[i] % 13 + 1];
g_sSeventhCard[g_nl7].color = nTemp;
g_sSeventhCard[g_nl7].figure = g_nCard[i] % 13 + 1;
if (g_sSeventhCard[g_nl7].figure == 1)
{
g_sSeventhCard[g_nl7].figure = 14;
}
g_sSeventhCard[g_nl7].b = 1;
if (g_nLength < g_nl7)
{
g_nLength = g_nl7;
}
}
if (0 == i % 8)
{ //赋值给第八列
g_sEighthCard[++g_nl8].number = g_cFigure[g_nCard[i] % 13 + 1];
g_sEighthCard[g_nl8].color = nTemp;
g_sEighthCard[g_nl8].figure = g_nCard[i] % 13 + 1;
if (g_sEighthCard[g_nl8].figure == 1)
{
g_sEighthCard[g_nl8].figure = 14;
}
g_sEighthCard[g_nl8].b = 1;
if (g_nLength < g_nl8)
{
g_nLength = g_nl8;
}
}
}//for (int i = 1;
return true;
}
/**
* @brief 判断是否可以移动
* @param nTemp 数字大小
* @param color 花色
* @return 有没有移动到收集格子。有true,没有false。
*/
bool IsMove(int nTemp, int color)
{
if (3 == color)
{
if (nTemp == g_sHEARTS_BOX.figure % 13 + 1)
{
g_sHEARTS_BOX.b = 1;
g_sHEARTS_BOX.color = color;
g_sHEARTS_BOX.figure++;
g_sHEARTS_BOX.number = g_cFigure[g_sHEARTS_BOX.figure % 13];
return true;
}
return false;
}
if (4 == color)
{
if (nTemp == g_sDIAMONDS_BOX.figure % 13+ 1)
{
g_sDIAMONDS_BOX.b = 1;
g_sDIAMONDS_BOX.color = color;
g_sDIAMONDS_BOX.figure++;
g_sDIAMONDS_BOX.number = g_cFigure[g_sDIAMONDS_BOX.figure % 13];
return true;
}
return false;
}
if (5 == color)
{
if (nTemp == g_sCLUBS_BOX.figure % 13+ 1)
{
g_sCLUBS_BOX.b = 1;
g_sCLUBS_BOX.color = color;
g_sCLUBS_BOX.figure++;
g_sCLUBS_BOX.number = g_cFigure[g_sCLUBS_BOX.figure % 13];
return true;
}
return false;
}
if (6 == color)
{
if (nTemp == g_sSPADE_BOX.figure % 13+ 1)
{
g_sSPADE_BOX.b = 1;
g_sSPADE_BOX.color = color;
g_sSPADE_BOX.figure++;
g_sSPADE_BOX.number = g_cFigure[g_sSPADE_BOX.figure % 13];
return true;
}
return false;
}
else
return false;
}
/**
* @brief 判断是否有扑克可以放在盒子里
* @return 有没有移动到收集格子。有true,没有false。
*/
bool MoveToBox(void)
{
int index = 0;
for ( ; ; )
{
if ((g_nl1 != 0) && IsMove(g_sFirstCard[g_nl1].figure, g_sFirstCard[g_nl1].color))
{
g_sFirstCard[g_nl1].b = 0;
g_nl1--;
index = 1;
}
else if ((g_nl2 != 0) && IsMove(g_sSecondCard[g_nl2].figure, g_sSecondCard[g_nl2].color))
{
g_sSecondCard[g_nl2].b = 0;
g_nl