Geniesis
4.12.2013, 19:50:44
Witam! Ponieważ uczę się PHP postanowiłem napisać w tym właśnie języku prostą gre "saper" niestety mam problem, ponieważ za każdym razem gdy nacisnę input to strona sie odświeża, co z tym idzie nie można przetestować dalszego kodu czy działa poprawie ze względu na reset wszystkiego. Czy moglibyście mi poradzić jak mam rozwiązać ten problem? Ew. jeżeli istnieje jakieś inne lepsze rozwiązanie podsunąć mi je.
Drugim "estetycznym" problemem jest dla mnie napisanie warunku: czy da się if z linii 20 zapisać prościej w stylu linii 23?
<?php
// zmienne for: r a i b c
//$bomb[]
//$man[] tablica pokazujaca ile bomb obok
//write tablica wypisujaca
$wyn = 0; //sprawdza czy wygrales
$dis = 0; //blokowanie tablicy
$bomb[1] = 23;
$bomb[2] = 43;
//losuje miejsca $bomb
for ($r = 1; $r<11; $r++){
//$bomb[$r] = rand(1,100);
}
for($i = 1; $i < 101;$i++){ //sprawdza czy klikniecie w $bombe
for ($b = 1; $b < 11; $b++){
if($a != $bomb[$b]){
for($c = 1; $c < 11; $c++){ // sprawdza ile bomb jest obok
if (($a - 1 == $bomb[$c]) && ($a != 11) && ($a != 21) && ($a != 31) && ($a != 41) && ($a != 51) &&
($a != 61) && ($a != 71) && ($a != 81) && ($a != 91)){$man[$a]++; $dis = 1;}
if (($a + 1 == $bomb[$c]) && ($a % 10 == 0)){$man[$a]++; $dis = 1;}
if (($a - 11 == $bomb[$c]) && ($a != 11) && ($a != 21) && ($a != 31) && ($a != 41) && ($a != 51) &&
($a != 61) && ($a != 71) && ($a != 81) && ($a != 91)){$man[$a]++; $dis = 1;}
if (($a - 10 == $bomb[$c])){$man[$a]++; $dis = 1;}
if (($a - 9 == $bomb[$c]) && ($a % 10 == 0)){$man[$a]++; $dis = 1;}
if (($a + 9 == $bomb[$c]) && ($a != 11) && ($a != 21) && ($a != 31) && ($a != 41) && ($a != 51) &&
($a != 61) && ($a != 71) && ($a != 81) && ($a != 91)){$man[$a]++; $dis = 1;}
if (($a + 10 == $bomb[$c])){$man[$a]++; $dis = 1;}
if (($a + 11 == $bomb[$c]) && ($a % 10== 0)){$man[$a]++; $dis = 1;}
else{$man[$a] = ""; $dis = 1;} //jezeli nie ma
}
}
if($a == $bomb[$b]){
break;
}
$wyn++;
if ($wyn == 90){
}
}
}
}
?>
<html>
<head>
<script language ="JavaScript">
var sek = 0;
setInterval("add()",1000);
function add(){
sek++;
refresh();
}
function refresh(){
document.getElementById("stoper").innerHTML = sek;
}
</script>
</head>
<body>
<form id = "ff" method ="POST">
<div id = "stoper">0</div>
<div align = "center">
<table cellspacing = "0" cellpadding ="0">
<tr>
<?php
for ($a = 1; $a < 101; $a++){
echo "<form id = \"ff[$a]\" method = \"POST\">"; echo "<input type = \"submit\" name = \"$a\" value = \"$man[$a]\""; if ($dis == 1
){ echo "disabled = \"disabled\""; } echo "/>"; if(($a % 10 == 0)){
}
}
?>
</tr>
</table>
</div>
</form>
</body>
</html>
werdan
4.12.2013, 20:03:10
Ciekawe rozwiazanie

Nie wiem czy to dobry pomysł, aby pisac Sapera z PHP. JS jest do tego idealny.
Ale skoro uczysz sie PHP, to trzymam kciuki

Musisz zapisywac gdzies stan gry (układ bomb, klikniecia, odsłony, etc). Po kazdym uruchomieniu skryptu wszystko zaczyna sie od nowa.
Mozesz użyć cookie dla kazdej z bomb

