Problém s poliami a while (PHP)

Programovacie jazyky, rady, poradňa...
.:M4jco:.
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 442
Registrovaný: 01 máj 2007, 13:07
Bydlisko: Bassline lover
Kontaktovať používateľa:

Problém s poliami a while (PHP)

Príspevok od používateľa .:M4jco:. »

Zdravím, robím si vo volnom čase menší bojový skript ktorý vyberie z databazy jednotky ktoré su schopné bojovať a vykoná boj.
Jedna sa o jednoduchu tabulku /id/populacia jednotiek/hp jednotky/obrana/rychlost/sila
Pokiaľ sa jednalo o boj hráč vs hráč, bolo to naprogramovanie jednoduché, avšak pri vačšom počte jednotiek mi to robí problém a neviem prísť na správne riešenie. Niečo čo mám hotové je ukázane dole. V podstate sa jedná o to že chcem vypísať do pola všetky priradené jednotky, a vypísať ich tolko krát kolko je daná populácia v tabulke. To isté aj u protivníka, a potom vykonať útok pomocou rand_array ktorý vyberie nahodnu jednotku z jedneho pola, a nasledne z druhého a začne sa "súboj" avšak na som na to prikrátky. Bol by som rád za nejaké nasmerovanie alebo aspoň malú radu ako na to lebo dochádzajú mi nápady...
(kvalitu kodu samozrejem nehodnotiť, je to len čisto koncept)

Kód: Vybrať všetko

   $query_units_info = mysql_query("SELECT * FROM game_army_units_attacking WHERE army_attack = '".$_GET['id']."' AND army_enabled = 1");
   while (($unitsinfo = mysql_fetch_assoc($query_units_info)) != NULL) {
   $query_unit_info = mysql_query("SELECT * FROM game_army_class WHERE army_class_id = '".$unitsinfo['army_class_id']."' ");
   $unit = mysql_fetch_assoc($query_unit_info);
   $x = 1;
   while($x <= $unitsinfo['army_population']) {
   $players_attacker = array(array('attack' => $unitsinfo['army_power'], 'defense' => $unitsinfo['army_def'], 'health' => $unitsinfo['army_power']));
   $x++;
     
} 
  } 
 

 
   $query_units_info = mysql_query("SELECT * FROM game_army_units WHERE street_user = '".$row_street['attack_defender']."' AND army_enabled = 1");
   while (($unitsinfo = mysql_fetch_assoc($query_units_info)) != NULL) {
   $query_unit_info = mysql_query("SELECT * FROM game_army_class WHERE army_class_id = '".$unitsinfo['army_class_id']."' ");
   $unit = mysql_fetch_assoc($query_unit_info);
   $x = 1;
   while($x <= $unitsinfo['army_population']) {
   $players_defender =  array(array('attack' => $unitsinfo['army_power'], 'defense' => $unitsinfo['army_def'], 'health' => $unitsinfo['army_power']));
   $x++;
} 
  } 
 


$count = 0;
while (true) {
  $count++;
  $players_temp = $players;
  $attacker_key = array_rand($players);
  $attacker     =& $players[$attacker_key];
  unset($players_temp[$attacker_key]);
  $defender_key = array_rand($players_temp);
  $defender     =& $players[$defender_key];

  $hit = ($attacker['attack']/$defender['defense']) + rand(1, $attacker['level']);
  echo "{$count}. Jednotka {$defender_key} ({$defender['health']} hp) bola zranená a dostala {$hit} zranenia jednotkou {$attacker_key} ({$attacker['health']} hp)\n";
  $defender['health'] = $defender['health'] - $hit;

  if ($defender['health'] <= 0) {
    echo "Jednotka {$defender_key} umrela, jednotka {$attacker_key} vyhrala!\n";
    break;
  }

}
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Problém s poliami a while (PHP)

Príspevok od používateľa audiotrack »

tie časti kde vyberáš z db som nepozeral, predpokladám že v poli máš to čo chceš keď si tak položil otázku. Takže k tej tretej časti, netuším čo je v premennej $players (zrejme všetci bez rozdelenia útočník/obranca?).

Prvou chybou čo tam vidím je, že nerobíš unset pri mrtvom defenderovi. Takže ti tam bojujú aj zombíci :)
Nechápem načo je ti pole $players_temp keď ho používaš iba na unset, ale nikde neoveruješ či je už prázdne. Celkovo mi tá logika príde divná, teda ak to má byť niečo ako travian
.:M4jco:.
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 442
Registrovaný: 01 máj 2007, 13:07
Bydlisko: Bassline lover
Kontaktovať používateľa:

Re: Problém s poliami a while (PHP)

Príspevok od používateľa .:M4jco:. »

