#include
#include
#include
#include
#include
using namespace std;
const int N = 20; //定义棋盘规模
int pace = 0;//统计步数
const char chess[2] = {'X', 'O'}; //定义数组显示棋子颜色 黑 白bool SystemError = 0;int lastI = 0, lastJ = 0;
int maxI = 9, maxJ = 9;void InitChess(char *board)//初始化棋盘√
{for(int i = 0; i < N; i++)for(int j = 0; j < N; j++)board[i * N + j] = '.';return;
}void PrintChess(char *board)//打印棋盘√
{for(int i = 0; i < N; i++)printf("%2d", i + 1);cout << endl;for(int i = 0; i < N; i++){printf("%2d", i + 1);for(int j = 0; j < N; j++){cout << board[i * N + j];cout << " ";}cout << endl;}return;
}void Player(char * board, int color)//玩家落子√
{int i, j;while(1){cout << "请玩家输入坐标(x y)" << endl;cin >> j >> i;i--;j--;if(i < 0 || i > 20 || j < 0 || j > 20)cout << "请输入1--20有效数" << endl;else if(board[i * N + j] != '.')cout << "已有棋子,请重下" << endl;elsebreak;}board[i * N + j] = chess[color];//在棋盘上标记//记录当前棋子坐标lastI = i;lastJ = j;pace++;//步数+1return;
}void ComputeValue(int color, char *board)//计算落子位置值评估函数√
{int maxmax = 0, mark[400] = {0};//初始分数为0char I;char U;if(color == 0){I = 'X';U = 'O';}else{I = 'O';U = 'X';}for(int i = 1; i < N; i++){for(int j = 1; j < N; j++)//全局扫描寻找最佳的落子位置{if(board[i * N + j] == '.'){if((board[(i - 1) * N + j] == I )|| (board[(i + 1) * N + j] == I )||(board[i * N + (j + 1)] == I) || (board[i * N + (j - 1)] == I) ){mark[i * N + j] += 9;}//四周有己方1棋oif((board[(i - 1) * N + j] == U) || (board[(i + 1) * N + j] == U) ||(board[i * N + (j + 1)] == U) || (board[i * N + (j - 1)] == U)){mark[i * N + j] += 10;}//四周有对方1棋xif((board[(i - 1) * N + j] == I && board[(i - 2) * N + j] == I)|| (board[i * N + (j - 1)] == I && board[i * N + (j - 2)] == I)|| (board[i*N+(j+1)]==I && board[i*N+(j+2)]==I)|| (board[(i + 1) * N+j]==I && board[(i+2)*N+j]==I)|| (board[(i - 1)*N+(j+1)]==I && board[(i-2)*N+(j+2)]==I)|| (board[(i+1)*N+(j+1)]==I && board[(i+2)*N+(j+2)]==I)|| (board[(i-1)*N+(j-1)]==I && board[(i-2)*N+(j-2)]==I)|| (board[(i+1)*N+(j-1)]==I && board[(i+2)*N+(j-2)]==I)){mark[i*N+j]+=70;}//八个方向己方连续2棋ooif((board[(i-1)*N+j]==U&& board[(i-2)*N+j]==U)|| (board[i*N+(j-1)]==U && board[i*N+(j-2)]==U)|| (board[i*N+(j+1)]==U && board[i*N+(j+2)]==U)|| (board[(i+1)*N+j]==U && board[(i+2)*N+j]==U)|| (board[i-1*N+j+1]==U && board[i-2*N+j+2]==U)|| (board[i+1*N+j+1]==U && board[i+2*N+j+2]==U)|| (board[i-1*N+j-1]==U && board[i-2*N+j-2]==U)|| (board[i+1*N+j-1]==U && board[i+2*N+j-2]==U)){mark[i*N+j]+=50;}//八个方向对方连续2棋xxif((board[i-1*N+j]==I && board[i+1*N+j])|| (board[i*N+j-1]==I && board[i*N+j+1]==I)|| (board[i-1*N+j-1]==I && board[i+1*N+j+1]==I)|| (board[i-1*N+j+1]==I && board[i+1*N+j-1]==I)){mark[i*N+j]+=75;}//四周己方#o#if((board[i-1*N+j]==U && board[i+1*N+j]==U)|| (board[i*N+j-1]==U && board[i*N+j+1]==U)|| (board[i-1*N+j-1]==U && board[i+1*N+j+1]==U)|| (board[i-1*N+j+1]==U && board[i+1*N+j-1]==U)){mark[i*N+j]+=55;}//四周对方0x0if((board[(i-3)*N+j]==I&& board[(i-2)*N+j]==I&& board[(i-1)*N+j]==I)|| (board[(i+1)*N+j]==I&& board[(i+2)*N+j]==I && board[(i+3)*N+j]==I)|| (board[i*N+(j-3)]==I&& board[i*N+(j-2)]==I&& board[i*N+(j-1)]==I)|| (board[i*N+(j+1)]==I&& board[i*N+(j+2)]==I&& board[i*N+(j+3)]==I)|| (board[(i-3)*N+(j-3)]==I&& board[(i-2)*N+(j-2)]==I&& board[(i-1)*N+(j-1)]==I)|| (board[(i+3)*N+(j+3)]==I&& board[(i+2)*N+(j+2)]==I&& board[(i+1)*N+(j+1)]==I)|| (board[(i-3)*N+(j+3)]==I&& board[(i-2)*N+(j+2)]==I&& board[(i-1)*N+(j+1)]==I)|| (board[(i+3)*N+(j-3)]==I&& board[(i+2)*N+(j-2)]==I&& board[(i+1)*N+(j-1)]==I)){mark[i*N+j]+= 100;}//己方###if((board[(i-3)*N+j]==U&& board[(i-2)*N+j]==U&& board[(i-1)*N+j]==U)|| (board[(i+1)*N+j]==U&& board[(i+2)*N+j]==U&& board[(i+3)*N+j]==0)|| (board[i*N+(j-3)]==U&& board[i*N+(j-2)]==U&& board[i*N+(j-1)]==U)|| (board[i*N+(j+1)]==U&& board[i*N+(j+2)]==U&& board[i*N+(j+3)]==U)|| (board[(i-3)*N+(j-3)]==U&& board[(i-2)*N+(j-2)]==U&& board[(i-1)*N+(j-1)]==U)|| (board[(i+3)*N+(j+3)]==U&& board[(i+2)*N+(j+2)]==U&& board[(i+1)*N+(j+1)]==U)|| (board[(i-3)*N+(j+3)]==U&& board[(i-2)*N+(j+2)]==U&& board[(i-1)*N+(j+1)]==U)|| (board[(i+3)*N+(j-3)]==U&& board[(i+2)*N+(j-2)]==U&& board[(i+1)*N+(j-1)]==U)){mark[i*N+j]+= 200;}//对方000if((board[(i+1)*N+j]==I&& board[(i-2)*N+j]==I&& board[(i-1)*N+j]==I)|| (board[(i+1)*N+j]==I&& board[(i+2)*N+j]==I&& board[(i-1)*N+j]==I)|| (board[i*N+(j+1)]==I&& board[i*N+(j-2)]==U&& board[i*N+(j-1)]==I)|| (board[i*N+(j+1)]==I&& board[i*N+(j+2)]==U&& board[i*N+(j-1)]==I)|| (board[(i+1)*N+(j+1)]==I&& board[(i-2)*N+(j-2)]==I&& board[(i-1)*N+(j-1)]==I)|| (board[(i-1)*N+(j-1)]==I&& board[(i+2)*N+(j+2)]==I&& board[(i+1)*N+(j+1)]==I)|| (board[(i+1)*N+(j-1)]==I&& board[(i-2)*N+(j+2)]==I&& board[(i-1)*N+(j+1)]==I)|| (board[(i-1)*N+(j+1)]==I&& board[(i+2)*N+(j-2)]==I&& board[(i+1)*N+(j-1)]==I)){mark[i*N+j]+= 300;}//己方## #if((board[(i+1)*N+j]==U&& board[(i-2)*N+j]==U&& board[(i-1)*N+j]==U)|| (board[(i+1)*N+j]==U&& board[(i+2)*N+j]==U&& board[(i-1)*N+j]==U)|| (board[i*N+(j+1)]==U&& board[i*N+(j-2)]==U&& board[i*N+(j-1)]==U)|| (board[i*N+(j+1)]==U&& board[i*N+(j+2)]==U&& board[i*N+(j-1)]==U)|| (board[(i+1)*N+(j+1)]==U&& board[(i-2)*N+(j-2)]==U&& board[(i-1)*N+(j-1)]==U)|| (board[(i-1)*N+(j-1)]==U&& board[(i+2)*N+(j+2)]==U&& board[(i+1)*N+(j+1)]==U)|| (board[(i+1)*N+(j-1)]==U&& board[(i-2)*N+(j+2)]==U&& board[(i-1)*N+(j+1)]==U)|| (board[(i-1)*N+(j+1)]==U&& board[(i+2)*N+(j-2)]==U&& board[(i+1)*N+(j-1)]==U)){mark[i*N+j]+= 400;}//对方00 0if((board[(i-4)*N+j]==I&& board[(i-3)*N+j]==I&& board[(i-2)*N+j]==I&& board[(i-1)*N+j]==I)|| (board[(i+1)*N+j]==I&& board[(i+2)*N+j]==I&& board[(i+3)*N+j]==I&& board[(i+4)*N+j]==I)|| (board[i*N+(j-4)]==I&& board[i*N+(j-3)]==I&& board[i*N+(j-2)]==I&& board[i*N+(j-1)]==I)|| (board[i*N+(j+1)]==I&& board[i*N+(j+2)]==I&& board[i*N+(j+3)]==I&& board[i*N+(j+4)]==I)|| (board[(i-4)*N+(j-4)]==I&& board[(i-3)*N+(j-3)]==I&& board[(i-2)*N+(j-2)]==I&& board[(i-1)*N+(j-1)]==I)|| (board[(i+4)*N+(j+4)]==I&& board[(i+3)*N+(j+3)]==I&& board[(i+2)*N+(j+2)]==I&& board[(i+1)*N+(j+1)]==I)|| (board[(i-4)*N+(j+4)]==I&& board[(i-3)*N+(j+3)]==I&& board[(i-2)*N+(j+2)]==I&& board[(i-1)*N+(j+1)]==I)|| (board[(i+4)*N+(j-4)]==I&& board[(i+3)*N+(j-3)]==I&& board[(i+2)*N+(j-2)]==I&& board[(i+1)*N+(j-1)]==I)){mark[i*N+j]+= 1000;}//己方####if((board[(i-4)*N+j]==U&& board[(i-3)*N+j]==U&& board[(i-2)*N+j]==U&& board[(i-1)*N+j]==U)|| (board[(i+1)*N+j]==U&& board[(i+2)*N+j]==U&& board[(i+3)*N+j]==U&& board[(i+4)*N+j]==U)|| (board[i*N+(j-4)]==U&& board[i*N+(j-3)]==U&& board[i*N+(j-2)]==U&& board[i*N+(j-1)]==U)|| (board[i*N+(j+1)]==U&& board[i*N+(j+2)]==U&& board[i*N+(j+3)]==U&& board[i*N+(j+4)]==U)|| (board[(i-4)*N+(j-4)]==U&& board[(i-3)*N+(j-3)]==U&& board[(i-2)*N+(j-2)]==U&& board[(i-1)*N+(j-1)]==U)|| (board[(i+4)*N+(j+4)]==U&& board[(i+3)*N+(j+3)]==U&& board[(i+2)*N+(j+2)]==U&& board[(i+1)*N+(j+1)]==U)|| (board[(i-4)*N+(j+4)]==U&& board[(i-3)*N+(j+3)]==U&& board[(i-2)*N+(j+2)]==U&& board[(i-1)*N+(j+1)]==U)|| (board[(i+4)*N+(j-4)]==U&& board[(i+3)*N+(j-3)]==U&& board[(i+2)*N+(j-2)]==U&& board[(i+1)*N+(j-1)]==U)){mark[i*N+j]+= 900;}//对方0000if(mark[i * N + j] > maxmax)//记录当前最优情况{maxmax = mark[i * N + j];maxI= i;maxJ= j;}}}}
}
void Computer(char * board, int color) //放棋子√
{ComputeValue(color, board);board[maxI * N + maxJ] = chess[color];lastI = maxI;//记录棋子坐标lastJ = maxJ;
}bool Check(char *board)//用于判断是否连成五子√
{int num=0;int i, j;for(i = lastI - 1, j = lastJ; i > 0; i--)//以当前落子位置为起点向上搜索{if(board[i * N + j] == board[lastI * N + lastJ])num++;elsebreak;}for(i = lastI + 1, j = lastJ; i < 20; i++)//下{if(board[i * N + j] == board[lastI * N + lastJ])num++;elsebreak;}if(num >= 4)//上下位置4+1->结束return 1;num = 0;for(i = lastI, j = lastJ - 1; j > 0; j--)//左{if(board[i * N + j] == board[lastI * N + lastJ])num++;else break;}for(i = lastI, j = lastJ + 1; j < 20; j++)//右{if(board[i * N + j] == board[lastI * N + lastJ])num++;else break;}if(num >= 4)return 1;num = 0;for(i = lastI - 1, j = lastJ + 1; i > 0 && j < 20; i--, j++)//对角线{if(board[i * N + j] == board[lastI * N + lastJ])num++;else break;}for(i = lastI + 1, j = lastJ - 1; i < 20 && j > 0; i++, j--){if(board[i * N + j] == board[lastI * N + lastJ])num++;else break;}if(num >= 4)return 1;num = 0;for(i = lastI - 1, j = lastJ - 1; i > 0 && j > 0; i--, j--){if(board[i * N + j] == board[lastI * N + lastJ])num++;else break;}for(i = lastI + 1, j = lastJ + 1; i < 20 && j < 20; i++, j++){if(board[i * N + j] == board[lastI * N + lastJ])num++;else break;}if(num >= 4)return 1;elsereturn 0;
}
void Play(char * board) //游戏函数
{while(1){Player(board, 0);if (SystemError)return;system("cls");//清屏PrintChess(board);if(Check(board)){cout << cout << endl << endl <<"玩家获胜,游戏结束"<
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!