Autor Zpráva
kimmy
Profil *
Ahoj,

nepomohl by mi někdo vyřešit jeden problém?

Mám pole například v tomto tvaru:

Array
(
    [0] => Array
        (
            [cislo_hrace] => 1
            [zaver] => 42
        )

    [1] => Array
        (
            [cislo_hrace] => 2
            [zaver] => 32
        )

    [2] => Array
        (
            [cislo_hrace] => 1
            [zaver] => 33
        )
) a tak dále ....


Čísla hráčů jsou vždy jen dvě a závěr je nějaká buňka v poli 10x10. Vlastně jako v piškvorkách.
A já bych potřebovala zobrazit to hrací pole (třeba jako tabulku 10 řádků x 10 buněk) a v každé buňce podle souřadnic vykreslit:

1) nic, pokud tam není tah
2) pokud tam má tah hráč číslo 1, tak třeba kolečko
3) pokud tam má tah hráč číslo 2, tak třeba křížek.

Souřadnice jsou asi jasné... "32" znamená vykreslení znaku ve druhém řádku a jeho třetí buňce.

Jde mi jen o zobrazení té tabulky a vykreslení těch hodnot na patřičná místa. Aby jinde byly prázdné buňky - to se mi nějak nedaří.

Děkuju moc.
gogy27
Profil
Nerobis to cez db? ja som nieco podobne robil ale iba cez databazu takto som to nevedel.
kimmy
Profil *
gogy27
Jasně, dělám to přes databázi. To pole jsem z ní právě vytáhla, ale už se mi to nedaří rozparsovat do toho pole 10x10.. Můžu se zeptat co jsi dělal Ty?
tiso
Profil
kimmy - a čo máš v tej DB uložené?
AM_
Profil
Souřadnice máš trošku nešikovně, vzhledem k tomu, že se dle zvyklostí indexuje od nuly pokud to jde, a desítky bych nechal spíše jako řádky, aby se vykreslovalo po řádcích, a ne po sloupcích. 32 by měl být čtvrtý řádek a třetí sloupec (adresace se pak provádí řádek*10+sloupec). Jak vlastně adresuješ poslední pole? 1010? nešikovné :) 99 je lepší :)

$tahy = array();
foreach ($source as $tah){
  $tahy[$tah['zaver']] = $tah['cislo_hrace']; //ulozi cislo hrace do pole s indexem odpovidajicim pozici na herni plose
  //index je ve tvaru radek * 10 + sloupec, pricemz levy horni roh je v [0,0] a pravy dolni je [9,9]
}
echo '<table>';

for ($i = 0; $i < 100; $i++){
  if ($i % 10 == 0) echo '<tr>'; //na pocatku radku odpovida po deleni i/10 zbytek = 0
  echo '<td>';
  if (isset($tahy[$i])) echo $tahy[$i]; //vypise cislo hrace do dane bunky. Pokud v dane bunce neni zadny tah, nevypise nic
  if ($i % 10 == 9) echo '</tr>'; //za posledni bunkou v radku analogicky zbytek=9
}


Skript jsem nezkoušel tak se omlouvám za případnou chybu, ale logicky to fungovat bude.
Majkl578
Profil
wow holka programatorka...


pokud to chapu dobre, mas pole o 100 prvcich - dalsich polich. tohle cleneni se mi nelibi, je zbytecne treba dalsiho cyklu. kdyby sis udelala, ze 'zaver' bude hlavni klic a jeho hodnota bude cislo hrace, bylo by to mnohem jednodussi. pro to ti taky napisi priklad.

testovano, funguje.
$pole = array(7 => 32, 8 => 11, 14 => 1, 20 => 3, 76 => 0, 99 => 88, 100 => 2);//ilustracni - tve pole
$table = array();

foreach($pole as $key => $id) {
	$table[($key % 10)][floor($key/10)] = $id;
}

