on-game | vs-web | vs-online | AAA WEBY
Hlavni panel

Programming PHP – MFR 2. část


Programming PHP – MFR 2. část

   Vítám vás u dnešního druhého dílu seriálu, ve kterém vytváříme jednoduchou online hru. Tento seriál je pojat jako diskuse nad hotovým, leč postupně se vyvíjejícím kódem.

   V minulém díle jsme si stanovili zadání hry tedy… Hra spočívá v tom, že uživatel si vybírá jedno z deseti polí. Oněch deset polí obsahuje náhodně rozmístěná skrytá nebezpečí. Vybrání takového pole znamená pro hráče konec hry. Pokud se mu podaří vybrat pole bezpečné, připočítá se mu do score 1 bod a pokračuje dalším kolem… , dále jsme našli pokusného králíka tedy programátora, který se bude snažit splnit naše přání a my se mu na konci každého dílu odměníme výtkami. Tedy i zde lehce simulujeme reálný život.

   Náš programátor v minulém díle odevzdal fukční nicméně neúplnou verzi námi požadované hry, vytknuli jsme mu míchání globálních $_<zdroj> a $HTTP_<zdroj>_VARS . Dále jsme ho informovali o tom, že $HTTP_<zdroj>_VARS jsou na ústupu a neměl by je používat. Náš programátor na tuto výtku zareagoval tak, že v celém kódu sjednotil z $HTTP_<zdroj>_VARS na $_<zdroj> a tedy opustil zastaralou cestu. Dále pak zapouzdřil přístup do proměnných session pomocí funkcí, tento úhybný manévr mu umožňuje jednak soustředit logiku kolem session a jednak rychlý přesun na jiný „nosič“ v případě našeho požadavku.

   V rámci snazší čitelnosti náš pokusný programátor přesunul srdce skriptu co nejvýše. Tím nám urychlí hledání cesty, kudy případný chybový požadavek prošel. Nicméně tato úprava nemá žádný funkční dopad.

   Výtku kolem kontroly typu parametrů náš programátor nezpracoval a hájí se jednoduchostí a spolehlivostí jím zvoleného přístupu.

   Dalším významným krokem, který učinil naopak bylo vypreparování HTML kódu obálky a zasazení do samostatných funkcí pro jejich výpis. Byly použity apostrofy pro ohraničení řetězců, což znamená, že řetězce nebudou procházet žádným automatizovaným zpracováním, tedy jsou považované za přeformátované a připravené k okamžitému použití.

   Naopak novým jednoduchým úkolem pro dnešek bylo zavést zobrazování předchozí řádky. S tím se náš pokusný králík vypořádal opět po svém. Zavedl funkci GetEmptyRow, která vrací prázdné pole. Tato funkce mu umožní soustředit funkcionalitu kolem generování prázdné řádky opět na jedno místo. Další úpravou bylo přidání parametru funkci OnDefault, ve kterém se skrývá předchozí řádka. Pokud je funkce volána cíleně, je jí předána prázdná řádka, pokud dojde ke kroku, je jí předána řádka, která právě byla vyhodnocena. V OnDefault je pak řádka zpracována a zobrazena uživateli.

   Tento jednoduchý krok nám zvýšil feedback aplikace vůči hráči, čímž se lehce zvedla hratelnost, hráč je nyní nejen podroben pocitu úspěchu, že přežil další krok, ale zároveň je informován, jakou úroveň stěstí přitom vykázal. S postupující obtížností se mu pomyslná smyčka kolem krku postupně stahuje a to v něm bude podvědomě postupně budit větší a větší napětí ze hry.

Nicméně i dnes máme vůči našemu programátorovi několik výtek:
1.)    Udělal sice velký krok k přípravě na design aplikace, nicméně se zároveň ještě více spoutal tím, že styly jsou napevno zapsány do HTML kódu. Jakýkoliv redesign aplikace se stává čím dál více obtížnější.
2.)    Velikost pole by neměla být uváděna v kódu bylo by lepší ji nechat přístupnou přes jednu proměnnou, abychom ji mohli v případě potřeby snadno změnit a nemuseli upravovat několik čísel v kódu a vyhodnocovat pokaždé kontext jejich zápisu.
3.)    Celkově aplikace je sice funkční nicméně po designové stránce je … otřesná.


   Dnešní úkol měl náš programátor lehký, i přes to věřím, že se i z řad čtenářů ozve několik dalších připomínek.

   Příště nás čeká začátek práce s databází, protože budeme zapisovat score a číst tabulku vítězů.



