序
这篇文章的知识落后了
这是新版机器人的做法
比这个的更简单、高效
https://blog.csdn.net/Turm_Xsk/article/details/106116830
本蒟蒻第二个制作的游戏,奈何不会用MFC,就自己摸索出了纯C语言制作的五子棋,正在努力学习。网上都有制作教程,而且比我的跟详实美观,我就贴上几个核心程序吧,包括机器人棋手。
以下是效果图
光标显示坐标
void Pos(int x, int y) {//设置光标位置
COORD pos;
//HANDLE hOutput;
pos.X = x;//光标要设置的位置x
pos.Y = y;//光标要设置的位置y
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//使用GetStdHandle(STD_OUTPUT_HANDLE)来获取标准输出的句柄
SetConsoleCursorPosition(hOutput, pos);//设置光标位置
/*
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
*/
}
生成地图
void CreatMap() {//生成游戏初始地图
for (int j = 2; j < 16*3 + 2; j += 3) { // 横
for (int i = 8; i <= 16 * 6 + 2; i++) {
Pos(i, j);
printf("_");
}
}
for (int i = 8; i < 16*6 + 5; i += 6) { // 竖
for (int j = 3; j < 16 * 3; j++) {
Pos(i, j);
printf("|");
}
}
//装饰
for(int i = 7; i < 16*6 + 4; i++) {
Pos(i, 1);
printf("_");
Pos(i, 16*3);
printf("_");
}
for(int j = 2; j < 16*3 + 1; j++) {
Pos(7, j);
printf("|");
Pos(16*6 + 3, j);
printf("|");
}
}
人机对战循环块
void RobotGame(int sum) {//人机对战
int op = 1; // 黑子 为 1 白子 为 2
//sum判断平局情况
Pos(130, 2);
printf("按住空格悔棋 只能悔棋一步");
Pos(130, 4);
printf("棋局未刷新 点击右键刷新");
Pos(130, 6);
printf("全屏开始游戏 点击右键下棋");
Pos(130, 8);
printf("自制机器人 太笨别怪");
Pos(130, 10);
printf("点击棋盘边缘 弃局");
Pos(130, 12);
printf("按住回车保存棋局");
RankListinGame();
while (1) {
if (GetAsyncKeyState(VK_RETURN)) SaveRobotGame();
if (GetAsyncKeyState(VK_SPACE) && sum % 2 == 0 && sum) {
Map[pre1x][pre1y] = Map[pre2x][pre2y] = 0;
BlankPut(10 + pre1x * 6, 3 + pre1y * 3);
BlankPut(10 + pre2x * 6, 3 + pre2y * 3);
sum -= 2;
Sleep(400);
}
if (op == 1) {//黑子下
POINT pt;
GetCursorPos(&pt);
Pos(130, 14);
int x = (pt.x - 70)/48, y = (pt.y - 70)/48;
if (x >= 0 && y >= 0 && x < 15 && y < 15) printf("当前玩家下棋位置 x:%4d y:%4d", x + 1, y + 1);
if (GetAsyncKeyState(VK_RBUTTON) && CheckArray(x, y) && Map[x][y] == 0) {
if (x >= 0 && y >= 0 && x < 15 && y < 15) {
Map[x][y] = 1;
BlackPut(10 + 6*x, 3 + 3*y);
}
if (CheckWin(x, y, op)) {
Pos(113, 44);
printf("玩家胜 ");
WinTips(op);
system("pause");
system("cls");
RankEnd(op, 500 - 2*sum);
system("pause");
return;
}
op = 2;
Sleep(100);
sum++;
pre1x = x, pre1y = y;
}
} else {// 白子下(机器人下)
int x, y;
if (RobotPut()) {
Pos(113, 44);
printf("机器人获得胜利 ");
WinTips(op);
system("pause");
system("cls");
RankEnd(op, sum);
system("pause");
return;
}
op = 1;
Sleep(100);
sum++;
}
if (sum >= 15 * 15) {
system("cls");
Pos(113, 44);
printf("平局 ");
system("pause");
return;
}
}
}
判断胜利函数
从上一个下棋的点开始 ,向上下、左右、左斜、右斜四个角度向两方探索,看是否满足胜利条件,无须遍历棋盘。
bool CheckWin(int x, int y, int op) {//判断胜利程序 从下棋起电两头扫
int i1 = x, i2 = x, cnt1 = 0;
while (Map[i1][y] == op && i1 < 15) {//横向
cnt1++;
i1++;
}
while (Map[i2][y] == op && i2 >= 0) {
cnt1++;
i2--;
}
if (cnt1 >= 6) return true;
int j1 = y, j2 = y, cnt2 = 0;
while (Map[x][j1] == op && j1 < 15) {//竖向
cnt2++;
j1++;
}
while (Map[x][j2] == op && j2 >= 0) {
cnt2++;
j2--;
}
if (cnt2 >= 6) return true;
int a1 = x, a2 = x, b1 = y, b2 = y, cnt3 = 0;
while (Map[a1][b1] == op && a1 < 15 && b1 < 15) {//斜向
cnt3++;
a1++;
b1++;
}
while (Map[a2][b2] == op && a2 >= 0 && b2 >= 0) {
cnt3++;
a2--;
b2--;
}
if (cnt3 >= 6) return true;
a1 = x, a2 = x, b1 = y, b2 = y, cnt3 = 0;
while (Map[a1][b1] == op && a1 < 15 && b1 >= 0) {//斜向
cnt3++;
a1++;
b1--;
}
while (Map[a2][b2] == op && a2 >= 0 && b2 <= 15) {
cnt3++;
a2--;
b2++;
}
if (cnt3 >= 6) return true;
return false;
}
机器人下棋模块
这个当然是最重要的,,,数据量小的棋盘15*15,贪心算法是机器人的核心思路,不用担心复杂度,就一遍一遍地扫棋盘, 看起来吓人的1000行码量,其实大多都是复制粘贴的!!!!
bool RobotPut() {//机器人程序 贪心算法 先凑多后凑少 攻击与防御同等权重
int x = 0, y = 0, flag = 1;
srand((unsigned)time(NULL));
while (Map[x][y] != 0 || x <= 0 || y <= 0 || x >= 14 || y >= 14) x = rand() % 15, y = rand() % 15;
///
for (int i = 0; i < 15 && flag; i++) {//进攻横4
for (int j = 0; j + 3 < 15 && flag; j++) {
if (Map[i][j] == 2 && Map[i][j + 1] == 2 && Map[i][j + 2] == 2 && Map[i][j + 3] == 2) {
if ((j - 1 >= 0 && Map[i][j - 1] == 0)) {
x = i, y = j - 1, flag = 0;
break;
}
if ((j + 4 < 15 && Map[i][j + 4] == 0)) {
x = i, y = j + 4, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i][j + 2] == 2 && Map[i][j + 4] == 2 && (Map[i][j + 1] == 2 || Map[i][j + 3] == 2) && j + 4 < 15) {
if (Map[i][j + 1] == 0) {
x = i, y = j + 1, flag = 0;
break;
}
if (Map[i][j + 3] == 0) {
x = i, y = j + 3, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i][j + 1] == 2 && Map[i][j + 3] == 2 && Map[i][j + 4] == 2 && j + 4 < 15) {
if (Map[i][j + 2] == 0) {
x = i, y = j + 2, flag = 0;
break;
}
}
}
}
for(int j = 0; j < 15 && flag; j++) {//进攻竖4
for (int i = 0; i + 3 < 15 && flag; i++) {
if (Map[i][j] == 2 && Map[i + 1][j] == 2 && Map[i + 2][j] == 2 && Map[i + 3][j] == 2) {
if ((i - 1 >= 0 && Map[i - 1][j] == 0)) {
x = i - 1, y = j, flag = 0;
break;
}
if ((i + 4 < 15 && Map[i + 4][j] == 0)) {
x = i + 4, y = j, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 2][j] == 2 && Map[i + 4][j] == 2 && (Map[i + 1][j] == 2 || Map[i + 3][j] == 2) && i + 4 < 15) {
if (Map[i + 1][j] == 0) {
x = i + 1, y = j, flag = 0;
break;
}
if (Map[i + 3][j] == 0) {
x = i + 3, y = j, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 1][j] == 2 && Map[i + 3][j] == 2 && Map[i + 4][j] == 2 && i + 4 < 15) {
if (Map[i + 2][j] == 0) {
x = i + 2, y = j, flag = 0;
break;
}
}
}
}
for (int i = 0; flag && i + 3 < 15; i++) {//进攻左斜4
for (int j = 0; flag && j + 3 < 15; j++) {
if (Map[i][j] == 2 && Map[i + 1][j + 1] == 2 && Map[i + 2][j + 2] == 2 && Map[i + 3][j + 3] == 2) {
if (i - 1 >= 0 && j - 1 >= 0 && Map[i - 1][j - 1] == 0) {
x = i - 1, y = j - 1, flag = 0;
break;
}
if (i + 4 < 15 && j + 4 < 15 && Map[i + 4][j + 4] == 0) {
x = i + 4, y = j + 4, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 2][j + 2] == 2 && Map[i + 4][j + 4] == 2 && (Map[i + 1][j + 1] == 2 || Map[i + 3][j + 3] == 2) && i + 4 < 15 && j + 4 < 15) {
if (Map[i + 1][j + 1] == 0) {
x = i + 1, y = j + 1, flag = 0;
break;
}
if (Map[i + 3][j + 3] == 0) {
x = i + 3, y = j + 3, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 1][j + 1] == 2 && Map[i + 3][j + 3] == 2 && Map[i + 4][j + 4] == 2 && i + 4 < 15 && j + 4 < 15) {
if (Map[i + 2][j + 2] == 0) {
x = i + 2, y = j + 2, flag = 0;
break;
}
}
}
}
for (int j = 14; flag && j - 3 >= 0; j--) {//进攻右斜4
for (int i = 0; flag && i + 3 < 15; i++) {
if (Map[i][j] == 2 && Map[i + 1][j - 1] == 2 && Map[i + 2][j - 2] == 2 && Map[i + 3][j - 3] == 2) {
if (i - 1 >= 0 && j + 1 < 15 && Map[i - 1][j + 1] == 0) {
x = i - 1, y = j + 1, flag = 0;
break;
}
if (i + 4 < 15 && j - 4 >= 0 && Map[i + 4][j - 4] == 0) {
x = i + 4, y = j - 4, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 2][j - 2] == 2 && Map[i + 4][j - 4] == 2 && (Map[i + 1][j - 1] == 2 || Map[i + 3][j - 3] == 2) && i + 4 < 15 && j - 4 >= 0) {
if (Map[i + 1][j - 1] == 0) {
x = i + 1, y = j - 1, flag = 0;
break;
}
if (Map[i + 3][j - 3] == 0) {
x = i + 3, y = j - 3, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 1][j - 1] == 2 && Map[i + 3][j - 3] == 2 && Map[i + 4][j - 4] == 2 && i + 4 < 15 && j - 4 >= 0) {
if (Map[i + 2][j - 2] == 0) {
x = i + 2, y = j - 2, flag = 0;
break;
}
}
}
}
///
for (int i = 0; i < 15 && flag; i++) {//防御竖4
for (int j = 0; j + 3 < 15 && flag; j++) {
if (Map[i][j] == 1 && Map[i][j + 1] == 1 && Map[i][j + 2] == 1 && Map[i][j + 3] == 1) {
if ((j - 1 >= 0 && Map[i][j - 1] == 0)) {
x = i, y = j - 1, flag = 0;
break;
}
if ((j + 4 < 15 && Map[i][j + 4] == 0)) {
x = i, y = j + 4, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i][j + 2] == 1 && Map[i][j + 4] == 1 && (Map[i][j + 1] == 1 || Map[i][j + 3] == 1) && j + 4 < 15) {
if (Map[i][j + 1] == 0) {
x = i, y = j + 1, flag = 0;
break;
}
if (Map[i][j + 3] == 0) {
x = i, y = j + 3, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i][j + 1] == 1 && Map[i][j + 3] == 1 && Map[i][j + 4] == 1 && j + 4 < 15) {
if (Map[i][j + 2] == 0) {
x = i, y = j + 2, flag = 0;
break;
}
}
}
}
for (int j = 0; j < 15 && flag; j++) {//防御横4
for (int i = 0; i + 3 < 15 && flag; i++) {
if (Map[i][j] == 1 && Map[i + 1][j] == 1 && Map[i + 2][j] == 1 && Map[i + 3][j] == 1) {
if ((i - 1 >= 0 && Map[i - 1][j] == 0)) {
x = i - 1, y = j, flag = 0;
break;
}
if ((i + 4 < 15 && Map[i + 4][j] == 0)) {
x = i + 4, y = j, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i + 2][j] == 1 && Map[i + 4][j] == 1 && (Map[i + 1][j] == 1 || Map[i + 3][j] == 1) && i + 4 < 15) {
if (Map[i + 1][j] == 0) {
x = i + 1, y = j, flag = 0;
break;
}
if (Map[i + 3][j] == 0) {
x = i + 3, y = j, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i + 1][j] == 1 && Map[i + 3][j] == 1 && Map[i + 4][j] == 1 && i + 4 < 15) {
if (Map[i + 2][j] == 0) {
x = i + 2, y = j, flag = 0;
break;
}
}
}
}
for (int i = 0; flag && i + 3 < 15; i++) {//防御左斜4
for (int j = 0; flag && j + 3 < 15; j++) {
if (Map[i][j] == 1 && Map[i + 1][j + 1] == 1 && Map[i + 2][j + 2] == 1 && Map[i + 3][j + 3] == 1) {
if (i - 1 >= 0 && j + 1 >= 0 && Map[i - 1][j - 1] == 0) {
x = i - 1, y = j - 1, flag = 0;
break;
}
if (i + 4 < 15 && j + 4 < 15 && Map[i + 4][j + 4] == 0) {
x = i + 4, y = j + 4, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i + 2][j + 2] == 1 && Map[i + 4][j + 4] == 1 && (Map[i + 1][j + 1] == 1 || Map[i + 3][j + 3] == 1) && i + 4 < 15 && j + 4 < 15) {
if (Map[i + 1][j + 1] == 0) {
x = i + 1, y = j + 1, flag = 0;
break;
}
if (Map[i + 3][j + 3] == 0) {
x = i + 3, y = j + 3, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i + 1][j + 1] == 1 && Map[i + 3][j + 3] == 1 && Map[i + 4][j + 4] == 1 && i + 4 < 15 && j + 4 < 15) {
if (Map[i + 2][j + 2] == 0) {
x = i + 2, y = j + 2, flag = 0;
break;
}
}
}
}
for (int j = 14; flag && j - 3 >= 0; j--) {//防御右斜4
for (int i = 0; flag && i + 3 < 15; i++) {
if (Map[i][j] == 1 && Map[i + 1][j - 1] == 1 && Map[i + 2][j - 2] == 1 && Map[i + 3][j - 3] == 1) {
if (i - 1 >= 0 && j + 1 < 15 && Map[i - 1][j + 1] == 0) {
x = i - 1, y = j + 1, flag = 0;
break;
}
if (i + 4 < 15 && j - 4 >= 0 && Map[i + 4][j - 4] == 0) {
x = i + 4, y = j - 4, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i + 2][j - 2] == 1 && Map[i + 4][j - 4] == 1 && (Map[i + 1][j - 1] == 1 || Map[i + 3][j - 3] == 1) && i + 4 < 15 && j - 4 >= 0) {
if (Map[i + 1][j - 1] == 0) {
x = i + 1, y = j - 1, flag = 0;
break;
}
if (Map[i + 3][j - 3] == 0) {
x = i + 3, y = j - 3, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i + 1][j - 1] == 1 && Map[i + 3][j - 3] == 1 && Map[i + 4][j - 4] == 1 && i + 4 < 15 && j - 4 >= 0) {
if (Map[i + 2][j - 2] == 0) {
x = i + 2, y = j - 2, flag = 0;
break;
}
}
}
}
///
for(int i = 0; i < 15&&flag; i++) {//特殊阵型 - 防御
for(int j = 0; j < 15&&flag; j++) {
if(Map[i][j] == 0&&i + 2 < 15&&j + 2 < 15&&Map[i + 1][j] == 1&&Map[i + 2][j] == 1&&Map[i][j + 1] == 1&&Map[i][j + 2] == 1) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i - 2 >= 0&&j - 2 >= 0&&Map[i - 1][j] == 1&&Map[i - 2][j] == 1&&Map[i][j - 1] == 1&&Map[i][j - 2] == 1) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i + 2 < 15&&j - 2 >= 0&&Map[i + 1][j] == 1&&Map[i + 2][j] == 1&&Map[i][j - 1] == 1&&Map[i][j - 2] == 1) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i - 2 >= 0&&j + 2 < 15&&Map[i - 1][j] == 1&&Map[i - 2][j] == 1&&Map[i][j + 1] == 1&&Map[i][j + 2] == 1) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&j + 2 < 15&&i + 2 < 15&&i - 2 >= 0&&Map[i - 1][j + 1] == 1&&Map[i - 2][j + 2] == 1&&Map[i + 1][j + 1] == 1&&Map[i + 2][j + 2] == 1) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&j - 2 >= 0&&i + 2 < 15&&i - 2 >= 0&&Map[i - 1][j - 1] == 1&&Map[i - 2][j - 2] == 1&&Map[i + 1][j - 1] == 1&&Map[i + 2][j - 2] == 1) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i + 2 < 15&&j - 2 >= 0&&j + 2 < 15&&Map[i + 1][j - 1] == 1&&Map[i + 2][j - 2] == 1&&Map[i + 1][j + 1] == 1&&Map[i + 2][j + 2] == 1) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i - 2 >= 0&&j - 2 >= 0&&j + 2 < 15&&Map[i - 1][j - 1] == 1&&Map[i - 2][j - 2] == 1&&Map[i - 1][j + 1] == 1&&Map[i - 2][j + 2] == 1) {
x = i, y = j, flag = 0;
}
}
}
for(int i = 0; i < 15&&flag; i++) {//特殊阵型 - 攻击
for(int j = 0; j < 15&&flag; j++) {
if(Map[i][j] == 0&&i + 2 < 15&&j + 2 < 15&&Map[i + 1][j] == 2&&Map[i + 2][j] == 2&&Map[i][j + 1] == 2&&Map[i][j + 2] == 2) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i - 2 >= 0&&j - 2 >= 0&&Map[i - 1][j] == 2&&Map[i - 2][j] == 2&&Map[i][j - 1] == 2&&Map[i][j - 2] == 2) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i + 2 < 15&&j - 2 >= 0&&Map[i + 1][j] == 2&&Map[i + 2][j] == 2&&Map[i][j - 1] == 2&&Map[i][j - 2] == 2) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i - 2 >= 0&&j + 2 < 15&&Map[i - 1][j] == 2&&Map[i - 2][j] == 2&&Map[i][j + 1] == 2&&Map[i][j + 2] == 2) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&j + 2 < 15&&i + 2 < 15&&i - 2 >= 0&&Map[i - 1][j + 1] == 2&&Map[i - 2][j + 2] == 2&&Map[i + 1][j + 1] == 2&&Map[i + 2][j + 2] == 2) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&j - 2 >= 0&&i + 2 < 15&&i - 2 >= 0&&Map[i - 1][j - 1] == 2&&Map[i - 2][j - 2] == 2&&Map[i + 1][j - 1] == 2&&Map[i + 2][j - 2] == 2) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i + 2 < 15&&j - 2 >= 0&&j + 2 < 15&&Map[i + 1][j - 1] == 2&&Map[i + 2][j - 2] == 2&&Map[i + 1][j + 1] == 2&&Map[i + 2][j + 2] == 2) {
x = i, y = j, flag = 0;
}
if(Map[i][j] == 0&&i - 2 >= 0&&j - 2 >= 0&&j + 2 < 15&&Map[i - 1][j - 1] == 2&&Map[i - 2][j - 2] == 2&&Map[i - 1][j + 1] == 2&&Map[i - 2][j + 2] == 2) {
x = i, y = j, flag = 0;
}
}
}
for(int i = 1; i < 14; i++) {//特殊阵型2 - 防御
for(int j = 1; j < 14; j++) {
if(Map[i][j] == 0&&Map[i + 1][j] == 1&&Map[i][j + 1] == 1&&Map[i - 1][j] == 1&&Map[i][j - 1] == 1) {
x = i, y = j, flag = 0;
}
}
}
///
for (int i = 0; i < 15 && flag; i++) {//防御竖3
for (int j = 0; j + 2 < 15 && flag; j++) {
if (Map[i][j] == 1 && Map[i][j + 1] == 1 && Map[i][j + 2] == 1&&((Map[i][j - 2] == 0&&Map[i][j - 1] == 0&&j - 2 >= 0)||(Map[i][j + 3] == 0&&Map[i][j - 1] == 0&&j + 3 < 15&&j - 1 >= 0)||(Map[i][j + 3] == 0&&Map[i][j + 4] == 0&&j + 4 < 15))) {
if ((j - 1 >= 0 && Map[i][j - 1] == 0)) {
x = i, y = j - 1, flag = 0;
break;
}
if ((j + 3 < 15 && Map[i][j + 3] == 0)) {
x = i, y = j + 3, flag = 0;
break;
}
}
if ((Map[i][j - 1] == 0||Map[i][j + 4] == 0)&&Map[i][j] == 1 && Map[i][j + 3] == 1 && (Map[i][j + 1] == 1||Map[i][j + 2] == 1) && j + 4 < 15&& j - 1 >= 0) {
if (Map[i][j + 1] == 0) {
x = i, y = j + 1, flag = 0;
break;
}
if (Map[i][j + 2] == 0) {
x = i, y = j + 2, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i][j + 2] == 1 && Map[i][j + 4] == 1 && j + 4 < 15) {
if (Map[i][j + 1] == 0) {
x = i, y = j + 1, flag = 0;
break;
}
if (Map[i][j + 3] == 0) {
x = i, y = j + 3, flag = 0;
break;
}
}
}
}
for (int j = 0; j < 15 && flag; j++) {//防御横3
for (int i = 0; i + 2 < 15 && flag; i++) {
if (Map[i][j] == 1 && Map[i + 1][j] == 1 && Map[i + 2][j] == 1&&((Map[i - 2][j] == 0&&Map[i - 1][j] == 0&&i - 2 >= 0)||(Map[i + 3][j] == 0&&Map[i - 1][j] == 0&&i + 3 < 15&&i - 1 >= 0)||(Map[i + 3][j] == 0&&Map[i + 4][j] == 0&&i + 4 < 15))) {
if ((i - 1 >= 0 && Map[i - 1][j] == 0)) {
x = i - 1, y = j, flag = 0;
break;
}
if ((i + 3 < 15 && Map[i + 3][j] == 0)) {
x = i + 3, y = j, flag = 0;
break;
}
}
if ((Map[i - 1][j] == 0||Map[i + 3][j] == 0)&&Map[i][j] == 1 && (Map[i + 1][j] == 1||Map[i + 2][j] == 1) && Map[i + 3][j] == 1 && i + 4 < 15&& i - 1 >= 0) {
if (Map[i + 1][j] == 0) {
x = i + 1, y = j, flag = 0;
break;
}
if (Map[i + 2][j] == 0) {
x = i + 2, y = j, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i + 2][j] == 1 && Map[i + 4][j] == 1 && i + 4 < 15) {
if (Map[i + 1][j] == 0) {
x = i + 1, y = j, flag = 0;
break;
}
if (Map[i + 3][j] == 0) {
x = i + 3, y = j, flag = 0;
break;
}
}
}
}
for (int i = 0; flag && i + 2 < 15; i++) {//防御左斜3
for (int j = 0; flag && j + 2 < 15; j++) {
if (Map[i][j] == 1 && Map[i + 1][j + 1] == 1 && Map[i + 2][j + 2] == 1&&((Map[i - 2][j - 2] == 0&&Map[i - 1][j - 1] == 0&&i - 2 >= 0&&j - 2 >= 0)||(Map[i + 3][j + 3] == 0&&Map[i - 1][j - 1] == 0&&i + 3 < 15&&j + 3 < 15&&i - 1 >= 0&&j - 1 >= 0)||(Map[i + 3][j + 3] == 0&&Map[i + 4][j + 4] == 0&&i + 4 < 15&&j + 4 < 15))) {
if (i - 1 >= 0 && j + 1 >= 0 && Map[i - 1][j - 1] == 0) {
x = i - 1, y = j - 1, flag = 0;
break;
}
if (i + 3 < 15 && j + 3 < 15 && Map[i + 3][j + 3] == 0) {
x = i + 3, y = j + 3, flag = 0;
break;
}
}
if ((Map[i - 1][j - 1] == 0||Map[i + 4][j + 4] == 0)&&Map[i][j] == 1 && (Map[i + 1][j + 1] == 1||Map[i + 2][j + 2] == 1) && Map[i + 3][j + 3] == 1 && i + 4 < 15 && j + 4 < 15&&i - 1 >= 0&& j - 1 >= 0) {
if (Map[i + 1][j + 1] == 0) {
x = i + 1, y = j + 1, flag = 0;
break;
}
if (Map[i + 2][j + 2] == 0) {
x = i + 2, y = j + 2, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i + 2][j + 2] == 1 && Map[i + 4][j + 4] == 1 && i + 4 < 15 && j + 4 < 15) {
if (Map[i + 1][j + 1] == 0) {
x = i + 1, y = j + 1, flag = 0;
break;
}
if (Map[i + 3][j + 3] == 0) {
x = i + 3, y = j + 3, flag = 0;
break;
}
}
}
}
for (int j = 14; flag && j - 2 >= 0; j--) {//防御右斜3
for (int i = 0; flag && i + 2 < 15; i++) {
if (Map[i][j] == 1 && Map[i + 1][j - 1] == 1 && Map[i + 2][j - 2] == 1&&((Map[i - 2][j + 2] == 0&&Map[i - 1][j + 1] == 0&&i - 2 >= 0&&j + 2 < 15)||(Map[i + 3][j - 3] == 0&&Map[i - 1][j + 1] == 0&&i + 3 < 15&&j + 1 < 15&&i - 1 >= 0&&j - 3 >= 0)||(Map[i + 3][j - 3] == 0&&Map[i + 4][j - 4] == 0&&i + 4 < 15&&j - 4 >= 0))) {
if (i - 1 >= 0 && j + 1 < 15 && Map[i - 1][j + 1] == 0) {
x = i - 1, y = j + 1, flag = 0;
break;
}
if (i + 3 < 15 && j - 3 >= 0 && Map[i + 3][j - 3] == 0) {
x = i + 3, y = j - 3, flag = 0;
break;
}
}
if ((Map[i - 1][j + 1] == 0||Map[i + 4][j - 4] == 0)&&Map[i][j] == 1 && (Map[i + 1][j - 1] == 1||Map[i + 2][j - 2] == 1) && Map[i + 3][j - 3] == 1 && i + 4 < 15 && j - 4 >= 0&&i - 1 >= 0&& j + 1 < 15) {
if (Map[i + 1][j - 1] == 0) {
x = i + 1, y = j - 1, flag = 0;
break;
}
if (Map[i + 2][j - 2] == 0) {
x = i + 2, y = j - 2, flag = 0;
break;
}
}
if (Map[i][j] == 1 && Map[i + 2][j - 2] == 1 && Map[i + 4][j - 4] == 1 && i + 4 < 15 && j - 4 >= 0) {
if (Map[i + 1][j - 1] == 0) {
x = i + 1, y = j - 1, flag = 0;
break;
}
if (Map[i + 3][j - 3] == 0) {
x = i + 3, y = j - 3, flag = 0;
break;
}
}
}
}
///
for (int i = 0; i < 15 && flag; i++) {//进攻竖3
for (int j = 0; j + 2 < 15 && flag; j++) {
if (Map[i][j] == 2 && Map[i][j + 1] == 2 && Map[i][j + 2] == 2&&((Map[i][j - 2] == 0&&Map[i][j - 1] == 0&&j - 2 >= 0)||(Map[i][j + 3] == 0&&Map[i][j - 1] == 0&&j + 3 < 15&&j - 1 >= 0)||(Map[i][j + 3] == 0&&Map[i][j + 4] == 0&&j + 4 < 15))) {
if ((j - 1 >= 0 && Map[i][j - 1] == 0)) {
x = i, y = j - 1, flag = 0;
break;
}
if ((j + 3 < 15 && Map[i][j + 3] == 0)) {
x = i, y = j + 3, flag = 0;
break;
}
}
if ((Map[i][j - 1] == 0||Map[i][j + 4] == 0)&&Map[i][j] == 2 && Map[i][j + 3] == 2 && (Map[i][j + 1] == 2||Map[i][j + 2] == 2) && j + 4 < 15&& j - 1 >= 0) {
if (Map[i][j + 1] == 0) {
x = i, y = j + 1, flag = 0;
break;
}
if (Map[i][j + 2] == 0) {
x = i, y = j + 2, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i][j + 2] == 2 && Map[i][j + 4] == 2 && j + 4 < 15) {
if (Map[i][j + 1] == 0) {
x = i, y = j + 1, flag = 0;
break;
}
if (Map[i][j + 3] == 0) {
x = i, y = j + 3, flag = 0;
break;
}
}
}
}
for (int j = 0; j < 15 && flag; j++) {//进攻横3
for (int i = 0; i + 2 < 15 && flag; i++) {
if (Map[i][j] == 2 && Map[i + 1][j] == 2 && Map[i + 2][j] == 2&&((Map[i - 2][j] == 0&&Map[i - 1][j] == 0&&i - 2 >= 0)||(Map[i + 3][j] == 0&&Map[i - 1][j] == 0&&i + 3 < 15&&i - 1 >= 0)||(Map[i + 3][j] == 0&&Map[i + 4][j] == 0&&i + 4 < 15))) {
if ((i - 1 >= 0 && Map[i - 1][j] == 0)) {
x = i - 1, y = j, flag = 0;
break;
}
if ((i + 3 < 15 && Map[i + 3][j] == 0)) {
x = i + 3, y = j, flag = 0;
break;
}
}
if ((Map[i - 1][j] == 0||Map[i + 3][j] == 0)&&Map[i][j] == 2 && (Map[i + 1][j] == 2||Map[i + 2][j] == 2) && Map[i + 3][j] == 2 && i + 4 < 15&& i - 1 >= 0) {
if (Map[i + 1][j] == 0) {
x = i + 1, y = j, flag = 0;
break;
}
if (Map[i + 2][j] == 0) {
x = i + 2, y = j, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 2][j] == 2 && Map[i + 4][j] == 2 && i + 4 < 15) {
if (Map[i + 1][j] == 0) {
x = i + 1, y = j, flag = 0;
break;
}
if (Map[i + 3][j] == 0) {
x = i + 3, y = j, flag = 0;
break;
}
}
}
}
for (int i = 0; flag && i + 2 < 15; i++) {//进攻左斜3
for (int j = 0; flag && j + 2 < 15; j++) {
if (Map[i][j] == 2 && Map[i + 1][j + 1] == 2 && Map[i + 2][j + 2] == 2&&((Map[i - 2][j - 2] == 0&&Map[i - 1][j - 1] == 0&&i - 2 >= 0&&j - 2 >= 0)||(Map[i + 3][j + 3] == 0&&Map[i - 1][j - 1] == 0&&i + 3 < 15&&j + 3 < 15&&i - 1 >= 0&&j - 1 >= 0)||(Map[i + 3][j + 3] == 0&&Map[i + 4][j + 4] == 0&&i + 4 < 15&&j + 4 < 15))) {
if (Map[i - 1][j - 1] == 0 && i - 1 >= 0 && j - 1 >= 0) {
x = i - 1, y = j - 1, flag = 0;
break;
}
if (Map[i + 3][j + 3] == 0 && i + 3 < 15 && j + 3 < 15) {
x = i + 3, y = j + 3, flag = 0;
break;
}
}
if ((Map[i - 1][j - 1] == 0||Map[i + 4][j + 4] == 0)&&Map[i][j] == 2 && (Map[i + 1][j + 1] == 2||Map[i + 2][j + 2] == 2) && Map[i + 3][j + 3] == 2 && i + 4 < 15 && j + 4 < 15&&i - 1 >= 0&& j - 1 >= 0) {
if (Map[i + 1][j + 1] == 0) {
x = i + 1, y = j + 1, flag = 0;
break;
}
if (Map[i + 2][j + 2] == 0) {
x = i + 2, y = j + 2, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 2][j + 2] == 2 && Map[i + 4][j + 4] == 2 && i + 4 < 15 && j + 4 < 15) {
if (Map[i + 1][j + 1] == 0) {
x = i + 1, y = j + 1, flag = 0;
break;
}
if (Map[i + 3][j + 3] == 0) {
x = i + 3, y = j + 3, flag = 0;
break;
}
}
}
}
for (int j = 14; flag && j - 2 >= 0; j--) {//进攻右斜3
for (int i = 0; flag && i + 2 < 15; i++) {
if (Map[i][j] == 2 && Map[i + 1][j - 1] == 2 && Map[i + 2][j - 2] == 2 && i + 2 < 15 && j - 2 >= 0&&((Map[i - 2][j + 2] == 0&&Map[i - 1][j + 1] == 0&&i - 2 >= 0&&j + 2 < 15)||(Map[i + 3][j - 3] == 0&&Map[i - 1][j + 1] == 0&&i + 3 < 15&&j + 1 < 15&&i - 1 >= 0&&j - 3 >= 0)||(Map[i + 3][j - 3] == 0&&Map[i + 4][j - 4] == 0&&i + 4 < 15&&j - 4 >= 0))) {
if (i - 1 >= 0 && j + 1 < 15 && Map[i - 1][j + 1] == 0) {
x = i - 1, y = j + 1, flag = 0;
break;
}
if (i + 3 < 15 && j - 3 >= 0 && Map[i + 3][j - 3] == 0) {
x = i + 3, y = j - 3, flag = 0;
break;
}
}
if ((Map[i - 1][j + 1] == 0||Map[i + 4][j - 4] == 0)&&Map[i][j] == 2 && (Map[i + 1][j - 1] == 2||Map[i + 2][j - 2] == 2) && Map[i + 3][j - 3] == 2 && i + 4 < 15 && j - 4 >= 0&&i - 1 >= 0&& j + 1 < 15) {
if (Map[i + 1][j - 1] == 0) {
x = i + 1, y = j - 1, flag = 0;
break;
}
if (Map[i + 2][j - 2] == 0) {
x = i + 2, y = j - 2, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 2][j - 2] == 2 && Map[i + 4][j - 4] == 2 && i + 4 < 15 && j - 4 >= 0) {
if (Map[i + 1][j - 1] == 0) {
x = i + 1, y = j - 1, flag = 0;
break;
}
if (Map[i + 3][j - 3] == 0) {
x = i + 3, y = j - 3, flag = 0;
break;
}
}
}
}
///
for (int i = 0; i < 15 && flag; i++) {//进攻竖2
for (int j = 0; j + 1 < 15 && flag; j++) {
if (Map[i][j] == 2 && Map[i][j + 1] == 2&&((Map[i][j - 1] == 0&&Map[i][j - 2] == 0&& j - 2 >= 0)||(Map[i][j + 1] == 0&&Map[i][j + 2] == 0&& j + 2 < 15))) {
if ((j - 1 >= 0 && Map[i][j - 1] == 0)) {
x = i, y = j - 1, flag = 0;
break;
}
if ((j + 2 < 15 && Map[i][j + 2] == 0)) {
x = i, y = j + 2, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i][j + 2] == 2 && j + 2 < 15) {
if (Map[i][j + 1] == 0) {
x = i, y = j + 1, flag = 0;
break;
}
}
}
}
for (int j = 0; j < 15 && flag; j++) {//进攻横2
for (int i = 0; i + 1 < 15 && flag; i++) {
if (Map[i][j] == 2 && Map[i + 1][j] == 2&&((Map[i - 1][j] == 0&&Map[i - 2][j] == 0&& i - 2 >= 0)||(Map[i + 1][j] == 0&&Map[i + 2][j] == 0&& i + 2 < 15))) {
if ((i - 1 >= 0 && Map[i - 1][j] == 0)) {
x = i - 1, y = j, flag = 0;
break;
}
if ((Map[i + 2][j] == 0 && i + 2 < 15)) {
x = i + 2, y = j, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 2][j] == 2 && i + 2 < 15) {
if (Map[i + 1][j] == 0) {
x = i + 1, y = j, flag = 0;
break;
}
}
}
}
for (int i = 0; flag && i + 1 < 15; i++) {//进攻左斜2
for (int j = 0; flag && j + 1 < 15; j++) {
if (Map[i][j] == 2 && Map[i + 1][j + 1] == 2&&((Map[i - 1][j - 1] == 0&&Map[i - 2][j - 2] == 0&& j - 2 >= 0&& i - 2 >= 0)||(Map[i + 1][j + 1] == 0&&Map[i + 2][j + 2] == 0&& i + 2 < 15&&j + 2 < 15))) {
if (i - 1 >= 0 && j + 1 >= 0 && Map[i - 1][j - 1] == 0) {
x = i - 1, y = j - 1, flag = 0;
break;
}
if (i + 2 < 15 && j + 2 < 15 && Map[i + 2][j + 2] == 0) {
x = i + 2, y = j + 2, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 2][j + 2] == 2 && i + 2 < 15 && j + 2 < 15) {
if (Map[i + 1][j + 1] == 0) {
x = i + 1, y = j + 1, flag = 0;
break;
}
}
}
}
for (int j = 14; flag && j - 1 >= 0; j--) {//进攻右斜2
for (int i = 0; flag && i + 1 < 15; i++) {
if (Map[i][j] == 2 && Map[i + 1][j - 1] == 2 && i + 1 < 15 && j - 1 >= 0&&((Map[i - 1][j - 1] == 0&&Map[i - 2][j - 2] == 0&& j - 2 >= 0&& i - 2 >= 0)||(Map[i + 1][j + 1] == 0&&Map[i + 2][j + 2] == 0&& i + 2 < 15&&j + 2 < 15))) {
if (i - 1 >= 0 && j + 1 < 15 && Map[i - 1][j + 1] == 0) {
x = i - 1, y = j + 1, flag = 0;
break;
}
if (i + 3 < 15 && j - 3 >= 0 && Map[i + 3][j - 3] == 0) {
x = i + 3, y = j - 3, flag = 0;
break;
}
}
if (Map[i][j] == 2 && Map[i + 2][j - 2] == 2 && i + 2 < 15 && j - 2 >= 0) {
if (Map[i + 1][j - 1] == 0) {
x = i + 1, y = j - 1, flag = 0;
break;
}
}
}
}
if (flag) {
srand((unsigned)time(NULL));
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
if (Map[i][j] == 2) {
int m = rand() % 3 - 1, n = rand() % 3 - 1;
if (Map[i + m][j + n] == 0 && i + m >= 0 && i + m < 15 && j + n >= 0 && j + n < 15) x = i + m, y = j + n, flag = 0;
}
}
}
}
while (x >= 15 || y >= 15 || x < 0 || y < 0 || Map[x][y] != 0) {
srand((unsigned)time(NULL));
x = rand() % 15, y = rand() % 15;
Pos(130, 30);
printf("机器人发生故障 请联系制作人");
}
Pos(130, 16);
printf("当前机器人下棋位置 x:%4d y:%4d", x + 1, y + 1);
pre2x = x, pre2y = y;
Map[x][y] = 2;
WhitePut(10 + 6*x, 3 + 3*y);
if (CheckWin(x, y, 2)) return true;
return false;
}
感谢观看!!