Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Moja pierwsza klasa walki: Player vs Boot
Forum PHP.pl > Forum > PHP > Object-oriented programming
Nortonek
Piszę swoją pierwszą klasę do walki user kontra boot

Proszę o radę czy idę w dobrym kierunku czy dobrze rozumiem ideę programowania obiektowego.

Czy zmienne sesyjne powinny być może poza klasą.


  1. $KLASA_walka = new PLAYERvsNPC($player_id,$pc_id,$id_walki);
  2.  
  3. $KLASA_walka->MielonkaPLAYERvsNPC();
  4.  
  5. echo '<br />Aktualna Tura: '.$KLASA_walka->get_WALKA_tura();
  6.  
  7. echo '<br />Player ID: '.$player_id;
  8. echo '<br />życie: '.$KLASA_walka->get_PLAYER_zycie();
  9.  
  10. echo '<br />NPC ID: '.$player_id;
  11. echo '<br />życie: '.$KLASA_walka->get_NPC_zycie();
  12.  
  13. class PLAYERvsNPC { // pierwsza moja klasa ;) proszę nie bić
  14. public $ID_user = null;
  15. public $ID_nps = null;
  16. public $ID_walka = null;
  17. public $PLAYER_zycie = null;
  18. public $PLAYER_atak = null;
  19. public $PLAYER_obrona = null;
  20. public $NPC_zycie = null;
  21. public $NPC_atak = null;
  22. public $PNPC_obrona = null;
  23. public $WALKA_czas_start = null;
  24. public $WALKA_czas_dalej = null;
  25. public $WALKA_tura = null;
  26. public $czas_trwania_tury = 10; // w sekundach
  27.  
  28. public function __construct($ID_user, $ID_npc, $ID_walka)
  29. {
  30. $this->ID_user = $ID_user;
  31. $this->ID_npc = $ID_npc;
  32. $this->ID_walka = $ID_walka;
  33.  
  34. $this->PLAYER_zycie = 100;
  35. $this->PLAYER_atak = 20;
  36. $this->PLAYER_obrona = 10;
  37.  
  38. $this->NPC_zycie = 100;
  39. $this->NPC_atak = 20;
  40. $this->NPC_obrona = 10;
  41.  
  42. $this->set_WALKA_tura();
  43.  
  44. $this->set_WALKA_czas_start(time());
  45. }
  46.  
  47.  
  48. public function MielonkaPLAYERvsNPC() // sprawdzamy czy jest nowa tura i wykonujemy operacje WALKI
  49. {
  50. if (!isset($_SESSION['W_'.$this->ID_walka.'_tura'])) {
  51. $this->set_WALKA_czas_start();
  52. $_SESSION['W_'.$this->ID_walka.'_player_'.$this->ID_user.'_z'] = $this->PLAYER_zycie;
  53. $_SESSION['W_'.$this->ID_walka.'_pc_'.$this->ID_npc.'_z'] = $this->NPC_zycie;
  54. }
  55. else {
  56. $_SESSION['W_'.$this->ID_walka.'_start_dalej'] = time();
  57. $minelo_tury = $_SESSION['W_'.$this->ID_walka.'_start_dalej'] - $this->get_WALKA_czas_start();
  58.  
  59. if ($minelo_tury >= $this->czas_trwania_tury) {
  60. $this->walka_PLAYERvsNPS(); // zabieramy zycie Playerowi i NPC
  61. $_SESSION['W_'.$this->ID_walka.'_start'] = $_SESSION['W_'.$this->ID_walka.'_start_dalej'] = time();
  62. }
  63. $this->czas_trwania_tury = $this->czas_trwania_tury - $minelo_tury;
  64.  
  65. $_SESSION['W_'.$this->ID_walka.'_player_'.$this->ID_user.'_z'] = $this->PLAYER_zycie;
  66. $_SESSION['W_'.$this->ID_walka.'_pc_'.$this->ID_npc.'_z'] = $this->NPC_zycie;
  67. }
  68. }
  69.  
  70. public function walka_PLAYERvsNPS() // WALKA i odejmowanie życia
  71. {
  72. $PLAYER_sila_ataku= ceil($this->PLAYER_atak - $this->NPC_obrona);
  73. $NPC_sila_ataku = ceil($this->NPC_atak - $this->PLAYER_obrona);
  74.  
  75. if ($NPC_sila_ataku>0) {
  76. $PLAYER_zostalo_zycia = $this->PLAYER_zycie - $NPC_sila_ataku;
  77. if ($PLAYER_zostalo_zycia>=0) $this->PLAYER_zycie = $PLAYER_zostalo_zycia;
  78. else $this->PLAYER_zycie = 0;
  79. }
  80.  
  81. if ($PLAYER_sila_ataku>0) {
  82. $NPC_zostalo_zycia = $this->NPC_zycie - $PLAYER_sila_ataku;
  83. if ($NPC_zostalo_zycia>=0) $this->NPC_zycie = $NPC_zostalo_zycia;
  84. else $this->NPC_zycie = 0;
  85. }
  86. }
  87.  
  88. public function set_WALKA_tura()
  89. {
  90. if (!isset($_SESSION['W_'.$this->ID_walka.'_tura'])) {
  91. $this->WALKA_tura = 1;
  92. }
  93. else {
  94. $this->WALKA_tura = $_SESSION['W_'.$this->ID_walka.'_tura'] + 1;
  95. }
  96. $_SESSION['W_'.$this->ID_walka.'_tura'] = $this->WALKA_tura;
  97. }
  98.  
  99. public function set_WALKA_czas_start()
  100. {
  101. $_SESSION['W_'.$this->ID_walka.'_start'] = time();
  102. $this->WALKA_czas_start = $_SESSION['W_'.$this->ID_walka.'_start'];
  103. }
  104.  
  105. public function get_WALKA_tura()
  106. {
  107. return $this->WALKA_tura;
  108. }
  109.  
  110. public function get_WALKA_czas_start()
  111. {
  112. return $this->WALKA_czas_start;
  113. }
  114.  
  115. public function get_PLAYER_zycie()
  116. {
  117. return $this->PLAYER_zycie;
  118. }
  119.  
  120. public function get_PLAYER_obrona()
  121. {
  122. return $this->PLAYER_obrona;
  123. }
  124.  
  125. public function get_PLAYER_atak()
  126. {
  127. return $this->PLAYER_atak;
  128. }
  129.  
  130. public function get_NPC_zycie()
  131. {
  132. return $this->NPC_zycie;
  133. }
  134.  
  135. public function get_NPC_obrona()
  136. {
  137. return $this->NPC_obrona;
  138. }
  139.  
  140. public function get_NPC_atak()
  141. {
  142. return $this->NPC_atak;
  143. }
  144.  
  145. }
