
本文在原“三子棋”项目基础上全面升级,实现了一个通用的 N 子棋(NxN 棋盘,可自定义连线数量) 玩家对战版! 支持两个玩家实时对战、任意棋盘大小(如10×10)、自定义获胜条件(如连5即胜)。
功能模块 | 描述 |
|---|---|
双人对战 | 玩家1使用“X”,玩家2使用“#”,轮流输入坐标对战 |
动态棋盘 | 棋盘大小(ROW、COL)与胜利连线数(N)可自定义 |
自动判胜 | 支持行、列、对角线、反对角线四方向连续判断 |
清屏刷新 | 每回合自动刷新棋盘,清晰显示对局进程 |
防误输入 | 坐标越界与重复落子自动提示重新输入 |
胜负提示 | 支持玩家1胜、玩家2胜、平局三种结局提示 |
重启机制 | 每局结束后自动等待2秒回到菜单界面 |
#define ROW 10 // 棋盘行数
#define COL 10 // 棋盘列数
#define N 5 // 连成N个即获胜(例如5表示五子连珠)通过宏定义,你可以轻松改造成:
整个逻辑完全复用,无需修改核心代码。
.c源文件
│
├── menu() // 游戏菜单界面
├── game() // 主游戏逻辑(循环玩家1与玩家2下棋)
├── InitBoard() // 初始化棋盘为空格
├── PrintBoard() // 打印棋盘
├── Play1Board() // 玩家1输入坐标
├── Play2Board() // 玩家2输入坐标
├── IsFull() // 判断棋盘是否已满
└── IsWin() // 判断是否有玩家获胜该设计将输入逻辑、棋盘显示与胜负判断完全解耦。
1️⃣ 程序启动后进入菜单界面:
********************************
******* 1. play *******
******* 0. exit *******
********************************2️⃣ 输入“1”开始游戏,打印初始棋盘: 3️⃣ 玩家1输入坐标(行 列),下“X”; 4️⃣ 玩家2输入坐标,下“#”; 5️⃣ 每步自动判断胜负;若尚未结束则刷新棋盘; 6️⃣ 若一方连成 N 子,则输出胜利信息并延时返回菜单。
宏观思路:
此部分源码:
// 判断棋盘是否还有空位
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
if (board[i][j] == ' ')
return 0;
return 1;
}
// 判断是否有人获胜
int IsWin(char board[ROW][COL], int row, int col)
{
// 检查行
for (int i = 0; i < row; i++)
{
for (int j = 0; j <= col - N; j++)
{
int count = 0;
char ch = board[i][j];
for (int k = 0; k < N; k++)
{
if (board[i][j + k] == ch && ch != ' ')
count++;
else
break;
}
if (count == N)
return (ch == 'X') ? 'F' : 'S';
}
}
// 检查列
for (int i = 0; i <= row - N; i++)
{
for (int j = 0; j < col; j++)
{
int count = 0;
char ch = board[i][j];
for (int k = 0; k < N; k++)
{
if (board[i + k][j] == ch && ch != ' ')
count++;
else
break;
}
if (count == N)
return (ch == 'X') ? 'F' : 'S';
}
}
// 检查对角线
for (int i = 0; i <= row - N; i++)
{
for (int j = 0; j <= col - N; j++)
{
int count = 0;
char ch = board[i][j];
for (int k = 0; k < N; k++)
{
if (board[i + k][j + k] == ch && ch != ' ')
count++;
else
break;
}
if (count == N)
return (ch == 'X') ? 'F' : 'S';
}
}
// 检查反对角线
for (int i = 0; i <= row - N; i++)
{
for (int j = N - 1; j < col; j++)
{
int count = 0;
char ch = board[i][j];
for (int k = 0; k < N; k++)
{
if (board[i + k][j - k] == ch && ch != ' ')
count++;
else
break;
}
if (count == N)
return (ch == 'X') ? 'F' : 'S';
}
}
// 判断是否平局
if (IsFull(board, row, col))
return 'P';
return 'C';
}其余部分源码均在之前的文章:三子棋游戏中。
1️⃣ 横向、纵向扫描:
利用双重循环,遍历所有起点坐标 (i, j);
对于每个起点判断连续 N 个是否相同;
若连续且非空格 ' ',则对应玩家胜利。
2️⃣ 对角线与反对角线判断:
同理,通过 (i+k, j+k) 与 (i+k, j-k) 实现两方向检测。
算法复杂度 O(row × col × N),对 10×10 棋盘完全可接受。
3️⃣ 动态扩展性强: 通过修改宏定义即可扩展为任意尺寸和胜利规则(如连4、连5等)。