首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用C语言写一个能自定义规则的“N子棋”游戏!——支持任意棋盘、玩家对战、胜利条件自由设置!

用C语言写一个能自定义规则的“N子棋”游戏!——支持任意棋盘、玩家对战、胜利条件自由设置!

作者头像
Extreme35
发布2025-12-23 18:03:26
发布2025-12-23 18:03:26
70
举报
文章被收录于专栏:DLDL

C语言实现玩家对战版“N子棋”——支持任意棋盘大小、可配置胜利条件(含完整源码与设计详解)

本文在原“三子棋”项目基础上全面升级,实现了一个通用的 N 子棋(NxN 棋盘,可自定义连线数量) 玩家对战版! 支持两个玩家实时对战、任意棋盘大小(如10×10)、自定义获胜条件(如连5即胜)。


一、功能概述

功能模块

描述

双人对战

玩家1使用“X”,玩家2使用“#”,轮流输入坐标对战

动态棋盘

棋盘大小(ROW、COL)与胜利连线数(N)可自定义

自动判胜

支持行、列、对角线、反对角线四方向连续判断

清屏刷新

每回合自动刷新棋盘,清晰显示对局进程

防误输入

坐标越界与重复落子自动提示重新输入

胜负提示

支持玩家1胜、玩家2胜、平局三种结局提示

重启机制

每局结束后自动等待2秒回到菜单界面


二、参数设置与核心思想

代码语言:javascript
复制
#define ROW 10   // 棋盘行数
#define COL 10   // 棋盘列数
#define N 5      // 连成N个即获胜(例如5表示五子连珠)

通过宏定义,你可以轻松改造成:

  • 3×3 三子棋
  • 5×5 五子棋
  • 10×10 自定义棋盘

整个逻辑完全复用,无需修改核心代码。


三、总体结构设计

代码语言:javascript
复制
.c源文件
│
├── menu()         // 游戏菜单界面
├── game()         // 主游戏逻辑(循环玩家1与玩家2下棋)
├── InitBoard()    // 初始化棋盘为空格
├── PrintBoard()   // 打印棋盘
├── Play1Board()   // 玩家1输入坐标
├── Play2Board()   // 玩家2输入坐标
├── IsFull()       // 判断棋盘是否已满
└── IsWin()        // 判断是否有玩家获胜

该设计将输入逻辑棋盘显示胜负判断完全解耦。


四、游戏运行流程

1️⃣ 程序启动后进入菜单界面:

代码语言:javascript
复制
********************************
*******    1. play      *******
*******    0. exit      *******
********************************

2️⃣ 输入“1”开始游戏,打印初始棋盘: 3️⃣ 玩家1输入坐标(行 列),下“X”; 4️⃣ 玩家2输入坐标,下“#”; 5️⃣ 每步自动判断胜负;若尚未结束则刷新棋盘; 6️⃣ 若一方连成 N 子,则输出胜利信息并延时返回菜单。


五、判断获胜逻辑

宏观思路:

  • 棋盘有 4 个方向可能连成 N 子: 横向、纵向、主对角线(↘)、副对角线(↙)
  • 对每一个方向,把棋盘“滑动窗口”大小设为 N, 只要发现 N 格连续且非空且全部相同 → 立即返回对应胜者。
  • 四个方向都扫完仍没人赢 → 看棋盘是否已满: 既没人赢又没满 → 返回 ‘C’,外层 game() 会继续 while 循环

此部分源码:

代码语言:javascript
复制
// 判断棋盘是否还有空位
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等)。


七、总结与心得

  • 本文通过对原“三子棋”的结构重构,拓展成了 任意维度的N子棋系统
  • 代码逻辑模块化清晰,算法结构具备普适性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C语言实现玩家对战版“N子棋”——支持任意棋盘大小、可配置胜利条件(含完整源码与设计详解)
    • 一、功能概述
    • 二、参数设置与核心思想
    • 三、总体结构设计
    • 四、游戏运行流程
    • 五、判断获胜逻辑
    • 六、思路解析
    • 七、总结与心得
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档