Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Moja pierwsza klasa walki: Player vs Boot, chodzi o naprowadzenie czy tak można programować
Nortonek
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 29.11.2003

Ostrzeżenie: (0%)
-----


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


Ten post edytował Nortonek 7.04.2013, 19:18:50
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
PrinceOfPersia
post
Post #2





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował PrinceOfPersia 7.04.2013, 19:32:26
Go to the top of the page
+Quote Post
Nortonek
post
Post #3





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 29.11.2003

Ostrzeżenie: (0%)
-----


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?

Go to the top of the page
+Quote Post
emp
post
Post #4





Grupa: Zarejestrowani
Postów: 195
Pomógł: 14
Dołączył: 12.01.2006
Skąd: Gotham City

Ostrzeżenie: (0%)
-----


Zasada_jednej_odpowiedzialnosci
Jedna odpowiedzialnośc jedna klasa. Podziel to na klasy o jednej odpowiedzialnosci.
Przeczytaj to czysty-kod-podrecznik-dobrego-programisty
Pisss joł

Ten post edytował emp 7.04.2013, 20:30:21
Go to the top of the page
+Quote Post
Nortonek
post
Post #5





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 29.11.2003

Ostrzeżenie: (0%)
-----


w takim razie zaczynam naukę bo nawyk programowania proceduralnego bierze górę w tym co robię
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 00:10