在按键上,这是定义的/称为(假设按键被按下)该顺序应该显示出应该发生的情况,以及在整个按键结果中如何附加didMove,但是,这在理论上不起作用(在gif中仅按下https://i.imgur.com/wZcHsOe.gifv时,此gif显示了问题,仅当按下向下且没有移动或合并图块时,才应添加图块,因此,Move应该移动=假;但是它仍然输入if语句,就好像它仍然为True
有关didMove = true的条件部分在addValue函数中
void Grid::shiftDown(){
didMove = false;
moveDown();
mergeDown();
moveDown();
if(didMove == true){
moves = moves + 1;
}
addValue();
}
这是MoveDown / MergeDown函数
void Grid::moveDown(){
for(int x = 0; x < tilesWide; x++){
for(int y = tilesHigh - 1; y > 0 ; y--){
if( grid[x][y] == emptyCell){
for(int t = y-1; t >= 0; t--){
if(grid[x][t] != emptyCell){
grid[x][y] = grid[x][t];
grid[x][t] = emptyCell;
didMove = true;
break;
}
}
}
}
}
}
void Grid::mergeDown(){
for(int x = 0; x < tilesWide; x++){
for(int y = tilesHigh-1; y > 0; y--){
if(grid[x][y] == grid[x][y-1]){
grid[x][y] = (grid[x][y] *2);
grid[x][y-1] = emptyCell;
setScore(grid[x][y]);
didMove = true;
}
}
}
}
并且如果didMove == true,这是一个添加图块的函数
void Grid::addValue(){
int value = Grid::randValue();
bool emptyCells = false;
for(int x = 0; x < tilesWide; x++){
for(int y = 0; y < tilesHigh; y++){
if(grid[x][y] == emptyCell){
emptyCells = true;
}
}
}
while(emptyCells == true){
int valX = rand() % tilesWide;
int valY = rand() % tilesHigh;
if (grid[valX][valY] == emptyCell) {
if(didMove == true){
grid[valX][valY] = value;
didMove = false;
emptyCells = false;
break;
}
else{
emptyCells = false;
break;
}
}
}
}
您在问题中声明只有在didMove == true时才调用addValue()。但是,您对addValue()的调用是在if(didMove == true){}条件块之后进行的。
根据您对问题的描述,对addValue()的调用肯定应该在该条件块内。
void Grid::shiftDown(){
didMove = false;
moveDown();
mergeDown();
moveDown();
if(didMove == true){
moves = moves + 1;
addValue(); //Moved to inside conditional block.
}
//addValue(); //Would always run here regardless of condition evaluation.
}