为什么这个代码不能实现鼠标交互,点击网格设置细胞
时间: 2024-10-20 12:16:02 浏览: 11
使用JAVA GUI实现细胞生命游戏
该代码已经实现了基本的鼠标交互功能,但并未在点击网格时设置细胞状态。具体原因如下:
1. **鼠标事件处理**:代码中确实有对鼠标点击事件的处理逻辑,但在 `main` 函数的主循环中,只检查了按钮区域的点击事件,并没有处理点击网格区域的事件。
2. **缺少网格点击处理逻辑**:你需要在检测到鼠标左键点击后,检查点击位置是否在网格区域内,并相应地更新网格中的细胞状态。
以下是修改后的代码片段,添加了对网格点击事件的处理:
```cpp
// 在 main 函数的主循环中添加以下代码
MOUSEMSG m;
if (MouseHit()) {
m = GetMouseMsg();
if (m.uMsg == WM_LBUTTONDOWN) {
int x = m.x;
int y = m.y;
int gridX = x / CELL_SIZE;
int gridY = y / CELL_SIZE;
// 检查点击是否在网格区域内
if (gridX >= 0 && gridX < COLS && gridY >= 0 && gridY < ROWS) {
// 切换细胞状态
grid->getGrid()[gridY][gridX] = !grid->getGrid()[gridY][gridX];
}
// 处理按钮点击事件
if (isStartButtonClicked(m.x, m.y)) {
if (!isGameRunning) {
if (hasAliveCells()) {
isGameRunning = true;
checkPatterns.store(false);
thread(gameLoop).detach();
} else {
outtextxy(20, ROWS * CELL_SIZE + 70, L"Please set at least one cell.");
}
}
} else if (isStopButtonClicked(m.x, m.y) && isGameRunning) {
isGameRunning = false;
} else if (isRestartButtonClicked(m.x, m.y)) {
resetGame();
} else if (isSearchButtonClicked(m.x, m.y)) {
if (!isGameRunning) {
checkPatterns.store(true);
isGameRunning = true;
thread([=] {
while (isGameRunning) {
std::lock_guard<std::mutex> lock(mtx);
nextGeneration();
if (detectPatterns(false, true, false)) {
isGameRunning = false;
cout << "Pattern found, evolution steps: " << stepCount << endl;
}
Sleep(300);
}
}).detach();
}
} else if (isBlinkerButtonClicked(m.x, m.y)) {
if (!isGameRunning) {
checkPatterns.store(true);
isGameRunning = true;
thread([=] {
while (isGameRunning) {
std::lock_guard<std::mutex> lock(mtx);
nextGeneration();
if (detectPatterns(true, false, false)) {
isGameRunning = false;
cout << "Pattern found, evolution steps: " << stepCount << endl;
}
Sleep(300);
}
}).detach();
}
} else if (isToadButtonClicked(m.x, m.y)) {
if (!isGameRunning) {
checkPatterns.store(true);
isGameRunning = true;
thread([=] {
while (isGameRunning) {
std::lock_guard<std::mutex> lock(mtx);
nextGeneration();
if (detectPatterns(false, false, true)) {
isGameRunning = false;
cout << "Pattern found, evolution steps: " << stepCount << endl;
}
Sleep(300);
}
}).detach();
}
} else if (isRandomButtonClicked(m.x, m.y)) {
int numCells;
cout << "Please enter the number of random cells (greater than 25):";
cin >> numCells;
if (numCells > 25 && numCells <= ROWS * COLS) {
randomizeCells(numCells);
} else {
cout << "The number of cells must be between 26 and " << ROWS * COLS << "!" << endl;
}
} else if (isSaveButtonClicked(m.x, m.y)) {
saveToFile("grid.txt");
MessageBox(NULL, L"Save successful!", L"File operation", MB_OK);
} else if (isLoadButtonClicked(m.x, m.y)) {
loadFromFile("grid.txt");
MessageBox(NULL, L"Load successful!", L"File operation", MB_OK);
}
}
}
```
### 解释
- **网格点击检测**:通过计算鼠标点击位置 `(x, y)` 对应的网格坐标 `(gridX, gridY)`,并在网格范围内进行判断。
- **切换细胞状态**:如果点击位置在网格内,则切换对应细胞的状态(从存活变为死亡,或从死亡变为存活)。
- **现有按钮点击处理**:保留原有的按钮点击处理逻辑,确保其他功能正常工作。
这样,当用户点击网格区域时,相应的细胞状态会被正确更新。
阅读全文