#include "stdafx.h"
//定义点
struct Point
{
int x ;
int y ;
};
//定义棋子节点,用于悔棋
struct chessNode
{
Point point;//棋子的棋盘位置
int status;//下子者 0为电脑 ,1为棋手,2为空白
int win[2][252];//用于存储当前节点的胜利组合数目
};
#define WHITECHESS 0 //白棋
#define BLACKCHESS 1 //黑棋
#define BLANK 2 //空白
class chess
{
private:
//定义棋手和电脑的棋盘用于存放
bool blackChessBoard[11][11][252];
bool whiteChessBoard[11][11][252];
//分别用于存放电脑和棋手在各点的得分
int whiteChessGrade[11][11],blackChessGrade[11][11];
//计算在每种组合中电脑或棋手分别占据几粒棋子
//0代表黑棋,1代表白棋
int win[2][252];
//定义是否为第一步棋
bool start;
//记录电脑和棋手的下棋步数
int whiteChessCount;
int blackChessCount;
//用以进行当前下棋者的转换 (黑棋<-> 白棋)
bool white,black;
//用于存放所有棋子的状态,位置和下子者,用于悔棋只用
chessNode allChess[122];
//是否游戏结束
bool gameover;
//获胜者 0为白棋 1为黑棋 2为游戏未结束 -1为平局
int winner;
/*************功能函数**************************/
//把棋盘初始化为空白
int initBoard();
//初始化分数
void initialMark();
//初始化获胜的组合数
int initWinCompages();
//记录所下棋子的状态
void recordChessStatus(int horizontal , int vertical , int player);
//计算某个胜利组合中已经被某方占据的棋子数放到win[2][252]的数组中去, 参数分别为水平,竖直位置,最后是记录落子的是电脑还是棋手
int compute(int horizontal , int vertical , int player);
public:
//定义棋盘
int Board[11][11];
//构造函数
chess();
//电脑通过计算确定下棋位置
int whitePlayChess(int horizontal , int vertical);
//棋手在棋盘中落子
int blackPlayChess(int horizontal , int vertical);
//悔棋,只能对己方上一步进行悔棋
int contritionChess(int player);
//判断是否已经游戏结束
bool gameOver();
//取得获胜者 0为电脑 1为棋手 2为棋局未结束 -1为平局
int getWinner();
// 决定电脑的下棋位置 返回落子的坐标
Point decidePosition(void);
//下棋者转换
bool roleSwitch(void);
//得到棋手落子的步数
int getBlackChessCount()
{
return blackChessCount;
}
//得到电脑落子的步数
int getWhiteChessCount()
{
return whiteChessCount;
}
};
/*****************************************************功能函数****************************************/
/*************初始化函数************************/
//把棋盘初始化为空白
int chess::initBoard()
{
int i=0;
//把棋盘初始化为空格
for( i =0 ; i < 11 ;i++)
{
for(int j = 0 ; j < 11 ; j++)
Board[i][j] = 2;
}
//初始化棋局
for(i = 0 ; i<122 ; i++)
{
allChess[i].point.x = -1;
allChess[i].point.y = -1;
allChess[i].status = BLANK ;
}
for(i = 0 ; i< 2 ; i++)
for(int j = 0 ; j < 252 ; j++)
win[i][j] = 0;
for(i = 0 ; i <11; i++)
for(int j = 0 ; j< 11 ; j++)
for(int k = 0 ; k < 252 ; k++)
{
blackChessBoard[i][j][k] = false;
whiteChessBoard[i][j][k] = false;
}
whiteChessCount = blackChessCount = 0;
gameover = false ;
winner = BLANK;
return 0 ;
}
//初始化分数
void chess::initialMark()
{
for(int i = 0 ;i < 11 ; i ++)
for(int j = 0 ; j < 11 ; j++)
{
whiteChessGrade[i][j] = 0 ;
blackChessGrade[i][j] = 0 ;
}
}
//初始化获胜的组合数
int chess::initWinCompages()
{
int i=0,j=0,k=0,num=0;
//初始化水平方向的获胜组合数
for(i = 0 ; i< 11; i++)
{
for(int j = 0 ; j < 7 ; j++)
{
for(k = 0; k < 5 ; k++)
{
blackChessBoard[i][j+k][num] = true;
whiteChessBoard[i][j+k][num] = true;
}
num