C语言判断五子棋是否即将获胜
#include <stdio.h>
int main() { int board[19][19]; // 存储棋盘状态 int i, j; // 循环计数器 int color; // 当前检查的颜色(1表示白色棋子,2表示黑色棋子) int count; // 连成线的棋子个数 int start_row, start_col, end_row, end_col; // 连线的起始位置和结束位置
// 读入棋盘状态
for(i = 0; i < 19; i++) {
for(j = 0; j < 19; j++) {
scanf('%d', &board[i][j]);
}
}
// 检查横向连线
for(i = 0; i < 19; i++) {
for(j = 0; j < 16; j++) { // 从左到右检查每个位置
if(board[i][j] == 0) continue; // 如果当前位置为空,则跳过
color = board[i][j]; // 记录当前检查的颜色
count = 1; // 初始化连线的棋子个数为1(当前位置)
start_row = i; // 连线的起始行为当前行
start_col = j; // 连线的起始列为当前列
while(j + count < 19 && board[i][j + count] == color) { // 检查当前位置右侧的棋子
count++; // 连线的棋子个数加1
}
if(count == 4 && (j == 0 || board[i][j - 1] == 0) && (j + count == 19 || board[i][j + count] == 0)) { // 如果连成4个棋子且两端至少有一端为空位置
end_row = i; // 连线的结束行为当前行
end_col = j + count - 1; // 连线的结束列为当前列加上连线的棋子个数减1
printf('%d:', color); // 输出即将获胜人的棋子颜色
printf('%d,%d
', start_row + 1, start_col + 1); // 输出连成4个棋子连线的起始位置 return 0; // 直接结束程序 } } }
// 检查纵向连线
for(j = 0; j < 19; j++) {
for(i = 0; i < 16; i++) { // 从上到下检查每个位置
if(board[i][j] == 0) continue; // 如果当前位置为空,则跳过
color = board[i][j]; // 记录当前检查的颜色
count = 1; // 初始化连线的棋子个数为1(当前位置)
start_row = i; // 连线的起始行为当前行
start_col = j; // 连线的起始列为当前列
while(i + count < 19 && board[i + count][j] == color) { // 检查当前位置下方的棋子
count++; // 连线的棋子个数加1
}
if(count == 4 && (i == 0 || board[i - 1][j] == 0) && (i + count == 19 || board[i + count][j] == 0)) { // 如果连成4个棋子且两端至少有一端为空位置
end_row = i + count - 1; // 连线的结束行为当前行加上连线的棋子个数减1
end_col = j; // 连线的结束列为当前列
printf('%d:', color); // 输出即将获胜人的棋子颜色
printf('%d,%d
', start_row + 1, start_col + 1); // 输出连成4个棋子连线的起始位置 return 0; // 直接结束程序 } } }
// 检查左上到右下的斜线连线
for(i = 0; i < 16; i++) {
for(j = 0; j < 16; j++) { // 从左上到右下检查每个位置
if(board[i][j] == 0) continue; // 如果当前位置为空,则跳过
color = board[i][j]; // 记录当前检查的颜色
count = 1; // 初始化连线的棋子个数为1(当前位置)
start_row = i; // 连线的起始行为当前行
start_col = j; // 连线的起始列为当前列
while(i + count < 19 && j + count < 19 && board[i + count][j + count] == color) { // 检查当前位置右下方的棋子
count++; // 连线的棋子个数加1
}
if(count == 4 && (i == 0 || j == 0 || board[i - 1][j - 1] == 0) && (i + count == 19 || j + count == 19 || board[i + count][j + count] == 0)) { // 如果连成4个棋子且两端至少有一端为空位置
end_row = i + count - 1; // 连线的结束行为当前行加上连线的棋子个数减1
end_col = j + count - 1; // 连线的结束列为当前列加上连线的棋子个数减1
printf('%d:', color); // 输出即将获胜人的棋子颜色
printf('%d,%d
', start_row + 1, start_col + 1); // 输出连成4个棋子连线的起始位置 return 0; // 直接结束程序 } } }
// 检查左下到右上的斜线连线
for(i = 3; i < 19; i++) {
for(j = 0; j < 16; j++) { // 从左下到右上检查每个位置
if(board[i][j] == 0) continue; // 如果当前位置为空,则跳过
color = board[i][j]; // 记录当前检查的颜色
count = 1; // 初始化连线的棋子个数为1(当前位置)
start_row = i; // 连线的起始行为当前行
start_col = j; // 连线的起始列为当前列
while(i - count >= 0 && j + count < 19 && board[i - count][j + count] == color) { // 检查当前位置右上方的棋子
count++; // 连线的棋子个数加1
}
if(count == 4 && (i == 18 || j == 0 || board[i + 1][j - 1] == 0) && (i - count < 0 || j + count == 19 || board[i - count][j + count] == 0)) { // 如果连成4个棋子且两端至少有一端为空位置
end_row = i - count + 1; // 连线的结束行为当前行减去连线的棋子个数加1
end_col = j + count - 1; // 连线的结束列为当前列加上连线的棋子个数减1
printf('%d:', color); // 输出即将获胜人的棋子颜色
printf('%d,%d
', start_row + 1, start_col + 1); // 输出连成4个棋子连线的起始位置 return 0; // 直接结束程序 } } }
printf('No
'); // 如果没有人获胜,则输出No return 0; }
原文地址: https://www.cveoy.top/t/topic/o0lm 著作权归作者所有。请勿转载和采集!