Problém s array a while loopom – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s array a while loopom – PHP – Fórum – Programujte.comProblém s array a while loopom – PHP – Fórum – Programujte.com

 

Nayram
~ Anonymní uživatel
2 příspěvky
12. 2. 2015   #1
-
0
-

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)
 

$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;
  }

}
Nahlásit jako SPAM
IP: 62.197.243.–
Kit+15
Guru
12. 2. 2015   #2
-
+1
-
Zajímavé

Lidi, přestaňte už používat ten zastaralý ovladač MySQL. V další verzi PHP už nebude!

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Nayram
~ Anonymní uživatel
2 příspěvky
12. 2. 2015   #3
-
0
-

Ja sa snažím pochopiť len ako má fungovať ten script a ako by to malo byť naprogramované, tieto moderné záležitosti momentálne idú bokom aj keď viem že ma časom dobehnú taktiež

Nahlásit jako SPAM
IP: 62.197.243.–
Kit+15
Guru
12. 2. 2015   #4
-
0
-

#3 Nayram
Jenže třeba já ty staré záležitosti už odmítám číst. Bude ti muset poradit někdo jiný.

Navíc je to tak blbě odsazené, že se to ani číst nedá. To jsi psal v Notepadu? Jiné editory to snad takhle nedělají.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4014 příspěvků
13. 2. 2015   #5
-
0
-

No, on to Kit rika dost neomalene vsem :) Ale v podstate s nim souhlasim. Jen mi jeste neukazal verzi, ve ktere to nefunguje :) Jen porad o ni sni. Takovy pristup meli i uzivatele na jakpsatweb. Ze bude php6 a kdesi cosi a nakonec to super vylepseni skoncilo celkem rozumne jako php 5.neco.
Ja rikam, az to bude, pak ma smysl nalehat na upravy kodu.
Nicmene si pamatuji doby php4 a spoustu prikladu a odpovedi ve forech je na netu stale dost. Problem je, ze aby fungoval kod php4 pri default nastaveni v php5, tak je treba casto provest upravu kodu a pak jsou toho plna fora stejneho dotazu, proc mi to nefunguje, kdyz autor clanku popisuje, jak mu to krasne funguje. Takze by mozna bylo lepsi se vyhybat se zastaralemu kodu.

Nayram - No, neni mi to jasne, co kde mas ulozene. Mozna, kdybys udelal export databaze kazde te tabulky a vypsal, co potrebujes z kazde ziskat. Prijde mi, ze to mas cele nejak spatne.

<?php
$q1 = "
SELECT 
  army_power AS attack,
  army_def   AS defense,
  army_power AS health
FROM
  game_army_units_attacking
WHERE
  army_attack = '%0' 
  AND army_enabled = 1
";
$query  = vsprintf($q1, $_GET['id'] * 1);
$result = mysql_query($query);
echo '<pre>';
while (($unitinfo = mysql_fetch_assoc($result)) != NULL)
	{
	print_r($unitinfo);
	} 
?>
Ten kod ti preci vytahne to same, co sem pracne skladas z kousicku
   $players_attacker = array(array('attack' => $unitsinfo['army_power'], 'defense' => $unitsinfo['army_def'], 'health' => $unitsinfo['army_power']));

Mozna by bylo dobre, kdyby sis to vypisoval, jestli je v kazdem poli presne to, co tam ma byt. Pouzivas phpmyadmin? Uloz si dotaz do promenne, vypis na obrazovku a zkopiruj do sql okenka v phpmyadminovu. on ti ukaze tabulku s vysledky dotazu
$query = "SELECT...";
echo $query;

Treba mi neni jasne, proc delas
$unit = mysql_fetch_assoc($query_unit_info); kdyz $unit uz nikde dal nepouzivas

SELECT
  a.id_hrac1,
  a.id_hrac2,
  a.id_jednotkatyp,
  a.pocet,
  b.army_power AS attack,
  b.army_def   AS defense,
  b.army_power AS health
FROM
  tbl_utoky a
    LEFT JOIN tbl_info b ON b.id_typ=a.id_jednotkatyp
-- pripoj info o jednotce
WHERE
  a.id_hrac1 IN (1,5)
  AND a.id_hrac2 IN (1,5)
-- cili utoci hrac1 proti hrac2 a
-- opacne, pobiji se jen utocici jednotky,
-- jednotky neposlane do utoku se ignoruji
ORDER BY
  a.id_jednotkatyp

To by ti melo dat tabulku
  id_hrac1, id_hrac2, id_jednotkatyp, pocet, attack, defense, health
  1, 5, 1, 324, 5, 0, 2
  5, 1, 1, 122, 2, 4, 1
  1, 5, 2,  53, 3, 1, 2
  5, 1, 2,  22, 4, 3, 1
  1, 5, 3,   4, 3, 2, 2
  5, 1, 3,   2, 4, 3, 1
  1, 5, 4,  76, 2, 0, 2
  5, 1, 4,  34, 1, 1, 1

Cyklem uz si to z te tabulky dokazes vycucat. Ja bych sel do toho jinak. udelam si pri kazdem cyklu pole se seznamem nenulovych typu a pro hrace 1, random udelam nad timto polem. Ale mozna to nebude tak rychle jako s unset. 

typy = array()
for (i=0;i<4;i++) {if (data['typ'][i]>0) typy[] = i;} //typy = array(5,3,4) // vyber nenulove pocty z kazdeho typu
li = count(typy);
if li==0 break; // prerus cyklus
i = rnd(li)
i = typy[i]
info = data['typ'][i]]
data['typ'][i]['pocet']--
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:f4d4:d0...–
peter
~ Anonymní uživatel
4014 příspěvků
13. 2. 2015   #6
-
0
-

jo, ten vsprintf samozrejme jinak, tam jsem chtel array a taky zapis v tom $q bude trochu jiny, viz manual
http://php.net/…vsprintf.php
Sem to zapomnel doupravit... :)

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:f4d4:d0...–
Kit+15
Guru
Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4014 příspěvků
13. 2. 2015   #8
-
0
-

Super, tak ten link pridavej do kazdeho tematu aspon jednou, k tvym poznamkam o zastaralem mysql.
A take by mozna bylo dobre hodit nejaky link na testy s microtime na obe reseni s mysql a mysqli nebo pdo, ktere sezere vic casu :) Protoze, kdyz delas neco vetsiho, cas je dulezity a misto php se stejne prechazi na cecko :)

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:f4d4:d0...–
Kit+15
Guru
13. 2. 2015   #9
-
0
-

#8 peter
PDO sežere méně času než ovladač mysql.

Je zbytečné přecházet na céčko, PHP je dost rychlé už samo o sobě.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

Podobná vlákna

Problem s array — založil jozo0025

Array — založil Martin

Array — založil Row

$a[], [], array[] — založil Rudolf

COM Array — založil Pawl

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý