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
相关产品推荐
相关产品推荐