lub sesji (session)
biorące pod uwagę, że zaczynasz ...
1/ weź kartkę papieru i narysuje co chcesz uzyskać
2/ opisz rysunek
3/ opisz zwykłymi prostymi zdaniami w punktach co chcesz by twój skrypt robił
3/ opisz sobie "językiem matematycznym" powyższe punkty odnoszące się do logiki/obliczeń gdzie jest bomba
4/ przeczytaj co napisałeś wprowadź ewentualne poprawki/modyfikację ... i dopiero zacznij kodować
ps1. uwzględnij również co napisał @werdan w ostatnim akapicie
ps2. patrząc na grę saper to co widzisz? - podpowiedź: X, Y
Geniesis
4.12.2013, 20:33:41
Wiem, że w JS byłoby prościej ale zależy mi by zrobić to w PHP.
Sesji chciałem unikać, ponieważ przy ostatnim ich używaniu nie potrafiłem napisać tak by uznawało tablice.
Plan tego mam "narysowany" w głowie choć tutaj może być różnica w doświadczeniu tzn. ja mogę nie widzieć tego co Wy.
I kolejna sprawa wg mnie to byłoby lepiej napisać na tablicy 2-wymiarowej jednak tutaj też poległem pisząc inny skrypt.
Stąd właśnie ten wygląda jak wygląda w pierw chciałem by po prostu działał jak ma, dopiero potem w przeróbki zamierzałem się bawić.
Cytat(Geniesis @ 4.12.2013, 20:33:41 )

Stąd właśnie ten wygląda jak wygląda w pierw chciałem by po prostu działał jak ma, dopiero potem w przeróbki zamierzałem się bawić.
tyle, że to nie działa jak ma :-) - zaplanuj... rozpisz...naucz się potrzebnej metody i dopiero koduje. Nie rób tego, że napisze się by coś tam działało i będzie się modyfikować w miarę możliwości - to zawsze więcej czasu zajmuje!
pozostaje Ci poczytać o tablicach i sesjach ... bo chyba nie oczekujesz "modyfikacji" przez forumowicza
Geniesis
4.12.2013, 21:23:57
Troszeczkę nie wiem czy traktujesz mnie poważnie, nie jest tak, że nie próbowałem, jeżeli coś mi nie działa, staram się to pisać prościej by zaczęło działać, wtedy dopiero staram się dość do tego dlaczego wcześniej nie działało. Może zająć to więcej czasu ale jakoś się trzeba nauczyć. Z tablicami miałem już dużo do czynienia w innych językach, jedynie w php idzie mi to topornie, nie oczekuję, że napisze mi ktoś kod za mnie, chciałem prosić o wytłumaczenie bardziej co może być powodem, że nie działa, tutaj była odp. na temat użycia sesji niestety pisząc kiedyś jakiś prosty portal (logowanie, wczytanie danych) użyłem tablic co nie działało, nawet nauczyciel nie potrafił odpowiedzieć do końca dlaczego, stąd moje zrażenie, a w powyższym kodzie bez nich ciężko się obejść. I tak błądze i głupieje, bo nie wiem jak można inaczej. Najprościej dla mnie byłoby zrobić tak by strona się nie odświeżała wtedy też problem z zablokowaniem inputów prawdopodobnie znikł, choć to PHP nie JS, więc bardzo możliwe, że się nie da...
gdzie w moich wypowiedział wyczytałeś, że traktuję Cię tak jak napisałeś