Náhled Zde

Zdrojový kód:
<?php
session_start();

// zpracovani vstupnich parametru
$action = $_POST["action"];

// *** centralni zpracovani ***
switch( $action ){
case "STEP" : {
OnStep( $_POST["fieldcode"] );
break;
}
default :{
OnDefault( GetEmptyRow() );
break;
}
}

// *** /centralni zpracovani ***


// *** podpurne funkce ***
function SetSession( $varname, $value ){
$_SESSION[$varname] = $value;
}

function GetSession( $varname, $default ){
if (isset($_SESSION[$varname])) {
return $_SESSION[$varname];
} else {
return $default;
}
}

function WriteHeader(){
echo '<html>
<head>
<title>Mine Field Runner 1.0</title>
<meta name="Copyright" content="genesis, genesis@cardici.com" />
</head>
<body>
<H1>Mine Field Runner</H1>
';
}

function WriteFooter(){
echo ' </body>
</html>';
}

function GetEmptyRow(){
return array( $false, $false, $false, $false, $false, $false, $false, $false, $false, $false );
}
// *** /podpurne funkce ***


// *** sekce jednotlivych akci ***
function OnDefault( $originalRow ){
WriteHeader();
// score
$score = 0+GetSession('score', 0);
echo "<H2>Score $score bodu</H2>";

// herni pole
echo "<form action=\"?\" method=\"POST\">";
// vykresli 10 buttonu
for ( $f = 1; $f < 11; $f++ ){
echo "<input type=\"submit\" name=\"fieldcode\" value=\"$f\" style=\"width:20px;\"/>";
}
// vykresli puvodni radku
if ((!isset( $originalRow ) || (!is_array( $originalRow ) ))){
$originalRow = GetEmptyRow();
}
for ( $f = 1; $f < 11; $f++ ){
$color = "#55FF55";
if( $originalRow[$f]==true) $color = "#FF0000";
echo "<div style=\"float:left;width:20px;height:20px;background-color:$color;\"> </div>";
}
echo "<input type=\"hidden\" name=\"action\" value=\"STEP\"/>";
echo "</form>";

WriteFooter();
}

function OnStep( $code ){
$score = 0+GetSession('score',0);
$code = 0+$code;

// nasazime miny


$minecount = round($score / 5);
srand( time() );
$row = GetEmptyRow();
if ( $minecount < 10 ) {
for( $f = 0; $f < $minecount; $f++ )
{
$index = rand(1,10);
$row[$index] = true;
}
} else {
for( $f = 1; $f <= 10; $f++ )
{
$row[$f] = true;
}
}
if ( $row[$code] ){
// mina
WriteHeader();

// score
echo "<H2>Score $score bodu</H2>";

// herni pole nahradime hlaskou, ze leti vzduchem
echo "<p>Lituji, ale právě jste šlápl na minu. Snad příště.</p>";
echo "<a href=\"?\">Hrát znovu</a>";

WriteFooter();

SetSession('score',0);
}
else
{
// volne pole
SetSession('score', $score + 1 );
OnDefault( $row );
}
}


// *** /sekce jednotlivych akci ***
?>



Zatím nehodnoceno. | Přečteno 1863 x | Smaž | 5/05/2007 | Autor: genesis |
Komentařů: 9 | Vstup do diskuse |
Sdílet

Abyste mohl hodnotit tento článek, tak musíte být přihlášen. Nemáte ještě zřízený účet ? Registrujte se zde.
Všechna práva vyhrazena, © 2006 Team on-game

Optimalizováno pro 1024x768 a prohlížeče IE, Mozilla Firefox a Operu

ip:38.107.179.217, čas:0.00198888778687, sql:10