Untitled
unknown
c_cpp
a year ago
4.0 kB
12
Indexable
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.");
}
}
}
}Editor is loading...
Leave a Comment