( nie oczekuje odpowiedzi)
przecież możesz ciągnąc ten algorytm, który napisałeś ... tylko nie lepiej nauczyć się robić to prawidłowo ?
skoro się "zraziłeś" do sesji to pomyśl jak chcesz stan zmiennych zapisać i przekazać je do kolejnego requesta ?
Geniesis
4.12.2013, 21:42:32
Mogło być to moje błędne subiektywne odczucie za co przepraszam.
Obecnie przerabiam to na kod z użyciem sesji, tylko czy wyjdzie poprawnie nie jestem pewien.
Możesz mi wytłumaczyć co jest powodem, że za każdym naciśnięciem input'a strona się odświeża?
Podejrzewam, że jest to związane, że PHP jest językiem serwerowym nie przeglądarkowym choć dlaczego akurat odświeżać musi się każdorazowo strona?
ja nie z takich co się obrażają - więc nie musisz przepraszać!
fajnie, że masz cel napisanie takie gierki ... ale z tego co napisałeś brakuje Ci elementarnych podstaw html o php nie wspomnę.
zacznij od zrobienia zrobienia sobie tego szablony na sztywno w htmlu a jako kod php użyj tylko tego ... modyfikuj kod html i zobacz co się dzieje:
Kod
<?php
echo '_POST';
var_dump($_POST);
echo '<hr>_GET';
var_dump($_GET);
?>
werdan
4.12.2013, 22:11:16
>Podejrzewam, że jest to związane, że PHP jest językiem serwerowym nie przeglądarkowym choć dlaczego akurat odświeżać musi się każdorazowo strona?
Dokładnie. To język scryptowy. Scrypt sie wykonuje i w twoim przypadku zwraca html, aby cokolwiek zdziałac dalej, nalezy do skryptu przeslac jakies tam dane i skrypt wykona sie ponownie.
Jesli w przegladarce widzisz swojego sapera, to znaczy ze skypt PHP sie wykonał i efekt masz na ekranie. Nic juz wiecej nie zdziałasz, dopoki ponownie nie wykonasz skryptu.
Geniesis
4.12.2013, 22:13:30
W sumie gra to zadanie od nauczyciela co mamy mu wysłać, jednak dla mnie to przedewszystkim dobra nauka języka dodając chore ambicje raczej ciężko mi będzie odpuścić do czasu aż tego dobrze nie napiszę.
Miło się dowiedzieć, że istnieje "narzędzie" sprawdzające w PHP, od początku jak mam kontakt z tym językiem było mi wpajane, że jedyną informacją o błędach jest serwer wypisujący gdy coś się sypie...
chętnie zobaczę na ile starczy Ci tych ambicji - niestety zanim napiszesz koleje linie kodu musisz się podszkolić ...
zacznij od HTML - tworzenie formularzy ; umieszczanie w nich pól z danymi w różniej postaci i przekazywanie ich do serwera
jak obcykasz powyższe to napiszę Ci co dalej ( raczej czego dalej się uczyć)
Geniesis
4.12.2013, 22:42:20
Cytat(werdan @ 4.12.2013, 22:11:16 )

Dokładnie. To język scryptowy. Scrypt sie wykonuje i w twoim przypadku zwraca html, aby cokolwiek zdziałac dalej, nalezy do skryptu przeslac jakies tam dane i skrypt wykona sie ponownie.
Jesli w przegladarce widzisz swojego sapera, to znaczy ze skypt PHP sie wykonał i efekt masz na ekranie. Nic juz wiecej nie zdziałasz, dopoki ponownie nie wykonasz skryptu.
Dziękuję za informację

Dziwnie się dowiedzieć, że mimo używania formularzy od jakiegoś roku, przeczytania książki dot. HTML5, CSS3 oraz drugiej dot. JS wg kogoś kto ogarnia jest się wgl nie zorientowanym w niczym...
Smutne jest to, że właśnie tutaj o tym się dowiedziałem, a nie w szkole...
Propo tych sesji mógłbyś mi wytłumaczyć dlaczego
$_SESSION[$a]
działa poprawie, a gdy dodam do sesji tablicę:
$_SESSION[$man[$a]]
już się wszystko sypie?
Na to pytanie nikt do tej pory mi nie potrafił odpowiedzieć niestety...
kończąc tą dyskusję na dziś odpowiem Ci skąd moje przypuszczenia, że masz braki w podstawowej wiedzy...
Cytat(Geniesis @ 4.12.2013, 21:42:32 )

Możesz mi wytłumaczyć co jest powodem, że za każdym naciśnięciem input'a strona się odświeża?
markonix
5.12.2013, 01:26:00
Nie $_SESSION[$man[$a]] tylko $_SESSION[$man][$a]
Cytat(Geniesis @ 4.12.2013, 22:13:30 )

