// MoveGenertor.cpp: implementation of the MoveGenertor class.
//
//////////////////////////////////////////////////////////////////////
#include <afxwin.h>
#include"MoveGenertor.h"
#include "Vector.h"
#include"iostream.h"
//#include "iostream.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MoveGenertor::MoveGenertor()
{
//set = new myCObArray();
}
MoveGenertor::~MoveGenertor()
{
}
ChessMove MoveGenertor::GetMove(int col, int row)
{
return moveList[col][row];
}
int MoveGenertor::CreatePossibleMove(int (*position)[5], int nPly, int nside,Vector (*vectors)[5])
{
moveCount = 0;
int moveID = 0;
for (int i = 0; i < 12; i++)
for (int j = 0; j < 5; j++) {
moveID = position[i][j];//将棋子的价值依次取出
if ((vectors[i][j].power!=0))//如果当前节点不是空节点
{
if ((nside == 0)//min节点
&& (vectors[i][j].belongTo == 1)) {// 要产生机器人的路径所有可能然而该坐标上的旗子属于玩家,跳出
// System.out.println("玩家之旗");
continue;
}
if ((nside == 1)
&& (vectors[i][j].belongTo == 0)) {// 要产生玩家的路径所有可能然而该坐标上的旗子属于机器人,跳出
continue;
}
if(over12(moveID) == 12){//如果是地雷,跳出
continue;
}
if (!judgeInOwnCamp(i, j,
vectors[i][j].belongTo)) {// 判断起点自身是否可以移动
continue;
}
if (vectors[i][j].isRoad == 0) {// 是公路顶点
if (isValidVector(i - 1, j)) {// 上
if (judgeMoveChess(position, i, j, i - 1, j,vectors) != 0) {
addMove(i, j, i - 1, j, nPly,position);
}
}
if (isValidVector(i + 1, j)) {// 下
if (judgeMoveChess(position, i, j, i + 1, j,vectors) != 0) {
addMove(i, j, i + 1, j, nPly,position);
}
}
if (isValidVector(i, j - 1)) {// 左
if (judgeMoveChess(position, i, j, i, j - 1,vectors) != 0) {
addMove(i, j, i, j - 1, nPly,position);
}
}
if (isValidVector(i, j + 1)) {// 右
if (judgeMoveChess(position, i, j, i, j + 1,vectors) != 0) {
addMove(i, j, i, j + 1, nPly,position);
}
}
if (isValidVector(i - 1, j - 1)) {// 左上
if (judgeMoveChess(position, i, j, i - 1, j - 1,vectors) != 0) {
addMove(i, j, i - 1, j - 1, nPly,position);
}
}
if (isValidVector(i + 1, j - 1)) {// 左下
if (judgeMoveChess(position, i, j, i + 1, j - 1,vectors) != 0) {
addMove(i, j, i + 1, j - 1, nPly,position);
}
}
if (isValidVector(i - 1, j + 1)) {// 右上
if (judgeMoveChess(position, i, j, i - 1, j + 1,vectors) != 0) {
addMove(i, j, i - 1, j + 1, nPly,position);
}
}
if (isValidVector(i + 1, j + 1)) {// 右下
if (judgeMoveChess(position, i, j, i + 1, j + 1,vectors) != 0) {
addMove(i, j, i + 1, j + 1, nPly,position);
}
}
} else {// 铁路顶点
int flag=0;
moveID =over12(moveID);
if (moveID != 2) {// 不是工兵
if ((moveID == 12)
|| (vectors[i][j].isStuck == 1))
continue;// 不能移动
else {// 可以移动的旗子
// 上
for (int k = 0; k < i; k++)
if ((isValidVector(i - k - 1, j))
&&(( flag=judgeMoveChess(position, i, j,i - k - 1, j,vectors)) != 0))
{
if(flag==1)//空棋位
addMove(i, j, i - k - 1, j, nPly,position);
else if(flag==2)//不是空棋位不用继续循环
{
addMove(i, j, i - k - 1, j, nPly,position);
break;
}
} else {
break;
}
// 下
for (k = 0; k < 11 - i; k++)
if ((isValidVector(i + k + 1, j))
&& ((flag=judgeMoveChess(position, i, j,
i + k + 1, j,vectors)) != 0)) {
if(flag==1)//空棋位
addMove(i, j, i + k + 1, j, nPly,position);
else if(flag==2)//不是空棋位不用继续循环
{
addMove(i, j, i + k + 1, j, nPly,position);
break;
}
} else {
break;
}
// 左
for ( k = 0; k < j; k++)
if ((isValidVector(i, j - k - 1))
&& ((flag=judgeMoveChess(position, i, j,i, j - k - 1,vectors)) != 0)) {
if(flag==1)//空棋位
addMove(i, j,i ,j - k - 1, nPly,position);
else if(flag==2)//不是空棋位不用继续循环
{
addMove(i, j, i, j - k - 1, nPly,position);
break;
}
} else {
break;
}
// 右
for ( k = 0; k < 4 - j; k++)
if ((isValidVector(i, j + k + 1))
&& ((flag=judgeMoveChess(position, i, j,
i, j + k + 1,vectors)) != 0)) {
if(flag==1)//空棋位
addMove(i, j,i , j + k + 1, nPly,position);
else if(flag==2)//不是空棋位不用继续循环
{
addMove(i, j, i, j + k + 1, nPly,position);
break;
}
} else {
break;
}
if (isValidVector(i - 1, j - 1)) {// 左上
if (judgeMoveChess(position, i, j, i - 1,
j - 1,vectors) != 0) {
addMove(i, j, i - 1, j - 1, nPly,position);
}
}
if (isValidVector(i + 1, j - 1)) {// 左下
if (judgeMoveChess(position, i, j, i + 1,
j - 1,vectors) != 0) {
addMove(i, j, i + 1, j - 1, nPly,position);
}
}
if (isValidVector(i - 1, j + 1)) {// 右上
if (judgeMoveChess(position, i, j, i - 1,
j + 1,vectors) != 0) {
addMove(i, j, i - 1, j + 1, nPly,position);
}
}
if (isValidVector(i + 1, j + 1)) {// 右下
if (judgeMoveChess(position, i, j, i + 1,
j + 1,vectors) != 0) {
addMove(i, j, i + 1, j + 1, nPly,position);
}
}
}
} else {// 工兵
// 上
if(set.GetSize() > 0){
set.RemoveAll(); //将栈中元素全部删除
}
CPoint *point = new CPoint(i,j);//创建坐标点
set.Add((CObject *)point);//将当前顶点类转换为基类并压入栈
if (isValidVector(i - 1, j)) {
canMove(position, i, j, i - 1, j, nPly,vectors);
set.Add((CObject *)(new CPoint(i - 1, j)));
}
if (isValidVector(i + 1, j)) {
canMove(position, i, j, i + 1, j, nPly,vectors);
set.Add((CObject *)(new CPoint(i + 1, j)));
}
if (isValidVector(i, j - 1)) {
canMove(position, i, j, i, j - 1, nPly,vectors);
set.Add((CObject *)(new CPoint(i, j - 1)));
}
if (isValidVector(i, j + 1)) {
canMove(position, i, j, i, j + 1, nPly,vectors);
set.Add((CObject *)(new CPoint(i, j + 1)));
}
/* if (isValidVector(i - 1, j - 1))
{// 左上
if (judgeMoveChess(position, i, j, i - 1, j - 1,vectors) != 0)
{
addMove(i, j, i - 1, j - 1, nPly,position);
}
}
if (isValidVector(i + 1, j - 1))
{// 左下
if (judgeMoveChess(position, i, j, i + 1, j - 1,vectors) != 0)
{
addMove(i, j, i + 1, j - 1, nPly,position);
}
}
if (isValidVector(i - 1, j + 1))
{// 右上
if (judgeMoveChess(position, i, j, i - 1, j + 1,vectors) != 0)
{
addMove(i, j, i - 1, j + 1, nPly,position);
}
}
if (isValidVector(i + 1, j + 1))
{// 右下
if (judgeMoveChess(position, i, j, i + 1, j + 1,vectors) != 0)
{
addMove(i, j, i + 1, j + 1, nPly,position);
}
}*/
}
}
}else{
continue;
}
}
return moveCount;
}
int MoveGenertor::over12(int moveID)
{
if (moveID > 12)
return