# DataStructureAndAlgorithm_Chess **Repository Path**: dancehole/chess ## Basic Information - **Project Name**: DataStructureAndAlgorithm_Chess - **Description**: 数据结构与算法大作业:三角网格五子棋 Git link was set as "chess"; Here is “Data Structure and Algorithm" Course Assignment: Trigonometric Network Gomoku Code Sharing Repository; - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2023-05-24 - **Last Updated**: 2025-03-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
简体中文 | English
数据结构与算法课程设计大作业
三角网络五子棋(C++实现)
注意:本版本测试存在许多bug,请慎用
|  |
| web版截图1 | web版截图2 |
|
| |
## 📝 目录
- [发行版/demo下载](#demo)
- [项目简介](#description)
- [软件架构](#structure)
- [运行环境](#environment)
- [编译运行](#setup)
- [运行截图&bug反馈](#bug)
- [Contributing]()
## 💿发行版下载
**[点我下载最新版本](https://gitee.com/dancehole/chess/releases/tag/V1.0.0)**
- [Gitee Release](https://gitee.com/dancehole/chess/releases/tag/V1.0.0)
-
三角网络五子棋示意图
三角网络五子棋详细规则如下所述,其中绝大部分规则和方格网络五子棋规则基本一样,其中不同的地方将加粗表示:
1. 通过观察可得方格网络棋盘其实是由共心的7层正方形构成,且每层正方形上由8×L个落子点,L为层数,共计1+8+16+24+32+40+48+56=225个落子点。同理,如图3,设置三角网络棋盘为共心的7层六边形构成,每层六边形上由6×L个落子点构成,共计1+6+12+18+24+30+36+42=169个落子点,其中三方向的直线各有15条,共计45条直线。
三角网络五子棋棋盘示例
2. 黑棋先行,白棋后行,黑白棋交替进行。落子只能落在未有落子的三条线的共同交叉点上。
3. 当一方在率先组成了五子相连直线,则该方胜利,游戏结束。**在三角网络五子当中只需要考虑连线方向,而不需要考虑未有连线的任意斜方向**。
4. 当无其他可落子之处,且仍未有一方组成五子直线相连,则平局,游戏结束。
### 2. 题目设定
**大作业的课题:实现上述三角网络五子棋的对战逻辑,以及进一步实现人机对战功能**。
此处将详细说明大作业中的各个部分的提示和细节要求。
1. **使用合理的数据结构表现三角网络棋盘上的落子状态**
如上文背景中所述,需要保存的数据主要是169个交叉点的落子情况,以及169个交叉点之间基于45条直线的邻接逻辑情况。因此,候选方案有多种,下面提示一种方案:
(1) 构建一个169个节点的顺序存储空间,并另外使用45组顺序表来来串联169个节点,存储节点之间的邻接关系。为了避免混乱且方便查找,可以给三个方向的每条线都进行编号,并在每个节点存储该节点所在的直线。节点和线的定义可以参考下述代码。
```c++
class GomokuNode {
int status;
int Line_x, Line_y, Line_z;
}
typedef GomokuNode* GomokuLine[15];
```
其中记录落子位置状况的169个数据构成了五子棋的棋盘状态,用status进行表示。落子位置之间的连线固定不变且只用来处理胜利判断,并不需要记录为棋盘状态。
2. **设计算法实现落子后的胜利判断**
简而言之,以落子点为中心向3个方向遍历,看看能否找出相连的5个棋子,如果能则获胜,反之,落子结束,交由对方落子。落子的函数可以设计为int move(pos, color),表示棋盘的pos位置放置color颜色的棋子,落子之后在函数内部进行胜利与否的判断,如果胜利则可以返回1代表当前执棋者获胜,返回0则继续游戏。
3. **设计三角网络的人工智能**
棋类的游戏过程本质上便是回溯树的构建、剪枝以及探索过程。如图4所示,如俗话所说的“走一步看十步”,棋类游戏的过程便是通过“预判对方”“预判对方的预判”“预判对方预判己方预判的预判”“……”来执行回溯树的搜索过程,最终采取己方收益最大化的行动。
其中,单次的预判可以简单描述为下述过程:
a) 模拟己方落子;
b) 模拟对方落子;
c) 重复a)和b)两个步骤n次;
d) 计算当次模拟的收益;
e) 变化模拟的落子状况,重复a),b),c)和d)四个步骤;
f) 在所有的模拟情况中,选出收益最大的一条路径,执行己方的落子。

图:使用虚幻4制作五子棋示例,及实现效果
2. 方案二:使用Unity制作
Unity使用C#开发,是当前最流行的小游戏引擎之一,有着完善的物理引擎库,xxx
3. 方案三:使用VS-c-easyx制作
由于在大一时积累相关经验,easyx的使用具有天然优势。
图:大一作业
4. 方案四:使用原生C(windows.h)制作
无opengl的封装,可移植性差。
经过对比探讨,最终确定使用方案三。
#### 2.2.3 棋盘构建思路
纯数学逻辑
为做到棋盘绘制与相关参数解耦合(方便修改),需要精确的数学分析。
由此确定如下:
假设界面长度为x,宽度为y,则确定中心点坐标midPoint($\frac{x}{2}$,$\frac{y}{2}$),如图所示
其次在尝试后,选择更换逻辑坐标。更换逻辑坐标为midPoint,方便绘图。假设最小的三角形半径为r(最小同心圆半径)
绘棋盘思路:先画七个同心六边形,然后通过循环连接各个六边形的线
所以我们需要计算出每个同心六边形的点,我们以最上方点设立下标“0“。有:
六边形各顺位点,顺位index
$$
A_x=x+r*sin(60*index*Pi)
$$
$$
A_y=t+r*cos(60*index*Pi)
$$
#### 2.2.4 建立棋盘映射
自行阅读代码
#### 2.2.5 胜负判断
自行阅读代码
#### 2.2.6 棋盘架构优化
自行阅读代码
## 运行效果及Bug反馈
### 运行截图



### bug反馈
- **赛博落子【严重bug】**:当落子不精确时,鼠标坐标会映射到一个虚拟的不存在无法被绘制的点。这本质上是因为数据结构定义了超过169个点(实际上定义了$10^3$个点,分别为三条直线的交点)。显然此架构是因为布线设计问题。**在落子精确时不会出现bug**
- 无胜利反馈。胜利后不会弹出标识,返回菜单等。
## 🙇 贡献 参与我们
欢迎您参与贡献,我们鼓励开发者以各种方式参与文档反馈和贡献。
您可以对现有文档进行评价、简单更改、反馈文档质量问题、贡献您的原创内容,详细请参考[贡献文档]()。
## ☎️ 联系我们/作者
-