2D индексы к математической сетке для шахматной игры

Хорошо, так что я иду долгий путь в моей игре в шахматы! У меня есть серьезная проблема, хотя! Вот как шахматная доска выглядит в памяти как указатели, если я хочу фигуру на доске [4] [3]:

y axis
0 1 2 3 4 5 6 7
1
x 2
a 3
x 4     X
i 5
s 6
7

Я пронумеровал ось х тому, как выглядят индексы памяти, чтобы пользователь видел это, когда смотрел на экран. Так как Мой код сейчас, это то, что я должен набрать, чтобы получить пешку на d, 6: user input = wf4, что переводится в программе на Board [5] [3]. Как видите, я хочу набрать wd6 и перейти к d и до шести. но программа уменьшается сначала на 5 и заканчивается до 3 (d).

  1 R N B Q K B N R
x 2 P P P P P P P P
a 3
x 4
i 5
s 6       P
7 P P P   P P P P
8 R N B Q K B N R
a b c d e f g h
y-axis

У меня есть формула для вычитания 1 из координаты, поэтому, если пользователь введет (e, 8), он будет искать фигуру в chessBoard [4] [7], но, конечно, это не найдет фигуру, потому что [4] [ 7] ниже на 4 над 7. Мы хотим больше на 4 ниже 7. То, что я ДЕЙСТВИТЕЛЬНО хочу, больше 4 на 1! Так что это выглядит так:

  8 R N B Q K B N R
y 7 P P P P P P P P
a 6
x 5
i 4
s 3
2 P P P P P P P P
1 R N B Q K B N R
a b c d e f g h
x-axis

Здесь я должен набрать e, 1 и получить короля. Для этого мне нужно найти способ сделать нижний левый угол равным 0,0 вместо верхнего левого угла. В общем, как мне это сделать? Как преобразовать индексы двумерного массива в математическую сетку стилей?!?!
РЕДАКТИРОВАТЬ *** Хорошо, идеальный пример! Я был моим игроком для ввода c, 6, который появится во входных значениях: source.x = 2 и source.y = 6. У меня есть код, который делает это. СЕЙЧАС, что мне нужно, это сказать моей доске [source.x] [source.y], что MEANT игрока было правлением [2] [2]. увидеть? И я не вижу прямой формулы, потому что посмотрите на этот список входов против того, что должна видеть плата, используя последнюю диаграмму:

  • массив input = 1,4 [4] [1] получает тот же кусок
  • массив input = 5,7 [1] [5] получает тот же кусок
  • массив input = 2,6 [2] [2] получает тот же кусок
  • массив input = 3,7 [1] [3] получает тот же кусок

поэтому кажется очевидным, что входные данные x должны быть заменены на индекс y массива. но как насчет значения х? тьфу, это так сложно

0

Решение

Пытаться chessBoard[x-1][8-y],

Сюда:

  • х = 1 -> х-1 = 0
  • х = 8 -> х-1 = 7

А также:

  • у = 1 -> 8-й = 7
  • у = 8 -> 8-у = 0

Как раз то, что вам нужно.

ОБНОВИТЬ:

Кажется, здесь есть некоторая путаница … поэтому давайте подведем итоги: есть только 8 (минимально разумных) способов организации 2D-матрицы: 2 x знаки раз 2 y подписывает времена, чтобы переключиться x/y или не переключаться = 2*2*2 = 8, Вам просто нужно выбрать свою любимую.

Во-первых, для простоты, я буду предполагать, что оба x а также y диапазон от 0 в 7 включительно. Если это не так, исправление должно быть тривиальным.

Пусть имя массива будет bтогда у вас есть:

  1. b[x][y]
  2. b[x][7-y]
  3. b[7-x][y]
  4. b[7-x][7-y]
  5. b[y][x]
  6. b[y][7-x]
  7. b[7-y][x]
  8. b[7-y][7-x]

Теперь, какой? Легко. Например, вы говорите, что когда x увеличивается, вы должны двигаться вправо … так, где это правильно? ну, это зависит от того, как вы рисуете матрицу (я видел ваш ASCII-арт, но это довольно неоднозначно), но из вариантов avobe 8 только 2 должны двигаться, как вы говорите. Из этих 2 один будет иметь y вверх и еще один вниз. Попробуйте оба и выберите снова.

1

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

Большое спасибо, ребята, SOOOOO за помощь, я действительно ценю это! Я понял. Решение для меня состояло в том, чтобы пойти дальше и создать две структуры Location. Одним из них является ChessLocation, кто х значение является символом а также у инт, а другой ArrayLocation, кто значения x и y оба являются значениями int. Затем я сделал методы для преобразования между двумя. Идея состоит в том, чтобы управлять почти всем в моем коде с помощью ChessLocations. Только когда я на самом деле устанавливаю фигуру или проверяю фигуру в определенном месте доски, я буду использовать ArrayLocations. Преобразования заключаются в следующем (также, извините, я не уверен, как сделать абзацы в этом текстовом редакторе …)

ArrayLocation ChessBoard::convertToArrayLocation(ChessLocation chessLocation)
{
ArrayLocation location;
location.x = 8- chessLocation.y;
location.y = chessLocation.x - 0x61;return location;
}

И это превращает обратно в ChessLocation

ChessLocation ChessBoard::convertToChessLocation(ArrayLocation arrayLocation)
{
ChessLocation location;

location.x = 0;
location.y = 0;
location.x = arrayLocation.y +0x61;
location.y = 8 - arrayLocation.x  ;

return location;
}

Я мог бы создать класс Location, я полагаю, с двумя конструкторами, которые принимают любое значение и выплевывают нужное вам значение, но я еще не настолько разбираюсь в c ++ (к сожалению, все мои классы использовали Java …

0

По вопросам рекламы [email protected]