Set kaartspel ->oplosser<-
Gepost door fritsje op 14-06-2009 22:36.
Ik weet niet of jullie het kaartspel Set kennen, maar hier de regels:
http://www.pythagoras.nu/mmmcms/public/artikel189.html
Het programma wat ik heb geschreven zoekt alle sets die er mogelijk zijn.
Het programma kan je hier gebruiken:
http://php.danielmast.nl/set/
Hoe werkt het. Links kan je kaarten aanklikken. Op die manier kan je ze 'op tafel leggen'. Nu gaat het programma kijken of hij met die aangeklikte kaart sets kan maken (met de andere al aangeklikte kaarten).
Als er dus terwijl je het spel Set speelt bijvoorbeeld 12 kaarten op tafel liggen, dan moet je in mijn programma die 12 kaarten aanklikken.
Heb je dat gedaan? Dan staan er rechts alle mogelijke sets, die je normaal gesproken zelf moet gaan zoeken. Roep dus snel 'Set!' en pak die 3 kaarten die het programma aan geeft.
Klik op een set rechts om die 3 kaarten uit het spel te halen. Deze komen dus als het ware op de dump terecht, want bij het spel Set zijn ook op een gegeven moment de kaarten op. Links worden de plekken waar de 3 kaarten van die set lagen nu dus leeg. Wil je die kaart toch weer terug? Klik dan op dat lege vlak, dan kom hij weer terug.
Meer uitleg nodig? Vraag het maar.
Bestanden van dit script
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | <?php
session_start();
$imgwidth = "75px";
if ($_GET['kaart'] && $_GET['status'])
{
$_SESSION['kaarten'][$_GET['kaart']][0] = $_GET['status'];
if ($_GET['status'] == "1")
{
$_SESSION['kaarten'][$_GET['kaart']][1] = floor(($_GET['kaart'] - 1) / 27);
$_SESSION['kaarten'][$_GET['kaart']][2] = floor((($_GET['kaart'] - 1) % 27) / 9);
$_SESSION['kaarten'][$_GET['kaart']][3] = floor((($_GET['kaart'] - 1) % 9) / 3);
$_SESSION['kaarten'][$_GET['kaart']][4] = floor(($_GET['kaart'] - 1) % 3);
}
}
$delset1 = $_GET['delset1'];
$delset2 = $_GET['delset2'];
$delset3 = $_GET['delset3'];
if ($delset1)
{
$_SESSION['kaarten'][$delset1][0] = "2";
$_SESSION['kaarten'][$delset2][0] = "2";
$_SESSION['kaarten'][$delset3][0] = "2";
}
if ($_POST['reset'])
{
for ($i=1; $i<=81; $i++)
{
$_SESSION['kaarten'][$i][0] = "";
}
}
?>
<html>
<head><title>Set Solver</title></head>
<body>
<table width="100%" border="1px" bordercolor="#000000" cellspacing="0">
<tr><td>Toevoegen/weghalen:</td><td>Sets:</td></tr>
<tr valign="top"><td>
<?php
for ($i=1; $i<=81; $i++)
{
if ($_SESSION['kaarten'][$i][0] != "2")
{
if ($_SESSION['kaarten'][$i][0] == "3" || $_SESSION['kaarten'][$i][0] == "") {
$status = 1;
$border = 0;
}
elseif ($_SESSION['kaarten'][$i][0] == "1") {
$status = 2;
$border = 1;
}
($i<10) ? $nul = 0 : $nul = "";
echo "<a href='index.php?kaart=".$i."&status=".$status."'><img border='".$border."px' bordercolor='#000000' width='".$imgwidth."' src='http://www.setgame.com/images/setcards/small/".$nul.$i.".gif'></a>";
}
else {
$status = 3;
echo "<a href='index.php?kaart=".$i."&status=".$status."'><img src='leeg.gif' border='0px' width='".$imgwidth."' /></a>";
}
if (($i % 9)==0)
echo "<br>\n";
}
?>
</td><td width="<?php echo 3 * $imgwidth + 50; ?>">
<?php
for ($counter = 1; $counter <= 81; $counter++) {
if ($_SESSION['kaarten'][$counter][0] == "1") {
for ($counter2 = $counter + 1; $counter2 <= 81; $counter2++) {
if ($_SESSION['kaarten'][$counter2][0] == "1") {
for ($counter3 = $counter2 + 1; $counter3 <= 81; $counter3++) {
if ($_SESSION['kaarten'][$counter3][0] == "1") {
$counter4 = 1;
while ($counter4 <= 4) {
if ( !(
(
($_SESSION['kaarten'][$counter][$counter4] == $_SESSION['kaarten'][$counter2][$counter4])
&&
($_SESSION['kaarten'][$counter][$counter4] == $_SESSION['kaarten'][$counter3][$counter4])
)
||
(
($_SESSION['kaarten'][$counter][$counter4] != $_SESSION['kaarten'][$counter2][$counter4])
&&
($_SESSION['kaarten'][$counter][$counter4] != $_SESSION['kaarten'][$counter3][$counter4])
&&
($_SESSION['kaarten'][$counter2][$counter4] != $_SESSION['kaarten'][$counter3][$counter4])
) )
)
{
$counter4 = 5; }
else {
$counter4++;
if ($counter4 == 5) {
($counter < 10) ? $nul_1 = 0 : $nul_1 = "";
($counter2 < 10) ? $nul_2 = 0 : $nul_2 = "";
($counter3 < 10) ? $nul_3 = 0 : $nul_3 = "";
echo "<a href='index.php?delset1=" . $counter . "&delset2=" . $counter2 . "&&delset3=" . $counter3 . "'><img src='http://www.setgame.com/images/setcards/small/" . $nul_1 . $counter . ".gif' width='".$imgwidth."' /> <img src='http://www.setgame.com/images/setcards/small/" . $nul_2 . $counter2 . ".gif' width='".$imgwidth."' /> <img src='http://www.setgame.com/images/setcards/small/" . $nul_3 . $counter3 . ".gif' width='".$imgwidth."' /></a><br />";
}
}
}
}}
}}
}}
?>
</td></tr></table>
<form action="index.php" method="post">
<input type="submit" name="reset" value="Reset" />
</form>
</body>
</html> |
Commentaar
15-06-2009 08:23
$counter4 = 5; // ... afkappen, dus de while loop eindigt omdat de eindwaarde is bereikt
Gebruik daarvoor http://nl2.php.net/break
if ($_GET['kaart'] && $_GET['status'])
isset() was te duur voor je?
// zonder border
Volgens mij heeft "zonder border" een diepere betekenis dan zonder rand. Kun je niet beter in je commentaar zetten waar de kaart geen border heeft?
1 2 3 | Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding.
Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan. |
15-06-2009 13:38
Ziet er op zich best netjes uit, maar zoals Sjors zegt kun je inderdaad beter gebruik maken van 'break;'
Verder is de documentatie minimaal, als jij (of iemand anders) over een jaartje het script moet aanpassen zul je niet snel meer begrijpen wat er gebeurt. Zie ook onderstaande blok:
<?php
if ($_GET['status'] == "1")
{
$_SESSION['kaarten'][$_GET['kaart']][1] = floor(($_GET['kaart'] - 1) / 27);
$_SESSION['kaarten'][$_GET['kaart']][2] = floor((($_GET['kaart'] - 1) % 27) / 9);
$_SESSION['kaarten'][$_GET['kaart']][3] = floor((($_GET['kaart'] - 1) % 9) / 3);
$_SESSION['kaarten'][$_GET['kaart']][4] = floor(($_GET['kaart'] - 1) % 3);
}
?>
Er staat geen documentatie bij, als je dit later nog eens wilt aanpassen moet je eerst uitvogelen wat hierboven (bijvoorbeeld, is bij meer stukken code) gebeurt...
Verder ziet het er wel OK uit :-)
1 2 3 | Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding.
Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan. |
15-06-2009 16:26
Hey guys,
Bedankt voor de reacties. Ik ga eens kijken naar dat break, want dat heb ik inderdaad nog nooit gebruikt. En dat isset(), is dat nog wat meer dan alleen netjes?
15-06-2009 21:30
Ik zou er mooi een spelletje van maken, want dat is veel leuker dan het oplossen zelf :)
Oh, en dan natuurlijk online uitbrengen, als dat uberhoubt al mag :)
1 2 3 | Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding.
Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan. |
16-06-2009 10:55
"En dat isset(), is dat nog wat meer dan alleen netjes?"
ZOnder isset zou je een foutmelding/warnign moeten krijgen wanneer je de juiste instellingen gebruikt.
19-06-2009 14:45
Je html is precies verkeerd om.
Echoën doe je met enkele quotes, en html tags met dubbele quotes.
Zie onderstaand voorbeeld.
1 2 3 4 5 | <?php
echo '<a href="index.php?id='.$i.'">link</a>';
?> |
20-06-2009 19:25
@Frits77
is het niet
<?php
ini_set('display_errors',1);
?>
ipv
<?php
display_errors("on");
?>
1 2 3 | <?php
print 'waaat?';
?> |