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

Lights Out游戏:house图形窗口无法正确填充#的函数实现问题

问题分析与修复方案

你的window_update_graphics函数存在三个核心问题,导致无法正确填充所有目标窗口:


1. 错误覆盖函数参数的x、y值

原代码里硬编码计算idx = HOUSE_WIDTH * 8 + 11后,重新计算x和y直接覆盖了函数传入的目标窗口坐标参数。这意味着不管调用时传入哪个(x,y),函数只会处理同一个固定窗口,其他窗口完全没被更新。

2. State数组索引逻辑错误

每个窗口对应state数组里的一个元素,而非窗口内每个像素对应不同的state值。原代码用state[(3 * i) + j]索引,完全搞错了对应关系——正确索引应为state[y * 3 + x],因为state按行存储:y是行号(0-2),每行3个窗口,第y行第x列的窗口对应state的第y*3 +x个元素。

3. 窗口起始位置未按参数动态计算

原代码用固定的windowStartIndex,没有根据传入的(x,y)计算对应窗口的真实起始位置。需要先确定每个窗口的水平和垂直偏移规律:

  • 垂直方向:y=0的窗口内容从第9行开始,y=1从第14行开始,y=2从第21行开始(对应house字符串的行位置)
  • 水平方向:x=0的窗口内容起始于第11列,x=1在第27列,x=2在第43列(根据house里的窗口布局)

修正后的完整函数实现

假设HOUSE_WIDTH=60、WINDOW_WIDTH=9、WINDOW_HEIGHT=3(可根据实际布局调整):

#define HOUSE_WIDTH 60
#define WINDOW_WIDTH 9
#define WINDOW_HEIGHT 3

void window_update_graphics(char *house, const int *state, int x, int y)
{
    // 根据窗口坐标计算起始行和列
    int start_row = 9 + y * 7;
    int start_col = 11 + x * 16;
    
    // 获取当前窗口的状态,确定填充字符
    int window_state = state[y * 3 + x];
    char fill_char = window_state ? '#' : ' ';
    
    // 遍历窗口区域填充字符
    for (int i = 0; i < WINDOW_HEIGHT; i++) {
        for (int j = 0; j < WINDOW_WIDTH; j++) {
            int current_idx = (start_row + i) * HOUSE_WIDTH + (start_col + j);
            house[current_idx] = fill_char;
        }
    }
}

关键说明

  • 起始行和列的数值是根据你提供的house字符串布局手动计算的,可根据实际的HOUSE_WIDTH微调(比如数清楚窗口左上角的行、列索引)。
  • 现在函数会根据传入的(x,y)精准定位目标窗口,用对应state值填充整个窗口的所有像素。
  • 补充了state为0时填充空格的逻辑,完全符合需求描述。

内容的提问来源于stack exchange,提问作者J Dubb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:44:59