http://gorbem.hu/PHP.php

Számrendező

 

Írjunk PHP-ben webes alkalmazást, mellyel a 15-ös (számrendező) játékot lehet játszani. A játék alaphelyzete (kirakott) állapota a következő:

 

 

 

Ha megnyomjuk a Keverés feliratú parancsgombot, akkor a program 2000 lépésben véletlen keverést hajt végre. Ennek az eredményét láthatjuk a követkő képen:

 

A játék ismerői tudhatják, hogy a tetszőleges két mező cserélgetésével nem biztos, hogy kirakható állapothoz jutunk. Ugyanis a cserélgetést csak úgy szabad végrehajtani, ahogy a kirakás szabályai vannak: az üres mezőre a lapszomszéd mező valamelyike áthelyezhető, pontosabban azzal cserélhető. (Aki a permutációk inverziószámát, mint fogalmat ismeri, annak megjegyzem, hogy a kirakott állapotnak az inverziószáma 0, azaz páros. Minden kirakható állapotnak is az, hiszen két szomszédos szám a szabályok szerint nem cserélhető, legalább még egy szám sorrendjének még meg kell változni. Azaz minden helyes véletlen állapot inverziószáma is páros. Márpedig egy tetszőleges véletlen elrendezés 50% eséllyel páros, 50% eséllyel páratlan inverziószámú, ez utóbbiak viszont szabályos mozgatással nem rakhatók ki.)

 

A rendezgetés az üres mezővel szomszédos mezőn történő kattintással történik. Ha lapszomszédra kattintunk, akkor a kattintott mező és az üres mező helyet cserél. Ha sikerül a rendezés, akkor a következőképpen jelzi a program (KÉSZ! felirattal):

 

 

 

A tábla aktuális állapotát adatbázisban, egy szamrend nevű táblában tároljuk. Az id, x és y mezők tartalma nem változik, a cserélgetéssel szam mező értéke aktualizálódik. A (x,y) a rács szokásos két indexe.

 

 

 

            A PHP oldal teljes listája:

 

http://gorbem.hu/PH/SzamRend.php

 

<?php

      include("hconfig.php");

?>

<html>

<head>

<title>Számrendező</title>

<script language="javascript" type="text/javascript" src="jquery.js">

</script>

</head>

<body>

<form name="" action="SzamRend.htm" method="POST">

<input type="submit" name="vissza" value="Vissza" />

</form>

 

<center>

<h2><u>Számrendező</u></h2>

 

<div>

<style type="text/css">

.eger{

    margin-top: 10px;

    width: 400px;

    height: 400px;

    border: 1px solid #000000;

    padding: 0px;

    background-color: #cccccc;

}

</style>

</div>

<?php

     

      if ( isset($_POST['alap']) ){

            for ($i=1; $i<16; $i++){

                  mysql_query("UPDATE szamrend SET szam=$i WHERE id=$i");

            }

            mysql_query("UPDATE szamrend SET szam=0 WHERE id=16");

            header("location: SzamRend.php");

      }

     

      function ellenor(){

            $ok = 1;

            $ered = mysql_query("SELECT * FROM szamrend");

            while ( $egys = mysql_fetch_object($ered) ){

                  $id = $egys->id;

                  $szam = $egys->szam;

                  if ( ($id <16) && ($id !== $szam) ){

                       $ok = 0;

                  }

            }

            if ( $ok == 1 ){

                  print "<h2>KÉSZ!</h2>";

            }

      }

     

      $x = array();

      $y = array();

      $szt = array();

      $i = 0;

      $u = 0;

      $v = 0;

      $ered = mysql_query("SELECT * FROM szamrend");

      while ( $egys = mysql_fetch_object($ered) ){

            $i++;

            $x[$i] = $egys->x+0;

            $y[$i] = $egys->y+0;

            $szt[$i] = $egys->szam+0;

            if ( $szt[$i]==0 ){$u = $i;}

      }

     

      if ( isset($_POST['kever']) ){

            for ($i=0; $i<2000; $i++){

                  switch ( rand(0,3) ){

                       case 0:

                             if ( $x[$u]-1 > 0 ){

                                   $szt[$u] = $szt[$u-1];

                                   $szt[$u-1] = 0;

                                   $u = $u-1;

                             }

                       break;

                       case 1:

                             if ( $x[$u]+1 < 5 ){

                                   $szt[$u] = $szt[$u+1];

                                   $szt[$u+1] = 0;

                                   $u = $u+1;

                             }

                       break;

                       case 2:

                             if ( $y[$u]-1 > 0 ){

                                   $szt[$u] = $szt[$u-4];

                                   $szt[$u-4] = 0;

                                   $u = $u-4;

                             }

                       break;

                       case 3:

                             if ( $y[$u]+1 < 5 ){

                                   $szt[$u] = $szt[$u+4];

                                   $szt[$u+4] = 0;

                                   $u = $u+4;

                             }

                       break;

                  }

            }

            for ($i=1; $i<17; $i++){

                  mysql_query("UPDATE szamrend SET szam='$szt[$i]' WHERE id='$i'");

            }

            header("location: SzamRend.php");

      }

     

      if ( isset($_POST['valaszt']) ){

            $v = $_POST['valaszt'];

            if ( $x[$v]-1 > 0 ){

                  if ( ($v-1) == $u ){

                       $szt[$v-1] = $szt[$v]; $szt[$v] = 0;

                       $u = $v;

                  }

            }

            if ( $x[$v]+1 < 5 ){

                  if ( ($v+1) == $u ){

                       $szt[$v+1] = $szt[$v]; $szt[$v] = 0;

                       $u = $v;

                  }

            }

            if ( $y[$v]-1 > 0 ){

                  if ( ($v-4) == $u ){

                       $szt[$v-4] = $szt[$v]; $szt[$v] = 0;

                       $u = $v;

                  }

            }

            if ( $y[$v]+1 < 5 ){

                  if ( ($v+4) == $u ){

                       $szt[$v+4] = $szt[$v]; $szt[$v] = 0;

                       $u = $v;

                  }

            }

            for ($i=1; $i<17; $i++){

                  mysql_query("UPDATE szamrend SET szam='$szt[$i]' WHERE id='$i'");

            }

            ellenor();

      }

     

?>

<div id="tabla" class="eger" >

<table border="1" bordercolor="black" cellspacing="0" cellpadding="20">

<tr>

<?php

      for ( $i=1; $i<17; $i++ ){

            if ( $i==5 || $i==9 || $i==13 ){print "</tr><tr>";}

            print "<td align=\"center\" width=\"57\" height=\"99\"><font size=\"7\">";

            if ( $szt[$i] !== 0){print "$szt[$i]";} else {print "&nbsp;";}

            print "</font></td>";

      }

?>

</tr>

</table>

</div>

<br />

 

<form name="v" action="" method="POST">

<input type="submit" name="alap" value="Alap" /> &nbsp;

<input type="submit" name="kever" value="Keverés" />  &nbsp;

<input type="hidden" size="1" name="valaszt" />

</form>

 

<script language="javascript" type="text/javascript">

$('#tabla').click(function(lap){

      var x = lap.pageX - this.offsetLeft;

      var y = lap.pageY - this.offsetTop;

      x = (x-x%100)/100+1;

      y = (y-y%100)/100;

      z = 4*y+x;

      document.v.valaszt.value = z;

      onChange=document.v.submit();

}

);

</script>

</center>

 

</body>

</html>