You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SFML开发井字棋时无法绘制多个sf::CircleShape圆形的问题

问题原因
  • 每次帧循环都会执行window.clear()清空窗口所有内容,你当前仅存储了最后一次点击的坐标,每次清空后仅绘制最新的单个圆形,之前生成的圆形没有被持久化存储,自然不会出现在画面中。
  • 你使用的单次坐标+布尔标记的存储方式,只能记录一个待绘制圆形的状态,无法支持多圆形绘制需求。
修复方案

你原来写的CreateO函数不需要做任何修改,可以直接复用,仅修改主逻辑即可:

  1. 引入容器存储所有已生成的圆形对象,使用std::vector<sf::CircleShape>即可,需要先引入头文件#include <vector>
  2. 每次鼠标点击触发时,直接生成新的圆形对象存入容器,无需单独存储坐标和绘制标记
  3. 绘制阶段遍历容器,把所有存储的圆形全部绘制到窗口

修改后的主逻辑代码参考:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:45:02