不多哔哔直接上代码,总体代码在最后
效果图:
![](https://img-blog.csdnimg.cn/direct/be60e95d02024bd09fbce099bbbd09bc.png)
代码结构:
#include <stdio.h>
#include <stdlib.h>
int pan[10][10] = {0}; // 棋盘
int x = 0, y = 0; // x,y坐标
// 函数声明
void qipan();
void xiaqi(int n);
void panduan(int x, int y, int n);
void win(int n);
int main() {
qipan();
while (1) {
xiaqi(1); // 黑棋落子
xiaqi(2); // 白棋落子
}
return 0;
}
打印棋盘,要是觉得太宽就去掉一个\n
void qipan() {
printf("坐标\t");
for (int i = 0; i < 10; i++) {
printf("%d\t", i + 1);
}
printf("\n\n");
for (int i = 0; i < 10; i++) {
printf("%d\t", i + 1);
for (int m = 0; m < 10; m++) {
printf("%d\t", pan[i][m]);
}
printf("\n\n");
}
}
下棋函数:
void xiaqi(int n) {
int valid = 0;
while (!valid) {
printf("请%s棋选择落子(输入棋子的坐标):\n", n == 1 ? "黑" : "白");
scanf("%d %d", &x, &y);
if (x < 1 || x > 10 || y < 1 || y > 10 || pan[y - 1][x - 1] != 0) {
printf("输入无效,请重新输入!\n");
} else {
pan[y - 1][x - 1] = (n == 1) ? 11 : 22;
valid = 1;
}
}
qipan(); // 落子后打印更新后的棋盘
panduan(y - 1, x - 1, n); // 检查是否获胜
}
判断是否获胜:
void panduan(int x, int y, int n) {
for (int dir = 0; dir < 4; ++dir) { // 四个方向检查
int dx[] = {1, 0, 1, 1}; // 方向数组
int dy[] = {0, 1, 1, -1}; // 方向数组
int cnt = 1; // 计数器
for (int i = -1; i <= 1; i += 2) { // 检查两个方向
for (int k = 1; k < 5; ++k) {
int nx = x + dx[dir] * k * i;
int ny = y + dy[dir] * k * i;
if (nx >= 0 && nx < 10 && ny >= 0 && ny < 10 && pan[nx][ny] == pan[x][y]) {
cnt++;
} else {
break;
}
}
}
if (cnt >= 5) { // 如果有连续的5个棋子
win(n);
}
}
}
总体代码:
#include <stdio.h>
#include <stdlib.h>
int pan[10][10] = {0}; // 棋盘
int x = 0, y = 0; // x,y坐标
void qipan() {
printf("坐标\t");
for (int i = 0; i < 10; i++) {
printf("%d\t", i + 1);
}
printf("\n\n");
for (int i = 0; i < 10; i++) {
printf("%d\t", i + 1);
for (int m = 0; m < 10; m++) {
printf("%d\t", pan[i][m]);
}
printf("\n\n");
}
}
void xiaqi(int n) {
int valid = 0;
while (!valid) {
printf("请%s棋选择落子(输入棋子的坐标):\n", n == 1 ? "黑" : "白");
scanf("%d %d", &x, &y);
if (x < 1 || x > 10 || y < 1 || y > 10 || pan[y - 1][x - 1] != 0) {
printf("输入无效,请重新输入!\n");
} else {
pan[y - 1][x - 1] = (n == 1) ? 11 : 22;
valid = 1;
}
}
qipan();
panduan(y - 1, x - 1, n);
}
void panduan(int x, int y, int n) {
for (int dir = 0; dir < 4; ++dir) { // 四个方向检查
int dx[] = {1, 0, 1, 1}; // 方向数组
int dy[] = {0, 1, 1, -1}; // 方向数组
int cnt = 1; // 计数器
for (int i = -1; i <= 1; i += 2) { // 检查两个方向
for (int k = 1; k < 5; ++k) {
int nx = x + dx[dir] * k * i;
int ny = y + dy[dir] * k * i;
if (nx >= 0 && nx < 10 && ny >= 0 && ny < 10 && pan[nx][ny] == pan[x][y]) {
cnt++;
} else {
break;
}
}
}
if (cnt >= 5) { // 如果有连续的5个棋子
win(n);
}
}
}
void win(int n) {
printf("%s棋赢了!!\n", n == 1 ? "黑" : "白");
exit(0);
}
int main() {
qipan();
while (1) {
xiaqi(1);
xiaqi(2);
}
return 0;
}