使用SFML开发井字棋时无法绘制多个sf::CircleShape圆形的问题
问题原因
- 每次帧循环都会执行
window.clear()清空窗口所有内容,你当前仅存储了最后一次点击的坐标,每次清空后仅绘制最新的单个圆形,之前生成的圆形没有被持久化存储,自然不会出现在画面中。 - 你使用的单次坐标+布尔标记的存储方式,只能记录一个待绘制圆形的状态,无法支持多圆形绘制需求。
修复方案
你原来写的CreateO函数不需要做任何修改,可以直接复用,仅修改主逻辑即可:
- 引入容器存储所有已生成的圆形对象,使用
std::vector<sf::CircleShape>即可,需要先引入头文件#include <vector> - 每次鼠标点击触发时,直接生成新的圆形对象存入容器,无需单独存储坐标和绘制标记
- 绘制阶段遍历容器,把所有存储的圆形全部绘制到窗口
修改后的主逻辑代码参考:
#include <vector> // 其他原有头文件无需修改 sf::RenderWindow window(sf::VideoMode(900, 900), "Tic Tac Toe"); sf::Event event; // 新增存储所有O的容器 std::vector<sf::CircleShape> o_list; while (window.isOpen()) { while (window.pollEvent(event)) { switch (event.type) { case sf::Event::Closed: window.close(); break; case sf::Event::MouseButtonPressed: switch (event.mouseButton.button) { case sf::Mouse::Right: // 点击时直接生成新的O存入容器 o_list.push_back(CreateO(event.mouseButton.x, event.mouseButton.y)); break; default: break; } break; default: break; } } window.clear(); // 遍历容器绘制所有O for (auto& o : o_list) { window.draw(o); } window.display(); }
如果后续需要实现X和O交替绘制的井字棋核心逻辑,也可以用同样的思路,新增存储X对象的容器,或者定义统一的棋子结构体存储棋子类型和绘制对象即可。
内容的提问来源于stack exchange,提问作者Anirudh Yamunan Govindarajan
相关产品推荐
相关产品推荐

