Untitled
void Player::Move(Grid* pGrid, Command moveCommands[]) { int x, y; const int maxCommands = 5; Input* pIn = pGrid->GetInput(); Output* pOut = pGrid->GetOutput(); for (int i = 0; i < maxCommands; i++) { if (moveCommands[i] == NO_COMMAND) { break; } CellPosition currentPos = pCell->GetCellPosition(); CellPosition newPos = currentPos; switch (moveCommands[i]) { case MOVE_FORWARD_ONE_STEP: // Move forward based on the player's direction switch (currDirection) { case UP: newPos.SetVCell(newPos.VCell() - 1); // Move up break; case DOWN: newPos.SetVCell(newPos.VCell() + 1); // Move down break; case LEFT: newPos.SetHCell(newPos.HCell() - 1); // Move left break; case RIGHT: newPos.SetHCell(newPos.HCell() + 1); // Move right break; } break; case MOVE_FORWARD_TWO_STEPS: switch (currDirection) { case UP: newPos.SetVCell(newPos.VCell() - 2); // Move up 2 steps break; case DOWN: newPos.SetVCell(newPos.VCell() + 2); // Move down 2 steps break; case LEFT: newPos.SetHCell(newPos.HCell() - 2); // Move left 2 steps break; case RIGHT: newPos.SetHCell(newPos.HCell() + 2); // Move right 2 steps break; } break; case MOVE_FORWARD_THREE_STEPS: switch (currDirection) { case UP: newPos.SetVCell(currentPos.VCell() - 3); break; case DOWN: newPos.SetVCell(currentPos.VCell() + 3); break; case LEFT: newPos.SetHCell(currentPos.HCell() - 3); break; case RIGHT: newPos.SetHCell(currentPos.HCell() + 3); break; } break; case MOVE_BACKWARD_ONE_STEP: switch (currDirection) { case UP: newPos.SetVCell(currentPos.VCell() + 1); break; case DOWN: newPos.SetVCell(currentPos.VCell() - 1); break; case LEFT: newPos.SetHCell(currentPos.HCell() + 1); break; case RIGHT: newPos.SetHCell(currentPos.HCell() - 1); break; } break; case MOVE_BACKWARD_TWO_STEPS: switch (currDirection) { case UP: newPos.SetVCell(currentPos.VCell() + 2); break; case DOWN: newPos.SetVCell(currentPos.VCell() - 2); break; case LEFT: newPos.SetHCell(currentPos.HCell() + 2); break; case RIGHT: newPos.SetHCell(currentPos.HCell() - 2); break; } break; case MOVE_BACKWARD_THREE_STEPS: switch (currDirection) { case UP: newPos.SetVCell(currentPos.VCell() + 3); break; case DOWN: newPos.SetVCell(currentPos.VCell() - 3); break; case LEFT: newPos.SetHCell(currentPos.HCell() + 3); break; case RIGHT: newPos.SetHCell(currentPos.HCell() - 3); break; } break; case ROTATE_CLOCKWISE: RotateClockwise(pGrid); break; case ROTATE_COUNTERCLOCKWISE: RotateCounterClockwise(pGrid); break; default: break; } if (!newPos.IsValidCell()) { pOut->PrintMessage("Invalid Move! Click inside the grid to continue."); while (true) { pIn->GetPointClicked(x, y); if (y >= UI.ToolBarHeight && y <= (UI.height - UI.StatusBarHeight)) { // Valid grid click pOut->ClearStatusBar(); break; } else { pOut->PrintMessage("Invalid click! Click inside the grid area."); } } continue; // Skip this command and continue with the next } pGrid->UpdatePlayerCell(this, newPos); if (i < maxCommands - 1 && moveCommands[i + 1] != NO_COMMAND) { pOut->PrintMessage("Click inside the grid to execute the next command."); while (true) { pIn->GetPointClicked(x, y); if (y >= UI.ToolBarHeight && y <= (UI.height - UI.StatusBarHeight)) { // Valid grid click pOut->ClearStatusBar(); break; } else { pOut->PrintMessage("Invalid click! Click inside the grid area."); } } } }
Leave a Comment