echo '<table border=1 cellspacing=2><tr>';
for($i = 1; $i <= 100; $i++) {
	echo '<td>', (isset($table[($i % 10)][(floor($i/10))]) ? $i . '>' . $table[($i % 10)][(floor($i/10))] : ''), '</td>', "\n";
	if(!($i % 10) && $i != 0 && $i != 100) {
		echo '</tr><tr>', "\n";
	}
}
echo '</tr></table>';
kimmy
Profil *
Moc všem děkuju za radu.

tiso
v DB mám uložené jen to číslo hráče a jeho tah.

Majkl578
Tvoje řešení funguje dobře, moc díky, ale je trochu složitější na zápis. Zdá se mi jednodušší na pochopení to AM_ovo :-)

AM_
Jo, souřadnice mám samozřejmě [0,0] až [9,9]. Při psaní toho prvního příspěvku jsem se spletla. Tvůj zápis se mi líbí, je takový jednoduchý.. chybělo Ti akorát uzavření buňky </td>, ale to je jedno...

Chtěla bych si teď ty řádky a sloupce očíslovat, jako na šachovnici. Nějak takto: http://obi22.ic.cz/piskvorky/

Ale tabulka utíká dospod.. Mám to asi zbytečně složitě zapsané, dá se to zaspat nějak jednodušeji?...

$query = mysql_query("SELECT * FROM piskvorky ORDER BY id");
$pole = array();

while($row = mysql_fetch_array($query)) {
  $pole[$row['zaver']] = $row['cislo_hrace'];
}


echo '<table>';
echo '<tr><td></td>';
for ($k = 0; $k<=9; $k++) {
  echo '<td style="text-align:center;">'.$k.'</td>';
}
echo '</tr>';


for ($m = 0; $m<=9; $m++) {
  echo '<tr><td style="text-align:center;">'.$m.'</td></tr>';
}


for ($i = 0; $i < 100; $i++){
  if ($i % 10 == 0) echo '<tr>'; //na pocatku radku odpovida po deleni i/10 zbytek = 0  
  echo '<td style="width:20px; height:10px; text-align:center; border:1px solid black;">';
  if (isset($pole[$i])) { //vypise cislo hrace do dane bunky. Pokud v dane bunce neni zadny tah, nevypise nic
    if ($pole[$i] == '1') echo 'X';
    else echo 'O';
  } 
  else echo '&nbsp;';
  echo '</td>';
  if ($i % 10 == 9) echo '</tr>'; //za posledni bunkou v radku analogicky zbytek=9
}
echo '</table>';


Díky moc, jste moc hodní.
Majkl578
Profil
kimmy
kdyz na to ted tak zpetne koukam, zbytecne jsem to prekombinoval, teoreticky tam to deleni do poli dle radku nemuselo byt, ale co uz :) hlavne ze funguje

