#include<iostream> #include<memory.h> #include<string> #include<stdlib.h>
#include<stdio.h> 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; else break;
} board[i * N + j] = chess[color];//在棋盘上标记 //记录当前棋子坐标 lastI = i; lastJ = j;
pace++;//步数+1 return; } void ComputeValue(int color, char *board)//计算落子位置值评估函数√
{ int maxmax = 0, mark[400] = {0};//初始分数为0 char 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棋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)) { mark[i * N + j] += 10;
}//四周有对方1棋x if((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棋oo if((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棋xx if((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; }//四周对方0x0
if((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; }//对方000
if((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 0
if((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; }//对方0000 if(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++; else break; } for(i = lastI + 1, j = lastJ; i < 20; i++)//下 {
if(board[i * N + j] == board[lastI * N + lastJ]) num++; else break; } 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; else return 0; } void Play(char * board) //游戏函数
{ while(1) { Player(board, 0); if (SystemError) return; system("cls");//清屏
PrintChess(board); if(Check(board)) { cout << cout << endl << endl
<<"玩家获胜,游戏结束"<<endl; break; } Computer(board, 1); system("cls");
PrintChess(board); if(Check(board)) { cout << endl << endl << "电脑获胜,游戏结束" <<
endl; break; } } } int main() //主函数 { char board[400]; while(1) {
InitChess(board); PrintChess(board); Play(board); } return 0; }
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信