Nawigowanie po obiekcie. Zmiana wartości elementu obiektu z zastosowaniem pośredniczącej funkcji.

0

W moim najnowszym projekcie stworzyłem kwadratową planszę z możliwością ustalenia ilości pól (licz).
Żeby łatwiej zarządzać ruchami bohatera który ma się po tym przemieszczać wprowadziłem układ kartezjański.
Teraz mam problem ze zmianą wartości obiektu poprzez funcje navigate. Nie mogę zrobić navigate(2, 4) = "hero".
Jak mogę zmieniać wartości obiektu nie rezygnując z układu x i y?

board = {}
function createBoard(licz){
	for (var i = 0; i < licz * licz; i++){
		board[i] = "nothing"
	}
	board[2] = "hero";
	board[0] = "treasure";
}
function navigate (x, y) {
	  return board[(y-1)*licz + (x -1)]
}
1

Widzę co najmniej dwie opcje:

function set (x, y, v) {
      board[(y-1)*licz + (x -1)] = v;
}

oraz

function pos(x,y) {
   return (y-1)*licz + (x -1);
}
board[pos(x,y)] = v;

W javascripcie niestety chyba nie ma referencji na wartości podstawowe, więc zwracając board[x] zwracasz wartość (string). Gdybyś zamiast stringów miał tam słowniki, chyba już by było przekazywane przez referencję, ale pewności nie mam.

0

Panie co to jest ?
**board = {} **
a potem robisz
board[2] = "hero";
board[0] = "treasure";

nie wczytuje się ale to wygląda co najmniej dziwnie
board jest obiektem a odwołujesz się jak do tablicy

0

Twój bohater może być obiektem, który ma metodę odpowiedzialną za zmianę jego pozycji (x,y)

const hero = {
  posX : 0,
  posY : 0,
  move : function(x, y){
      console.log(this.posX, this.posY)
      this.posX +=x;      
      this.posY +=y;
      console.log(this.posX, this.posY);
  }
}

hero.move(1,3);
hero.move(2,5);

0

Mnie najbardziej zastanawia jak dodawać bezboleśnie inne obiekty do gry. Ściany, żeby się nie dało przejść, trujące grzyby itd. A na razie mam to zrobione tak że przy ruchu w prawo, lewo itd mam rzędy if'ów. (jak bohater ma się zachować w związku z wejściem na) Ale chyba nie tędy droga.

1

Ściany, żeby się nie dało przejść, trujące grzyby itd

  1. wszystko da się sprowadzić do parametrów (trujący grzyb może mieć parametr "isPoisonous", ściana może mieć parametr "isObstacle" na true itp.). Tym sposobem trujący grzyb będzie potraktowany tak samo jak trujące opary nuklearne. Więc zamiast 20 ifów będziesz miał 3 (czasami można w ogóle zlikwidować ify za pomocą innych technik, np. mapowanie czegoś do czegoś, z drugiej strony kurczę, czasem te ify są jednak potrzebne).

  2. pytanie też, kto to powinien sprawdzać, moim zdaniem to powinno być bardziej na poziomie silnika gry, a nie bohater powinien sam sobie sprawdzać. Ale o tym ostatnio cała dyskusja wynikła, warto poczytać: Hermetyzacja odpowiedzialności vs. SRP

1 użytkowników online, w tym zalogowanych: 0, gości: 1