co se tyce ocislovani, musis to spravne zaclenit do toho kodu. za otevreni tabulky pridej horni radek cisel
do for pridej k <tr> bunku s cislem radku.
kimmy
Profil *
Majkl578
jo, super, díky moc, funguje..
kimmy
Profil *
Aha, ještě jsem natrefila na háček :-(

http://obi22.ic.cz/piskvorky/

Uložila jsem hodnotu 1 na pozici "42". Křížek by se tím pádem měl objevit na třetím řádku v pátém sloupci (tzn. o dvě políčka nahoru a o dvě políčka doprava oproti aktuální pozici, viz. odkaz).

Ale tím, že jen procházím pole o sto prvcích, se označí pole 42. v pořadí od začátku první buňky... a to je špatně. Šly by ty čísla nějak obrátit? Místo 42 zobrazovat 24? Pak by to leželo ve správné pozici... Nebo by mohlo existovat jiné řešení?

Děkuju moc.
Joker
Profil
kimmy
Uložila jsem hodnotu 1 na pozici "42". Křížek by se tím pádem měl objevit na třetím řádku v pátém sloupci (tzn. o dvě políčka nahoru a o dvě políčka doprava oproti aktuální pozici, viz. odkaz).
Ale tím, že jen procházím pole o sto prvcích, se označí pole 42. v pořadí od začátku první buňky... a to je špatně.

Proč je to špatně? Mně připadá [4;2] správně.
edit: vlastně podle X-Y to označené políčko je [2;4]. I tak mi to ale připadá správně.
kimmy
Profil *
Joker
No první se značí osa X a potom osa Y. Takže ten zobrazený křížek je na pozici [2;4], ne [4;2]. A hodnota [4;2] je uložena v databázi.
Majkl578
Profil
pouzil jsem svuj script:

$pole = array(7 => 32, 8 => 11, 14 => 1, 20 => 3, 76 => 0, 99 => 88, 100 => 2);//ilustracni - tve pole
$table = array();

foreach($pole as $key => $id) {
    $table[floor($key/10)][($key % 10)] = $id;
}

echo '<table border=1 cellspacing=2><tr>';
echo '<td></td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td></tr><tr><td>0</td>';
for($i = 0; $i < 100; $i++) {
	 if(!($i % 10) && $i != 0 && $i != 100) {
		echo '</tr><tr><td>', $i/10, '</td>', "\n";
	}
	echo '<td style="border:1px solid #000;">', (isset($table[($i % 10)][(floor($i/10))]) ? $i . '>' . $table[($i % 10)][(floor($i/10))] : '&nbsp;'), '</td>', "\n";

}
echo '</tr></table>';


Joker
staci vpodstate invertovat vypis
kimmy
Profil *
Majkl578

Prosím, nenapsal bys mi tenhle řádek nějak zjednodušeně?:

echo '<td style="border:1px solid #000;">', (isset($table[($i % 10)][(floor($i/10))]) ? $i . '>' . $table[($i % 10)][(floor($i/10))] : '&nbsp;'), '</td>', "\n";


Je takový divný, proč jsou tam čárky místo středníků, chybí if a je v tabulce \n?
Majkl578
Profil
kimmy
čárky místo středníků
echo je jedina "funkce", ktera se chova jako konstrukt a akceptuje vstup jako N parametru. rika se, ze je to rychlejsi (retezec se prvne nespojuje jako kdyz pouzijes tecku, jde rovnou na vystup)

chybí if
?: je alternativni logicka syntaxe podminky. priklad:
$x = 5 ? true : false;
echo $x === true ? 'pravda' : 'lez';


v tabulce \n
\n je novy radek, nikoliv ale v html, pouze v cistem textu (zdrojovy kod v prohlizeci), pak je to prehlednejsi


OT: je ZČU dobra skola?
kimmy
Profil *
Majkl578
Díky moc. Jde mi o jednoduchost kódu, protože to musím převést do C#, jen pro inspiraci si to zkouším v PHP, protože ten aspoň trochu ovládám. Zjednodušila jsem si to sama
$table = array();

foreach($pole as $key => $id) {
  $table[floor($key/10)][($key % 10)] = $id;
}


echo '<table><tr><td>&nbsp;</td>';
for ($k = 0; $k<=9; $k++) {
  echo '<td style="text-align:center;">'.$k.'</td>';
}
echo '</tr><tr><td>0</td>';
for($i = 0; $i < 100; $i++) {
  if(!($i % 10) && $i != 0) {
    echo '</tr><tr><td>'.($i/10).'</td>';
  }
  echo '<td style="border:1px solid #000; width:20px; height:10px; text-align:center; ">';
  if (isset($table[($i % 10)][(floor($i/10))])) {
    if ($table[($i % 10)][(floor($i/10))] == 1) echo 'X';
    else echo 'O';
  } else {
    echo '&nbsp;';
  }
  echo '</td>';

}
echo '</tr></table>';


a funguje to dobře... děkuju moc.
kimmy
Profil *
Majkl578
ZČU je co? :-)
gogy27
Profil
Majkl578
ZČU je co? :-)
Zapadoceska univerzita
Majkl578
Profil
kimmy
gogy27
dival jsem se na http://obi22.ic.cz/ , je tam img rozvrh, tak jsem usoudil, ze by jsi mohla byt student :D
kimmy
Profil *
Majkl578
No máš pravdu, že studentka jsem, ale na ZČU ne :-)
Majkl578
Profil
kimmy
mimochodem, proc ta zmena nicku?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: