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

Nawigowanie po obiekcie. Zmiana wartości elementu obiektu z zastosowaniem pośredniczącej funkcji.
adams0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 333
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?

Kopiuj
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)]
}
elwis
  • Rejestracja: dni
  • Ostatnio: dni
1

Widzę co najmniej dwie opcje:

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

oraz

Kopiuj
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.

NikolaPolov
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 106
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

PS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

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

Kopiuj
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);

adams0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 333
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.

LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8488
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ć: https://4programmers.net/Forum/Inzynieria_oprogramowania/305878-hermetyzacja_odpowiedzialnosci_vs_srp

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.