W sumie gra to zadanie od nauczyciela co mamy mu wysłać, jednak dla mnie to przedewszystkim dobra nauka języka dodając chore ambicje raczej ciężko mi będzie odpuścić do czasu aż tego dobrze nie napiszę.
jak tam - wysłałeś już zadanie ?
jak tak, to mam dla Ciebie coś - dziś mi się trochę nudziło w pracy więc w międzyczasie napisałem skrypt tego sapera byś się na tym przykładzie pouczył o zastosowaniu/używaniu tablic 2-wymiarowych do takich zadań.
może komuś się przyda do nauki
Kod
<?php
session_start();
/**
* konfiguracja
*/
$X = 10; // ilosc kolumn
$Y = 10; //ilosc rzedow
$ileBomb = 6; // ilosc bomb
/**
* losownie nowej planszy
*/
function losuj($X ,$Y, $ileBomb){
$plansza = array();
while($ileBomb > 0){
$x = rand(1,$X);
$y = rand(1,$Y);
if( !isset( $plansza[$x][$y] ) ) {
$plansza[$x][$y] = -1;
$ileBomb--;
}
}
return $plansza;
}
/**
* sprawdzenie otoczenia na planszy
*/
function sprawdzOtoczenie($x,$y,$plansza){
$pkt = 0;
if( isset ($plansza[$x - 1][$y]) && $plansza[$x - 1][$y] == -1) $pkt++;
if( isset ($plansza[$x + 1][$y]) && $plansza[$x + 1][$y] == -1) $pkt++;
if( isset ($plansza[$x][$y - 1]) && $plansza[$x][$y - 1] == -1) $pkt++;
if( isset ($plansza[$x][$y + 1]) && $plansza[$x][$y + 1] == -1) $pkt++;
if( isset ($plansza[$x + 1][$y + 1]) && $plansza[$x + 1][$y + 1] == -1) $pkt++;
if( isset ($plansza[$x - 1][$y - 1]) && $plansza[$x - 1][$y - 1] == -1) $pkt++;
if( isset ($plansza[$x + 1][$y - 1]) && $plansza[$x + 1][$y - 1] == -1) $pkt++;
if( isset ($plansza[$x - 1][$y + 1]) && $plansza[$x - 1][$y + 1] == -1) $pkt++;
$plansza[$x][$y] = $pkt;
return $plansza;
}
/**
* Inicjowanie danych
*/
if( !isset( $_SESSION['plansza'] ) ){
$_SESSION['plansza'] = $plansza = losuj($X,$Y,$ileBomb);
$_SESSION['wolnepola'] = $X * $Y - $ileBomb;
} else {
$plansza = $_SESSION['plansza'];
}
/**
* Podstawowa logika
*/
switch( $_GET['todo'] ){
case 'nowagra' : {
$_SESSION['plansza'] = $plansza =losuj($X,$Y,$ileBomb);
$_SESSION['wolnepola'] = $X * $Y - $ileBomb;
break;
}
case 'strzal' :{
if( isset($_POST['strzal']) ) {
/* pomijam kwestie sprawdzania/filtrowania przekazanych danych */
list($x , $y) = explode(',',$_POST['strzal']);
if( isset($plansza[$x][$y] ) && $plansza[$x][$y] == -1 ) {
/**
* PRZEGRALES
*/
$INFO = 'PRZEGRALES';
$plansza[$x][$y] = '*';
unset($_SESSION['plansza']);
} else {
if( $_SESSION['wolnepola'] == 1){
/**
* WYGRALES
*/
$INFO = 'WYGRALES';
}
$_SESSION['plansza'] = $plansza = sprawdzOtoczenie($x,$y,$plansza);;
$_SESSION['wolnepola']--;
}
}
break;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
button {width:40px;height:40px;}
button[type=submit]{background-color:#f0f0f0;}
button[type=button]{background-color: #909090;}
</style>
</head>
<body>
<div>
<a href="?todo=nowagra">nowa gra</a>
</div>
<div class="plansza"><?php echo ( (isset($INFO) ? $INFO : '') ); ?>
<form action="?todo=strzal" method="POST">
<table>
<?php for($y = 1; $y <= $Y; $y++){
echo '<tr>';
for($x = 1; $x <= $X; $x++){
// $typ = 'submit';
$typ = (!isset($plansza[$x][$y]) || $plansza[$x][$y] == -1 ) ? 'submit' : 'button';
$text = ($typ == 'button' && $plansza[$x][$y] != 0) ? $plansza[$x][$y] : '';
echo '<td>','<button name="strzal" type="'.$typ.'" value="'.$x.','.$y.'">'.$text.'</button>','</td>';
}
echo '</tr>';
}
?>
</table>
</form>
</div>
</body>
</html>
Geniesis
8.12.2013, 21:08:20
Tak, musiałem... Dziękuję Ci, że to zrobiłeś, z tego co widzę to poziom moich umiejętności jest tragiczny lekko mówiąc... Zaczynam coraz bardziej wątpić, że będę kiedyś ogarniającym programistą... Z resztą nie ma sensu smęcić.
Jeszcze raz dziękuję za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.