制作网站管理系统,常用网站logo,宁波商城网站建设,wordpress zip这里写目录标题 一、最终效果二、菜单打印函数三、棋盘的初始化和打印四、 人人对战4.1 落子判空函数4.2 悔棋函数4.3 判胜负函数4.4 人人对战 五、人机对战5.1 是将直接调用rand生成随机值#xff0c;这就不可控5.2 是根据棋子赢面来判断哪里落子最好 六、如果选择退出程序直… 这里写目录标题 一、最终效果二、菜单打印函数三、棋盘的初始化和打印四、 人人对战4.1 落子判空函数4.2 悔棋函数4.3 判胜负函数4.4 人人对战 五、人机对战5.1 是将直接调用rand生成随机值这就不可控5.2 是根据棋子赢面来判断哪里落子最好 六、如果选择退出程序直接exit就行七、主函数调用逻辑八、源代码 一、最终效果 五子棋c语言实现 二、菜单打印函数
使用这个函数来接收用户选择的模式并通过返回值返回。 逻辑是使用一个死循环来打印根据玩家输入的数来判断进入什么模式输入错误数字就不出循环正确就出循环。
int menu()
{int choice -1;while (1){printf(----------------欢迎使用五子棋------------------------\n);printf(- 请选择模式 -\n);printf(- 1.人-人对战游戏 -\n);printf(- 2.人-机对战游戏 -\n);printf(- 0.退出游戏 -\n);printf(------------------------------------------------------\n);printf(------------------------------------------------------\n);scanf(%d, choice);if (choice 4 || choice 0)printf(错误输入);elsebreak;}return choice;
}三、棋盘的初始化和打印
在这个函数中将表示棋盘的二维数组初始化为空状态并通过棋盘数组的只来打印棋盘。打印棋盘时用到的符号┏ ┳ ┓┣ ╋ ┫┗ ┻ ┛。要注意有些地方添加━和空格来控制打印的棋盘是正确的。 里面每一次打印都调用draw_chessman这个函数在这个函数中将根据数组值来判断如何打印。
//绘制棋子
void draw_chessman(int type, char* tableline) {if (type WHITE)printf( ●);if (type BLACK)printf( ○);if (type NO)printf(%s, tableline);
}打印棋盘的逻辑就是因为没能设置光标坐标那就只有一行一行打印然后根据边界行列值来判断。 如果要看如何打印改变光标可以参考这篇文章win32 API
void initMap(int map[N 1][N 1])
{//第一行和第一列显示数字for (int i 0; i N 1; i){map[0][i] i;map[i][0] i;if (i 10){map[0][i] i - 10;map[i][0] i - 10;}}for (int i 0; i N 1; i){//打印第一行数字if (i 0){for (int j 0; j N 1; j){printf(%-2d, map[0][j]);}printf(\n);}//打印第一行棋盘else if (i 1){for (int j 0; j N 1; j){if (j 0)printf(%d, map[i][j]);else if (j 1)draw_chessman(map[i][j], ┏);else if (j N)draw_chessman(map[i][j], ━┓);elsedraw_chessman(map[i][j], ━┳);}printf(\n);}//打印最后一行else if (i N){for (int j 0; j N 1; j){if (j 0)printf(%d, map[i][j]);else if (j 1)draw_chessman(map[i][j], ┗);else if (j N)draw_chessman(map[i][j], ━┛);elsedraw_chessman(map[i][j], ━┻);}printf(\n);}else{for (int j 0; j N 1; j){if (j 0)printf(%d, map[i][j]);else if (j 1)draw_chessman(map[i][j], ┣);else if (j N)draw_chessman(map[i][j], ━┫);elsedraw_chessman(map[i][j], ━╋);}printf(\n);}}
}四、 人人对战
人人对战逻辑中就是先让黑方下棋输入坐标输入错误就再次输入死循环实现将该坐标的二维数组值变为黑然后让其选择悔不悔棋我实现的是只要1是悔棋其他数字就是不悔棋。执行完不悔棋后就判断是否胜利如果胜就跳出选择是否重来一局如果没胜就白棋下执行相同逻辑。
4.1 落子判空函数
在这个函数中判断坐标代表的二维数组值是不是空不是就重新输入坐标。
void judgeEmpty(int map[][N 1], int x, int y, int goal)
{while (1){if (map[x][y] ! NO){printf(已有棋子重新输入\n);scanf(%d%d, x, y);}else{map[x][y] goal;initMap(map);break;}}
}4.2 悔棋函数
该函数里面就是根据用户选择如果悔棋然后将刚才的地方的数组值变回空。
int retract(int map[][N 1], int x, int y)
{int choice -1;printf(是否悔棋是1\n);scanf(%d, choice);if (choice 1){map[x][y] NO;initMap(map);}return choice;
}执行完不悔棋后就判断是否胜利
4.3 判胜负函数
这个函数就是将下的这个棋子的横竖斜方向判胜负。没有判断和棋情况如果要判断就是二维数组全不为空状态使用遍历判断就行。
int judgeWin(int map[][N 1], int x, int y)
{for (int i 1; i N 1; i){for (int j 1; j N 1; j){if (j N 1 - 4 (map[i][j] BLACK || map[i][j] WHITE))//横{if (map[i][j] map[i][j 1] map[i][j 1] map[i][j 2] map[i][j 2] map[i][j 3] map[i][j 3] map[i][j 4])return map[i][j];}if (i N 1 - 4 (map[i][j] BLACK || map[i][j] WHITE))//竖{if (map[i][j] map[i 1][j] map[i 1][j] map[i 2][j] map[i 2][j] map[i 3][j] map[i 3][j] map[i 4][j])return map[i][j];}if (i N 1 - 4 j N 1 - 4 (map[i][j] BLACK || map[i][j] WHITE))//右下_{if (map[i][j] map[i 1][j 1] map[i 1][j 1] map[i 2][j 2] map[i 2][j 2] map[i 3][j 3] map[i 3][j 3] map[i 4][j 4])return map[i][j];}if (i 4 j 4 (map[i][j] BLACK || map[i][j] WHITE))//右上{if (map[i][j] map[i - 1][j - 1] map[i - 1][j - 1] map[i - 2][j - 2] map[i - 2][j - 2] map[i - 3][j - 3] map[i - 3][j - 3] map[i - 4][j - 4])return map[i][j];}}}return NO;
}
4.4 人人对战
void peopleFight(int map[][N 1])
{printf(--------人-人对战---------------\n);initMap(map);while (1){int x -1;int y -1;black:while (1){printf(黑方落子\n);printf(请输入要落下的坐标现在棋盘为%d*%d\n, N, N);scanf(%d%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, BLACK);if (retract(map, x, y) 1)goto black;//判断胜利int ret judgeWin(map, x, y);if (ret BLACK){printf(黑方获胜\n);return;}else if (ret WHITE){printf(白方获胜\n);return;}white:while (1){printf(白方落子\n);printf(请输入要落下的坐标现在棋盘为%d*%d\n, N, N);scanf(%d%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, WHITE);if (retract(map, x, y) 1)goto white;//判断胜利ret judgeWin(map, x, y);if (ret BLACK){printf(黑方获胜\n);return;}else if (ret WHITE){printf(白方获胜\n);return;}}
}五、人机对战
在这个函数中用户选择落子方然后执行逻辑与人人对战一样。 但是电脑生成棋子提供两种选择
5.1 是将直接调用rand生成随机值这就不可控
方法一这样写对棋子的位置生成是很不可控的会让机器随机乱落子。
void machine(int map[][N 1])
{printf(--------人-机对战---------------\n);srand(time(NULL));int choice -1;printf(请输入你执黑棋还是白棋黑1白2\n);scanf(%d, choice);if (choice 1){while (1){int x -1;int y -1;black:while (1){printf(黑方落子\n);printf(请输入要落下的坐标现在棋盘为%d*%d\n, N, N);scanf(%d%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, BLACK);//判断胜利int ret judgeWin(map, x, y);if (ret BLACK){printf(黑方获胜\n);return;}else if (ret WHITE){printf(白方获胜\n);return;}if (retract(map, x, y) 1)goto black;next:x rand() % 15 1;y rand() % 15 1;if (map[x][y] ! NO)goto next;judgeEmpty(map, x, y, WHITE);//判断胜利ret judgeWin(map, x, y);if (ret BLACK){printf(黑方获胜\n);return;}else if (ret WHITE){printf(白方获胜\n);return;}}}else if (choice 2){while (1){int x -1;int y -1;next2:x rand() % 15 1;y rand() % 15 1;if (map[x][y] ! NO)goto next2;judgeEmpty(map, x, y, BLACK);//判断胜利int ret judgeWin(map, x, y);if (ret BLACK){printf(黑方获胜\n);return;}else if (ret WHITE){printf(白方获胜\n);return;}white:while (1){printf(白方落子\n);printf(请输入要落下的坐标现在棋盘为%d*%d\n, N, N);scanf(%d%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, WHITE);//判断胜利ret judgeWin(map, x, y);if (ret BLACK){printf(黑方获胜\n);return;}else if (ret WHITE){printf(白方获胜\n);return;}if (retract(map, x, y) 1)goto white;}}}5.2 是根据棋子赢面来判断哪里落子最好
这样实现就会让机器落子一直是去围堵你的棋子虽然还是很垃圾但是比方法一好多了。
void AIjudge(int color, int map[N1][N1])
{int num 1, left 0, right 0;int n, m, score 0, max 0;int dx, dy;for (int i 1; i N1; i){for (int j 1; j N1; j){score 0;if (map[i][j] ! 0)continue;else{dx 1, dy 0, n i, m j;while (1)//水平向右{n dx, m dy;if (map[n][m] 0){right 0; break;}else if (map[n][m] ! color || n 15){right; break;}else if (num 5) { num; }}dx -1, dy 0;while (1) {//水平向左n dx; m dy;if (map[n][m] 0) { left 0; break; }else if (map[n][m] ! color || n 1) { left; break; }else if (num 5) { num; }}score Data(num, right left);//用data来算分数并用score来记录// |方向num 1; right 0, left 0;//每一次改变方向要重置这些变量dx 0; dy -1; n i; m j;//向上while (1) {n dx; m dy;if (map[n][m] 0) { left 0; break; }else if (map[n][m] ! color || m 1) { left; break; }else if (num 5) { num; }}//向下dx 0; dy 1; n i; m j;while (1) {n dx; m dy;if (map[n][m] 0) { right 0; break; }else if (map[n][m] ! color || m 15) { right; break; }else if (num 5) { num; }}score Data(num, right left);// \方向num 1; right 0, left 0;dx 1; dy 1; n i; m j;//向右下while (1) {n dx; m dy;if (map[n][m] 0) { right 0; break; }else if (map[n][m] ! color || m 15 || n 15) { right; break; }else if (num 5) { num; }}//向左上dx -1; dy -1; n i; m j;while (1) {n dx; m dy;if (n 0 m 0 map[n][m] 0) { left 0; break; }else if ((n 0 m 0 map[n][m] ! color) || m 1 || n 1) { left; break; }else if (num 5) { num; }}score Data(num, right left);// /方向num 1; right 0, left 0;dx 1; dy -1; n i; m j;//向右上while (1) {n dx; m dy;if (map[n][m] 0) { right 0; break; }else if (map[n][m] ! color || n 15 || m 1) { right; break; }else if (num 5) { num; }}//向左下dx -1; dy 1; n i; m j;while (1) {n dx; m dy;if (n 0 m 0 map[n][m] 0) { left 0; break; }else if ((n 0 m 0 map[n][m] ! color) || n 1 || m 15) { left; break; }else if (num 5) { num; }}score Data(num, right left);if (score max) {//每一次用max保存分数下一次比较最后找出最大值max score;position[0] i;//用来保存每一次的位置和分数position[1] j;position[2] score;}}}}
}
int Data(int num, int count)
{switch (num){case 1: if (count 0)//活一:表示在该处落子就只有这一个棋子两边都没有阻挡边界或对方的棋子优势较大return 2;else if (count 1)//冲一表示在该处落子就只有这一个棋子两边有一种阻挡边界或对方的棋子优势较小return 1;else return 0;break;case 2:if (count 0)//活二接下来都同理活一和冲一return 20;else if (count 1)//冲二return 10;else return 0;break;case 3:if (count 0)//活三return 300;else if (count 1)//冲三return 50;else return 0;break;case 4:if (count 0)//活四return 4000;else if (count 1)//冲四return 1000;else return 0;break;case 5://五return 5000;break;default:return 0;break;}
}
void machine(int map[][N 1])
{printf(--------人-机对战---------------\n);int choice -1;do {printf(请输入你执黑棋还是白棋黑1白2\n);scanf(%d, choice);} while (choice ! 1 choice ! 2);initMap(map);if (choice 1){while (1){int x -1;int y -1;black:while (1){printf(黑方落子\n);printf(现在棋盘为%d*%d请输入要落下的坐标x y\n, N, N);scanf(%d%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, BLACK);if (retract(map, x, y)){map[x][y] 0;initMap(map);goto black;}int ret judgeWin(map, x, y);if (ret BLACK) //判断胜利break;int old_max 0, new_max 0, n 0, m 0;int AIx -1, AIy -1;AIjudge(1, map);//判断黑子的优势位置old_max position[2];//保存该位置分数AIx position[0]; AIy position[1];//保存该位置的坐标注意行列和xy轴的对应关系position[0] 0, position[1] 0, position[2] 0;AIjudge(-1, map);//判断白子的优势位置new_max position[2];//保存分数if (new_max old_max) //判断哪个位置的分数大从而判断是堵截还是进攻{AIx position[0]; AIy position[1];}judgeEmpty(map, AIx, AIy, WHITE);ret judgeWin(map, x, y);if (ret WHITE) //判断胜利break;}}else if (choice 2){while (1){int x -1, y -1;int old_max 0, new_max 0, n 0, m 0;int AIx -1, AIy -1;AIjudge(1, map);//判断黑子的优势位置old_max position[2];//保存该位置分数AIx position[0]; AIy position[1];//保存该位置的坐标注意行列和xy轴的对应关系position[0] 0, position[1] 0, position[2] 0;AIjudge(-1, map);//判断白子的优势位置new_max position[2];//保存分数if (new_max old_max) //判断哪个位置的分数大从而判断是堵截还是进攻{AIx position[0]; AIy position[1];}judgeEmpty(map, AIx, AIy, BLACK);int ret judgeWin(map, x, y);if (ret BLACK) //判断胜利 break;white:while (1){printf(白方落子\n);printf(现在棋盘为%d*%d请输入要落下的坐标x y\n, N, N);scanf(%d,%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, WHITE);if (retract(map, x, y)){map[x][y] 0;initMap(map);goto white;}ret judgeWin(map, x, y);if (ret WHITE) //判断胜利break;}}}六、如果选择退出程序直接exit就行
七、主函数调用逻辑
用死循环调用然后根据menu返回值通过switch-case来调用相应模式函数最后在让用户选择是否再来一局如果再来一局就不出循环不再来就出循环。
int main()
{while (1){int map[N 1][N 1] { 0 };int choice menu();switch (choice){case 1://调用人人对打peopleFight(map);break;case 2://调用人机对打machine(map);break;case 0:printf(退出成功\n);exit(0);break;}int a 0;printf(是否再来一盘是1不是0\n);scanf(%d, a);if (a 0)break;}return 0;
}八、源代码
源码呈上为方便复制写在同一个文件之下可以多文件进行。
# define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#include stdlib.h
#includetime.h
#define N 15 //表示棋盘的行列
#define NO 0 //表示没下子的状态
#define BLACK 1
#define WHITE -1
//棋盘初始化函数
void initMap(int map[N 1][N 1]);
//落子函数
void judgeEmpty(int map[][N 1], int x, int y, int goal);
//人人对打
void peopleFight(int map[][N 1]);
//判断胜利
int judgeWin(int map[][N 1], int x, int y);
//悔棋
int retract(int map[][N 1], int x, int y);
//人机对打
void machine(int map[][N 1]);
//打印菜单并返回选择的模式
int menu();
void AIjudge(int color, int map[N 1][N 1]);
int Data(int num, int count);
int position[3];int main()
{while (1){int map[N 1][N 1] { 0 };int choice menu();switch (choice){case 1://调用人人对打peopleFight(map);break;case 2://调用人机对打machine(map);break;case 0:printf(退出成功\n);exit(0);break;}int a 0;printf(是否再来一盘是1不是0\n);scanf(%d, a);if (a 0)break;}return 0;
}
int menu()
{int choice -1;while (1){printf(----------------欢迎使用五子棋------------------------\n);printf(- 请选择模式 -\n);printf(- 1.人-人对战游戏 -\n);printf(- 2.人-机对战游戏 -\n);printf(- 0.退出游戏 -\n);printf(------------------------------------------------------\n);printf(------------------------------------------------------\n);scanf(%d, choice);if (choice 4 || choice 0)printf(错误输入);elsebreak;}return choice;
}void judgeEmpty(int map[][N 1], int x, int y, int goal)
{while (1){if (map[x][y] ! NO){printf(已有棋子重新输入\n);scanf(%d%d, x, y);}else{map[x][y] goal;initMap(map);break;}}
}int judgeWin(int map[][N 1], int x, int y)
{for (int i 1; i N 1; i){for (int j 1; j N 1; j){if (j N 1 - 4 (map[i][j] BLACK || map[i][j] WHITE))//横{if (map[i][j] map[i][j 1] map[i][j 1] map[i][j 2] map[i][j 2] map[i][j 3] map[i][j 3] map[i][j 4])return map[i][j];}if (i N 1 - 4 (map[i][j] BLACK || map[i][j] WHITE))//竖{if (map[i][j] map[i 1][j] map[i 1][j] map[i 2][j] map[i 2][j] map[i 3][j] map[i 3][j] map[i 4][j])return map[i][j];}if (i N 1 - 4 j N 1 - 4 (map[i][j] BLACK || map[i][j] WHITE))//右下_{if (map[i][j] map[i 1][j 1] map[i 1][j 1] map[i 2][j 2] map[i 2][j 2] map[i 3][j 3] map[i 3][j 3] map[i 4][j 4])return map[i][j];}if (i 4 j 4 (map[i][j] BLACK || map[i][j] WHITE))//右上{if (map[i][j] map[i - 1][j - 1] map[i - 1][j - 1] map[i - 2][j - 2] map[i - 2][j - 2] map[i - 3][j - 3] map[i - 3][j - 3] map[i - 4][j - 4])return map[i][j];}}}return NO;
}//绘制棋子
void draw_chessman(int type, char* tableline) {if (type WHITE)printf( ●);if (type BLACK)printf( ○);if (type NO)printf(%s, tableline);
}void initMap(int map[N 1][N 1])
{//第一行和第一列显示数字for (int i 0; i N 1; i){map[0][i] i;map[i][0] i;if (i 10){map[0][i] i - 10;map[i][0] i - 10;}}for (int i 0; i N 1; i){//打印第一行数字if (i 0){for (int j 0; j N 1; j){printf(%-2d, map[0][j]);}printf(\n);}//打印第一行棋盘else if (i 1){for (int j 0; j N 1; j){if (j 0)printf(%d, map[i][j]);else if (j 1)draw_chessman(map[i][j], ┏);else if (j N)draw_chessman(map[i][j], ━┓);elsedraw_chessman(map[i][j], ━┳);}printf(\n);}//打印最后一行else if (i N){for (int j 0; j N 1; j){if (j 0)printf(%d, map[i][j]);else if (j 1)draw_chessman(map[i][j], ┗);else if (j N)draw_chessman(map[i][j], ━┛);elsedraw_chessman(map[i][j], ━┻);}printf(\n);}else{for (int j 0; j N 1; j){if (j 0)printf(%d, map[i][j]);else if (j 1)draw_chessman(map[i][j], ┣);else if (j N)draw_chessman(map[i][j], ━┫);elsedraw_chessman(map[i][j], ━╋);}printf(\n);}}
}//void machine(int map[][N 1])
//{
// printf(--------人-机对战---------------\n);
// srand(time(NULL));
// int choice -1;
// printf(请输入你执黑棋还是白棋黑1白2\n);
// scanf(%d, choice);
// if (choice 1)
// {
// while (1)
// {
// int x -1;
// int y -1;
// black:
// while (1)
// {
// printf(黑方落子\n);
// printf(请输入要落下的坐标现在棋盘为%d*%d\n, N, N);
// scanf(%d%d, x, y);
// if (x 0 || x N || y 0 || y N)
// printf(错误输入\n);
// else
// break;
// }
// judgeEmpty(map, x, y, BLACK);
// //判断胜利
// int ret judgeWin(map, x, y);
// if (ret BLACK)
// {
// printf(黑方获胜\n);
// return;
// }
// else if (ret WHITE)
// {
// printf(白方获胜\n);
// return;
// }
// if (retract(map, x, y) 1)
// goto black;
// next:
// x rand() % 15 1;
// y rand() % 15 1;
// if (map[x][y] ! NO)
// goto next;
// judgeEmpty(map, x, y, WHITE);
// //判断胜利
// ret judgeWin(map, x, y);
// if (ret BLACK)
// {
// printf(黑方获胜\n);
// return;
// }
// else if (ret WHITE)
// {
// printf(白方获胜\n);
// return;
// }
// }
// }
// else if (choice 2)
// {
// while (1)
// {
// int x -1;
// int y -1;
// next2:
// x rand() % 15 1;
// y rand() % 15 1;
// if (map[x][y] ! NO)
// goto next2;
// judgeEmpty(map, x, y, BLACK);
// //判断胜利
// int ret judgeWin(map, x, y);
// if (ret BLACK)
// {
// printf(黑方获胜\n);
// return;
// }
// else if (ret WHITE)
// {
// printf(白方获胜\n);
// return;
// }
// white:
// while (1)
// {
// printf(白方落子\n);
// printf(请输入要落下的坐标现在棋盘为%d*%d\n, N, N);
// scanf(%d%d, x, y);
// if (x 0 || x N || y 0 || y N)
// printf(错误输入\n);
// else
// break;
// }
// judgeEmpty(map, x, y, WHITE);
// //判断胜利
// ret judgeWin(map, x, y);
// if (ret BLACK)
// {
// printf(黑方获胜\n);
// return;
// }
// else if (ret WHITE)
// {
// printf(白方获胜\n);
// return;
// }
// if (retract(map, x, y) 1)
// goto white;
//
// }
// }
//
//}void peopleFight(int map[][N 1])
{printf(--------人-人对战---------------\n);initMap(map);while (1){int x -1;int y -1;black:while (1){printf(黑方落子\n);printf(请输入要落下的坐标现在棋盘为%d*%d\n, N, N);scanf(%d%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, BLACK);if (retract(map, x, y) 1)goto black;//判断胜利int ret judgeWin(map, x, y);if (ret BLACK){printf(黑方获胜\n);return;}else if (ret WHITE){printf(白方获胜\n);return;}white:while (1){printf(白方落子\n);printf(请输入要落下的坐标现在棋盘为%d*%d\n, N, N);scanf(%d%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, WHITE);if (retract(map, x, y) 1)goto white;//判断胜利ret judgeWin(map, x, y);if (ret BLACK){printf(黑方获胜\n);return;}else if (ret WHITE){printf(白方获胜\n);return;}}
}int retract(int map[][N 1], int x, int y)
{int choice -1;printf(是否悔棋是1\n);scanf(%d, choice);if (choice 1){map[x][y] NO;initMap(map);}return choice;
}
void AIjudge(int color, int map[N1][N1])
{int num 1, left 0, right 0;int n, m, score 0, max 0;int dx, dy;for (int i 1; i N1; i){for (int j 1; j N1; j){score 0;if (map[i][j] ! 0)continue;else{dx 1, dy 0, n i, m j;while (1)//水平向右{n dx, m dy;if (map[n][m] 0){right 0; break;}else if (map[n][m] ! color || n 15){right; break;}else if (num 5) { num; }}dx -1, dy 0;while (1) {//水平向左n dx; m dy;if (map[n][m] 0) { left 0; break; }else if (map[n][m] ! color || n 1) { left; break; }else if (num 5) { num; }}score Data(num, right left);//用data来算分数并用score来记录// |方向num 1; right 0, left 0;//每一次改变方向要重置这些变量dx 0; dy -1; n i; m j;//向上while (1) {n dx; m dy;if (map[n][m] 0) { left 0; break; }else if (map[n][m] ! color || m 1) { left; break; }else if (num 5) { num; }}//向下dx 0; dy 1; n i; m j;while (1) {n dx; m dy;if (map[n][m] 0) { right 0; break; }else if (map[n][m] ! color || m 15) { right; break; }else if (num 5) { num; }}score Data(num, right left);// \方向num 1; right 0, left 0;dx 1; dy 1; n i; m j;//向右下while (1) {n dx; m dy;if (map[n][m] 0) { right 0; break; }else if (map[n][m] ! color || m 15 || n 15) { right; break; }else if (num 5) { num; }}//向左上dx -1; dy -1; n i; m j;while (1) {n dx; m dy;if (n 0 m 0 map[n][m] 0) { left 0; break; }else if ((n 0 m 0 map[n][m] ! color) || m 1 || n 1) { left; break; }else if (num 5) { num; }}score Data(num, right left);// /方向num 1; right 0, left 0;dx 1; dy -1; n i; m j;//向右上while (1) {n dx; m dy;if (map[n][m] 0) { right 0; break; }else if (map[n][m] ! color || n 15 || m 1) { right; break; }else if (num 5) { num; }}//向左下dx -1; dy 1; n i; m j;while (1) {n dx; m dy;if (n 0 m 0 map[n][m] 0) { left 0; break; }else if ((n 0 m 0 map[n][m] ! color) || n 1 || m 15) { left; break; }else if (num 5) { num; }}score Data(num, right left);if (score max) {//每一次用max保存分数下一次比较最后找出最大值max score;position[0] i;//用来保存每一次的位置和分数position[1] j;position[2] score;}}}}
}
int Data(int num, int count)
{switch (num){case 1: if (count 0)//活一:表示在该处落子就只有这一个棋子两边都没有阻挡边界或对方的棋子优势较大return 2;else if (count 1)//冲一表示在该处落子就只有这一个棋子两边有一种阻挡边界或对方的棋子优势较小return 1;else return 0;break;case 2:if (count 0)//活二接下来都同理活一和冲一return 20;else if (count 1)//冲二return 10;else return 0;break;case 3:if (count 0)//活三return 300;else if (count 1)//冲三return 50;else return 0;break;case 4:if (count 0)//活四return 4000;else if (count 1)//冲四return 1000;else return 0;break;case 5://五return 5000;break;default:return 0;break;}
}
void machine(int map[][N 1])
{printf(--------人-机对战---------------\n);int choice -1;do {printf(请输入你执黑棋还是白棋黑1白2\n);scanf(%d, choice);} while (choice ! 1 choice ! 2);initMap(map);if (choice 1){while (1){int x -1;int y -1;black:while (1){printf(黑方落子\n);printf(现在棋盘为%d*%d请输入要落下的坐标x y\n, N, N);scanf(%d%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, BLACK);if (retract(map, x, y)){map[x][y] 0;initMap(map);goto black;}int ret judgeWin(map, x, y);if (ret BLACK) //判断胜利break;int old_max 0, new_max 0, n 0, m 0;int AIx -1, AIy -1;AIjudge(1, map);//判断黑子的优势位置old_max position[2];//保存该位置分数AIx position[0]; AIy position[1];//保存该位置的坐标注意行列和xy轴的对应关系position[0] 0, position[1] 0, position[2] 0;AIjudge(-1, map);//判断白子的优势位置new_max position[2];//保存分数if (new_max old_max) //判断哪个位置的分数大从而判断是堵截还是进攻{AIx position[0]; AIy position[1];}judgeEmpty(map, AIx, AIy, WHITE);ret judgeWin(map, x, y);if (ret WHITE) //判断胜利break;}}else if (choice 2){while (1){int x -1, y -1;int old_max 0, new_max 0, n 0, m 0;int AIx -1, AIy -1;AIjudge(1, map);//判断黑子的优势位置old_max position[2];//保存该位置分数AIx position[0]; AIy position[1];//保存该位置的坐标注意行列和xy轴的对应关系position[0] 0, position[1] 0, position[2] 0;AIjudge(-1, map);//判断白子的优势位置new_max position[2];//保存分数if (new_max old_max) //判断哪个位置的分数大从而判断是堵截还是进攻{AIx position[0]; AIy position[1];}judgeEmpty(map, AIx, AIy, BLACK);int ret judgeWin(map, x, y);if (ret BLACK) //判断胜利 break;white:while (1){printf(白方落子\n);printf(现在棋盘为%d*%d请输入要落下的坐标x y\n, N, N);scanf(%d,%d, x, y);if (x 0 || x N || y 0 || y N)printf(错误输入\n);elsebreak;}judgeEmpty(map, x, y, WHITE);if (retract(map, x, y)){map[x][y] 0;initMap(map);goto white;}ret judgeWin(map, x, y);if (ret WHITE) //判断胜利break;}}}