Я пытался найти ответ на свой вопрос, но не смог найти ничего правильного.
Моя проблема связана с настройкой массива и перемещением маленького курсора вокруг поля точек. Мне нужно иметь возможность игнорировать вводимые пользователем данные, если они нажимают клавишу со стрелкой в направлении, которое вывело бы их за пределы сетки. Я не совсем уверен, что лучше всего сделать это.
Это класс, который я не могу изменить. Я могу только наследовать от него, чтобы сделать это.
//You can add or delete includes
#include <iostream>
#include <stdlib.h> //For system()
#include <conio.h> //For getche()
#include <time.h>
using namespace std;const int MAX_HEIGHT = 20; //The height of the grid
const int MAX_WIDTH = 40; //The width of the grid
class PickUpGame
{
protected:
char Screen[MAX_HEIGHT][MAX_WIDTH]; //The grid to print to the screen
int xPos, yPos; //The current x and y position of the users cursor on the grid
public:
//Constructor that will intialize the screen and x and y positions
PickUpGame() : xPos(0), yPos(MAX_WIDTH - 1)
{
SetupScreen(); //Initalize the grid
}
//Initialize the screen with all '.' characters and set the intial user cursor position on the grid
void SetupScreen()
{
for(int height = 0; height < MAX_HEIGHT; height++) {
for(int width = 0; width < MAX_WIDTH; width++) {
Screen[height][width] = '.'; //Initialize each grid position
}
}
Screen[xPos][yPos] = '<'; //Set the users initial cursor position
}
//Print the grid to the screen
void Print()
{
for(int height = 0; height < MAX_HEIGHT; height++) {
for(int width = 0; width < MAX_WIDTH; width++) {
cout << Screen[height][width]; //Print the character at this location in the grid
}
cout << endl; //After each row is printed, print a newline character
}
}
//Take in user input to move around the grid
void Move(char Direction)
{
switch(static_cast<int>(Direction)) //Don't know the ASCII characters for the arrow keys so use the ASCII numbers
{
case 72: //Up arrow
Screen[xPos][yPos] = ' '; //Wipe out the users current cursor
xPos--; //Move the users x position on the grid
Screen[xPos][yPos] = '^'; //Move the users cursor
break;
case 80: //Down arrow
Screen[xPos][yPos] = ' ';
xPos++;
Screen[xPos][yPos] = 'V';
break;
case 75: //Left arrow
Screen[xPos][yPos] = ' ';
yPos--;
Screen[xPos][yPos] = '<';
break;
case 77: //Right arrow
Screen[xPos][yPos] = ' ';
yPos++;
Screen[xPos][yPos] = '>';
break;
}
}
};
Вам просто нужно проверить, выводит ли движение их за пределы, и игнорировать это, если так. Например, двигаясь вправо:
if (right_key_pressed() && x_position < MAX_X_VALUE) {
x_position++;
}
То есть они будут двигаться только вправо, если они нажмут → ключ и еще не в максимальном значении X позиции. Вы можете применить аналогичную логику к другим направлениям.
Изменить после добавления PickUpGame
класс на вопрос
Поскольку логика движения находится в PickUpGame
и вы говорите, что не можете изменять его, что делает его немного раздражающим. В идеале if
заявления внутри Move
будет проверять границы. Вместо этого вам придется делать проверку снаружи, откуда вы звоните Move
:
if ((Direction == 72 && xPos > 0) ||
/* do the same for right, down, and left */) {
Move(Direction);
}
Итак, вы хотите, чтобы проверить, если Direction
вверх и есть место для движения вверх, ИЛИ если это правильно, и есть место для движения вправо, ИЛИ … и так далее. Тогда и только тогда вы пройдете Direction
вместе с Move
,
Похоже, все, что вам нужно сделать, это сохранить переменную для того места, где пользователь находится в массиве (у вас, вероятно, он уже есть) и два для максимального и минимального значения. Затем, когда пользователь нажимает клавишу со стрелкой, прежде чем перемещать курсор, проверьте, будет ли действие выводить их за пределы.