EasyX初始化需装库、配graphics.lib、含easyx.h头文件;棋盘用line()按GRID_SIZE和OFFSET动态画线并标星位;鼠标点击通过四舍五入映射行列并越界检查;胜负判定须四向检测连续子数,任一方向≥5即胜。

EasyX 初始化和窗口设置要注意什么
EasyX 不是标准 C++ 库,得先装好 EasyX 图形库,并在 VS 里配置好头文件和链接器。没配对的话,initgraph() 会直接崩溃或报错 LNK2019。确认项目属性里「附加依赖项」加了 graphics.lib,且代码开头是 #include 而不是 #include (后者是旧版 Turbo C 风格,不兼容)。
- 窗口尺寸建议设为
640x640或700x700,留出边距画棋盘和状态栏 - 调用
initgraph()后务必检查是否成功,比如:if (!getinitmode()) return -1; - 不要漏掉
closegraph(),否则程序退出时可能卡死或资源泄漏
怎么用 EasyX 画标准五子棋棋盘
五子棋棋盘是 15×15 或 19×19 的正交网格,EasyX 没现成棋盘函数,得手动用 line() 画线。关键不是“怎么画”,而是“怎么算坐标”——别用固定像素硬编码,用变量控制格宽和起始偏移,方便后续响应鼠标点击。
- 设
const int GRID_SIZE = 40;,const int OFFSET = 40;,那么第i行横线 y 坐标是OFFSET + i * GRID_SIZE - 用双重循环画线,外层画横线(
line(OFFSET, y, OFFSET + 14GRID_SIZE, y)),内层画竖线(line(x, OFFSET, x, OFFSET + 14GRID_SIZE)) - 别忘了画星位(天元、四角星位),用
solidcircle(),半径设为3,颜色用BLACK - 如果画完看不到线,大概率是背景色和线色一样,记得调
setlinecolor(),默认是白色,在白背景下不可见
鼠标点击落子怎么映射到棋盘坐标
EasyX 的 GetMouseMsg() 是阻塞式轮询,适合单机小游戏。难点不在获取点击,而在于把屏幕坐标精准转成棋盘行列索引(row/col),并防误触(比如点到边界外、点在两条线交点上)。
- 先用
MouseMsg msg; while (true) { if (MouseHit()) { msg = GetMouseMsg(); break; } }获取一次点击 - 计算行列:
int col = (msg.x - OFFSET + GRID_SIZE/2) / GRID_SIZE;int row = (msg.y - OFFSET + GRID_SIZE/2) / GRID_SIZE;
加GRID_SIZE/2是四舍五入,避免因浮点误差偏移一格 - 必须做越界检查:
if (row 14 || col 14 || board[row][col] != 0)就忽略这次点击 - 注意:EasyX 坐标原点在左上角,
row对应 y 方向,别和数学习惯弄反
判断胜负的逻辑怎么写才不漏判
五子棋胜负判定不是只看“横着五个”,得查四个方向:水平、垂直、主对角线(\)、副对角线(/)。常见错误是只从落子点往右/下扩展,漏掉往左/上的连续子;或者用固定长度循环,没考虑边界截断。
- 推荐写一个通用方向检测函数:
int countInDir(int row, int col, int dr, int dc),返回该方向上同色连续子数(含自己) - 然后分别调:
countInDir(r,c,0,1) + countInDir(r,c,0,-1) - 1(水平),其他方向同理 - 减 1 是因为中心点被算了两次
- 只要任一方向结果 ≥ 5,就赢了;别等凑够 5 个再判,那样会漏掉“第六子落下去反而形成五连”的情况
- 判胜后立刻
break轮询循环,弹窗提示(outtextxy()或MessageBox()),并防止继续落子
棋盘数组用 int board[15][15] = {0} 最稳妥,0 空,1 黑,2 白;图形上黑子用 solidcircle(x, y, 16) + setfillcolor(BLACK),白子填 WHITE 再画一圈 BLACK 边框——纯 WHITE 在浅色背景上看不清。最易忽略的是:鼠标消息未清空会导致同一点击触发多次,每次 GetMouseMsg() 后必须确保消费掉该事件。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