PrinceOfPersia
a po co te prefixy?

$this->WALKA_tura
$this->WALKA_czas_start
...
to wygląda jakbyś potrzebował kolejnej oddzielnej klasy Walka.

$this->PLAYER_atak;
$this->PLAYER_obrona;
tu tak samo. Zarówno Player, jak i NPC mógłby być osobną klasą.


A to:
  1. $this->PLAYER_zycie = 100;
  2. $this->PLAYER_atak = 20;
  3. $this->PLAYER_obrona = 10;

raczej pasowałoby do konstruktora klasy Player. Trochę nielogiczne, żeby znajdowało się to w klasie PLAYERvsNPC. Wyobraź sobie Adama Gołotę. Rodzi się od razu z życiem, sam ćwiczy swój atak, sam ćwiczy swoją obronę i już tak uformowany staje do walki GOŁOTAvsNPC

A u Ciebie to trochę jakby klasa walki tworzyła magicznie graczy. Jakby Gołota nie istniał, a dopiero Walka GOŁOTAvsNPC, stworzyłaby Gołotę. Klasa walki jest więc zbyt rozbudowana, i w sumie cała obiektowość znika. I powstaje tzw. God Object:
Cytat
In object-oriented programming, a god object is an object that knows too much or does too much. The god object is an example of an anti-pattern.

http://en.wikipedia.org/wiki/God_object
Nortonek
po przeczytanie God_object wywnioskowałem że

wrzuciłem wszystko do 1 worka a powinienem podzielić to na dodatkowe klasy Player, NPC, Tura, itp/itd

czy tak?

emp
Zasada_jednej_odpowiedzialnosci
Jedna odpowiedzialnośc jedna klasa. Podziel to na klasy o jednej odpowiedzialnosci.
Przeczytaj to czysty-kod-podrecznik-dobrego-programisty
Pisss joł
Nortonek
w takim razie zaczynam naukę bo nawyk programowania proceduralnego bierze górę w tym co robię
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.