Skąd? Popatrz na swoje współrzędne. Skoro x = 5, y = 4, wielkość planszy w poziomie to 15 kolumn, poziomie to 6 wierszy, to wychodzi nam plansza o faktycznej wielkości 17 kolumn i 8 wierszach. Teraz punkt (5,4) . Wiersz 4 ma pod sobą 3 wiersze realne i jeden zablokowany, wszystkie o szerokości 17 kolumn, z kolei 4 kolumna to 4 kolumny + 1 kolumna dodatkowa. Z tego wychodzi nam, że numer pola to zawsze według wzoru:
Kod
nr = y * ilość_kolumn_w wierszu + x + 1
gdzie:
x - numer kolumny,
y - numer wiersza.
Podstawiając więc do wzoru przykładowo:
Pole w grze ma:
- 20 kolumn x 30 wierszy
- punkt postaci to (5,9)
Co nam to daje? Wszystko co chcemy.
Plansza realna zamienia się nam na 22 kolumny i 32 wiersze, czyli możemy policzyć pozycję startową
nr = 9 *22 + 5 + 1 = 204
Jeśli przypatrzymy się numeracji pól wokół niego to uzyskamy taki widok:
Kod
181 182 183
203 204 205
225 226 227
A z tego można łatwo zauważyć jaki ruch to jaka operacja, gdyż zawsze to końcowe pole odjąć startowe:
W lewo w górę: 181 - 204 = -23
W górę: 182 - 204 = -22
W prawo w górę: 183 - 204 = -21
W lewo: 203 - 204 = -1
W prawo: 205 - 204 = 1
W lewo w dół: 225 - 204 = 21
W dół: 226 - 204 = 22
W prawo w dół: 227 - 204 = 23
Popatrz na to, na wielkości planszy i zauważ prostą rzecz...
W lewo w górę => - ilość_kolumn_w_wierszu - 1
W górę => - ilość_kolumn_w_wierszu
W prawo w górę => - ilość_kolumn_w_wierszu + 1
W lewo => -1
W prawo => +1
W lewo w dół => ilość_kolumn_w_wierszu - 1
W dół => ilość_kolumn_w_wierszu
W prawo w dół => ilość_kolumn_w_wierszu + 1
Masz zdefiniowane wszystko: operacje będące ruchami, wielkość planszy, numeracje pól. Czego chcieć więcej? Jedyne co potrzebujesz do wygenerowania plansz to:
- znać ich wielkość bazową,
- wiedzieć co jest na jakim polu,
- jakie numery pól są zablokowane.
Dlaczego tak? Ponieważ w bazie nie musisz już rozwalać wszystkiego na macierze.
Zamiast zapisywać punkty w formie układu współrzędnych w postaci (x,y) masz jedną liczbę. Możesz mieć ogrom plansz, które przechowują informacje w postaci: numer_planszy, numer_pola, id_obiektu zamiast rozbijać numer_pola na dwie składowe.
Co nam to daje przykładowo? Zaprezentuję prostym przykładem. Mamy już wygenerowaną "mapę" i teraz pewne pola wrzucamy do tablicy $forbidden, która przechowuje pola na które nie można wejść. Sposób sprawdzenia banalny... Próbujemy wykonać "operację ruchu" i sprawdzamy czy wynik jest w tej tablicy (zwykłe użycie
in_array) jeśli tak - robimy ruch. Ba... Możemy na planszy umieszczać przedmioty interaktywne. Jak? Robimy tablicę $interaction (lub $objects jak kto lubi), której klucz to numer pola, a wartość to tablica przedmiotów jakie się na tym polu znajdują. Jaki plus użycia obu? Pola zabronione też mogą przechowywać przedmioty, które są... elementami otoczenia (skały, drzewa). Używając stałych i określonych identyfikatorów, można wstawić do grafiki pola grafikę owego przedmiotu. Mogą też niektóre obiekty stanowić portale między mapami. Masz więc maksymalnie uproszczone operacje do: dodawania, odejmowania, prostego wyszukiwania tablicowego po wartościach lub kluczach. Cały świat można tak "narysować". Bo jakie masz ograniczenie int? Nawet 10k na 10k nie wyczerpuje go

A nie sądzę, byś tak ogromne plansze robił. Poza tym jak wyobrażasz sobie sprawdzanie pola w układzie kartezjańskim? Musiałbyś stworzyć obraz planszy i
wszystkich jej pól by potem sprawdzać owe pola z możliwością ruchu. Zamiana na wektor sprawia, że przechowujesz jedynie informację o
niezbędnych polach, czyli takich gdzie coś jest lub zabronionych dla ruchu. Tych będzie o niebo mniej.
EDIT: Poza tym zobacz co w bazie robisz za bałagan... Jeśli w bazie nie ma pola, to jest ono zablokowane? A co z polami pustymi, gdzie można przejść, ale nie ma nic? W bazie masz tak więc pola, które są puste i do niczego nie służą, tyko po prostu są, bo nie mogą być zablokowane. Jeśli masz na planszy duże, puste przestrzenie, masz ogrom takich pól w bazie. Jeśli byłby z kolei "zapchane" plansze, to byłoby dużo pól w bazie. I tak źle, i tak niedobrze. Ale prędzej będzie wariant z dużą ilością wolnych. No chyba, że zrobisz ścieżkę jedyną słuszną przez las czy w górach

Zauważ też, że zablokowane pola też zazwyczaj są czymś zapełnione i to też musi gdzieś być przechowane. Powstaje Ci więc tylko tak naprawdę utworzenie 3 tabel:
- Board: id, width, height
- Items: id, forbidden
- Fields_to_item: board_id, field_id, item_id
No i oczywiście reszta już zależna od tego co chcesz robić. Mogą to być tabele właściwości przedmiotów, ekwipunku, graczy itp.