Хорошо, так что я иду долгий путь в моей игре в шахматы! У меня есть серьезная проблема, хотя! Вот как шахматная доска выглядит в памяти как указатели, если я хочу фигуру на доске [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]. увидеть? И я не вижу прямой формулы, потому что посмотрите на этот список входов против того, что должна видеть плата, используя последнюю диаграмму:
поэтому кажется очевидным, что входные данные x должны быть заменены на индекс y массива. но как насчет значения х? тьфу, это так сложно
Пытаться chessBoard[x-1][8-y]
,
Сюда:
А также:
Как раз то, что вам нужно.
ОБНОВИТЬ:
Кажется, здесь есть некоторая путаница … поэтому давайте подведем итоги: есть только 8 (минимально разумных) способов организации 2D-матрицы: 2 x
знаки раз 2 y
подписывает времена, чтобы переключиться x
/y
или не переключаться = 2*2*2 = 8
, Вам просто нужно выбрать свою любимую.
Во-первых, для простоты, я буду предполагать, что оба x
а также y
диапазон от 0
в 7
включительно. Если это не так, исправление должно быть тривиальным.
Пусть имя массива будет b
тогда у вас есть:
b[x][y]
b[x][7-y]
b[7-x][y]
b[7-x][7-y]
b[y][x]
b[y][7-x]
b[7-y][x]
b[7-y][7-x]
Теперь, какой? Легко. Например, вы говорите, что когда x
увеличивается, вы должны двигаться вправо … так, где это правильно? ну, это зависит от того, как вы рисуете матрицу (я видел ваш ASCII-арт, но это довольно неоднозначно), но из вариантов avobe 8 только 2 должны двигаться, как вы говорите. Из этих 2 один будет иметь y
вверх и еще один вниз. Попробуйте оба и выберите снова.
Большое спасибо, ребята, 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 …