Tak trochu som to upravil, polia sa mi vypíšu už správne ale teraz nedokážem pochopiť tu logiku samotného "súboju"
Už sa mi všetky jednotky obrancu a jednotky utočnika načítaju do rozdielných polí, a viem že pomocou nahodneho vyberu vyberiem jednu jednotku z toho, a aj z toho. Čo však neviem ako to prebehnúť loopom, alebo ako toho docieliť? Viem ako ich vypísať a možno aj priradiť ale nejde mi do hlavy tá logika, že ked aj nahodou jedna jednotka porazí druhu, vyradim ju a ako priradim druhu? a ako zistim na konci súboju konečny počet prežitých jednotiek? :wink: Možno je to jednoduché ale stretol som sa s takymto niečim prvy krat a rád sa priučím :)

Kód: Vybrať všetko

   
$query_units_info = mysql_query("SELECT * FROM game_army_units_attacking WHERE army_attack = '".$_GET['id']."' ");
   while (($unitsinfo = mysql_fetch_assoc($query_units_info)) != NULL) {
   $query_unit_info = mysql_query("SELECT * FROM game_army_class WHERE army_class_id = '".$unitsinfo['army_class_id']."' ");
   $unit = mysql_fetch_assoc($query_unit_info);
   $unit_attacker = array();
 
   $unit_attacker[] = array(
        'name' => $unit['army_class_name'],
        'power' => $unitsinfo['army_power'],
        'attack' => $unitsinfo['army_att'],
        'defense' => $unitsinfo['army_def']
    );
 
   ///// Kolko jednotiek máš tolko krat sa vypise 
   $x = 1;    
   while($x <= $unitsinfo['army_population']) {

   foreach($unit_attacker as $index => $record){    
   ///// Tato cast pusti kod pre kazdu jednu jednotku ktora je v poli
   echo "<tr><td>Jednotka: {$record['name']} ID: {$record['power']} ParentID: {$record['attack']} Title: {$record['defense']}</td></tr>";
   $x++;
} 
}
}

 $query_units_info_def = mysql_query("SELECT * FROM game_army_units WHERE army_street = '".$row_street['attack_defender']."' ");
   while (($unitsinfo_def = mysql_fetch_assoc($query_units_info_def)) != NULL) {
   $query_unit_info_def = mysql_query("SELECT * FROM game_army_class WHERE army_class_id = '".$unitsinfo_def['army_class_id']."' ");
   $unit_def = mysql_fetch_assoc($query_unit_info_def);
   $unit_attacker_def = array();
 
   $unit_attacker_def[] = array(
        'name' => $unit_def['army_class_name'],
        'power' => $unitsinfo_def['army_power'],
        'attack' => $unitsinfo_def['army_att'],
        'defense' => $unitsinfo_def['army_def']
    );
 
   ///// Kolko jednotiek máš tolko krat sa vypise 
   $y = 1;    
   while($y <= $unitsinfo_def['army_population']) {

   foreach($unit_attacker_def as $index => $record_def){    

   ///// Tato cast pusti kod pre kazdu jednu jednotku ktora je v poli
   echo "<tr><td>Jednotka: {$record_def['name']} ID: {$record_def['power']} ParentID: {$record_def['attack']} Title: {$record_def['defense']}</td></tr>";
   $y++;
} 
}
}


Samotná "simulácia" súboju, už to je logickejšie no stále to nefunguje a neberie mi to ani hodnoty z tých polí :(

Kód: Vybrať všetko

$count = 0;
while (true) {
  $count++;
 
  $attacker_key = array_rand($unit_attacker);
  $attacker     =& $unit_attacker[$attacker_key];
  $defender_key = array_rand($unit_attacker_def);
  $defender     =& $unit_attacker_def[$defender_key];

  $hit = ($attacker['attack']/$defender['defense']) + rand(1, $attacker['level']);
  echo "{$count}. Jednotka {$defender_key} ({$defender['health']} hp) bola zranená a dostala {$hit} zranenia jednotkou {$attacker_key} ({$attacker['health']} hp)\n";
  $defender['health'] = $defender['health'] - $hit;

  if ($defender['health'] <= 0) {
    echo "Jednotka {$defender_key} umrela, jednotka {$attacker_key} vyhrala!\n";
    break;
  }

}
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Problém s poliami a while (PHP)

Príspevok od používateľa audiotrack »

v tej podmienke či defender zomrel ho musíš zmazať ak zomrel

Kód: Vybrať všetko

unset($defender[$defender_key]);
Ten break tam nebude, lebo ti vyskočí z cyklu po smrti prvého. A cyklus by mal byť asi

Kód: Vybrať všetko

while ((count($unit_attacker_def) > 0) && (count($unit_attacker) > 0)){
}
a ešte treba likvidovať aj útočníkov, lebo takto ako to máš vždy útočník vyhrá (defender nemá šancu sa ubrániť) nakoľko neutrpí žiadne zranenia. Za riadkom

Kód: Vybrať všetko

$defender['health'] = $defender['health'] - $hit;
by malo byť ešte niečo na štýl

Kód: Vybrať všetko

$attacker['health'] = $attacker['attack'] - $defender['defense'];
(prípadne si vymyslí lepší vzorec) +rovnaká podmienka či útočník prežil, ak nie tak ho zmazať
Napísať odpoveď