C # — C ++ Система координат

Я провел некоторое исследование о том, как создать систему координат в C ++, но не получил хороших ответов, и поэтому я делаю новый пост об этом.

Я хотел бы создать шахматную игру, в которой вы — фермеры, которые могут сделать один или два шага вперед и атаковать в любом направлении. Чего я не понимаю, так это как правильно рассчитать и напечатать каждый символ в определенном месте. Например; Если я хочу, чтобы Farmer 1 находился в B5, как мне пропустить «пустые шаги» перед фактическим положением?

Редактировать: Этот пост был первоначально сделан о том, как создать систему координат, и это до сих пор. Я хотел спросить, как я могу создать консольную систему координат, как в примере ниже.

 1 2 3 4 5 6 7
A
B        ¤
C
D

-1

Решение

Я имел в виду, что А1 равен (0,0), а В5 должен быть (5,2)

Сохраните ваши координаты как int, int пары, которые идут от нуля до ширины / высоты вашей доски. С такими диапазонами проще работать, например, с их помощью можно напрямую индексировать двумерный массив.

constexpr int board_width = 15;
constexpr int board_height = 15;

struct coordinate
{
int _x; // from `0` to `board_width`
int _y; // from `0` to `board_height`
};

Чтобы создать ваше представление «письмо + int», предоставьте несколько утилит преобразования:

char x_coordinate_representation(int x)
{
// see http://www.asciitable.com/
return 'A' + x;
}

int y_coordinate_representation(int y)
{
return y + 1;
}

std::string to_string(const coordinate& c)
{
std::string result;
result.reserve(2);

result += x_coordinate_representation(c._x);
result += std::to_string(y_coordinate_representation(c._y));

return result;
}
2

Другие решения

Это полностью зависит от того, что вы хотите сделать в долгосрочной перспективе. Может ли несколько персонажей находиться на одной позиции? Сама плата не такая большая? У вас есть целочисленная позиция, или вам нужно, чтобы фигура была размещена примерно в (4.5, 3.5)?

Что я бы порекомендовал, так это то, что сначала вы делаете несколько базовых уроков. Не уверен, что ты сделал это. Во-вторых, вы узнаете об объектно-ориентированном программировании. Вам нужно будет определить, какие классы вам нужны в вашем случае. И какие классы вам не нужны.

Пример с Go:

В Go есть только один тип фигур без сложного поведения. Поэтому вам не нужен класс для фигур. Вы можете смоделировать игру в Го как

using std::array;

enum class FieldState : unsigned char { empty, black, white};
enum class Player : unsiged char { black, white};

class Go {

private:

array< array<FieldState, 19> , 19> board;
Player active_player;
unsigned int pieces_captured_by_black;
unsigned int pieces_captured_by_white;

//insert methods here
//maybe some logic parts that enforce Ko
}

Как видите, цифры на самом деле не существуют, это просто статус доски. Но здесь нам не нужно больше, так что это идеально для нас. На самом деле не хранятся какие-либо координаты, доска делает это для нас.

Однако, если фигура будет иметь сложное поведение и состояние, которые не могут быть описаны одним перечислением, вы можете переключиться на доску, на которой хранятся указатели на класс Figure который хранит необходимые данные. Все еще не нужны координаты, теперь вам нужна память о полях доски * 64 вместо полей доски * 8. Что еще ничего, так прекрасно, так будет продолжаться.

Однако, как только вы не можете использовать целочисленные позиции или если размер доски может произвольно увеличиваться (возможно, потому что доска является частью процедурно сгенерированного мира, например), вы будете использовать некоторую систему координат, такую ​​как

struct Coordinates {
double x, y;
}

class Figure {

private:
Coordinates coordinates;
//other properties
}

using std::vector;

class Game {

private:
vector<Figure> figures;
//other things
}

Я сделал этот пост немного больше о настольных играх, в частности, почувствовал, что это то, что вы хотели. Кроме того, я использовал некоторые вещи, которые, если вы новичок, с которым вы еще не знакомы, чтобы дать вам что-то новое, надеюсь, это вас не смущает.

Я бы порекомендовал вам попробовать смоделировать это самостоятельно, а затем опубликовать на Просмотр Кода. Пусть другие люди разрывают его на части, пока он не станет совершенным.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector