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] == "") // zonder border 
                    { 
                        $status = 1; 
                        $border = 0; 
                    } 
                    elseif ($_SESSION['kaarten'][$i][0] == "1") // met border 
                    { 
                        $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 // onzichtbaar 
                { 
                    $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++) // eerste kaart 
            { 
                if ($_SESSION['kaarten'][$counter][0] == "1") { 
                for ($counter2 = $counter + 1; $counter2 <= 81; $counter2++) // tweede kaart 
                { 
                    if ($_SESSION['kaarten'][$counter2][0] == "1") { 
                    for ($counter3 = $counter2 + 1; $counter3 <= 81; $counter3++) // derde kaart 
                    { 
                        if ($_SESSION['kaarten'][$counter3][0] == "1") { 
                        $counter4 = 1; 
                        while ($counter4 <= 4) // elke eigenschap langs 
                        { 
                            if ( // als er 1 eigenschap niet aan de eis voldoet, afkappen... 
                                   !( 
                                        ( 
                                            ($_SESSION['kaarten'][$counter][$counter4] == $_SESSION['kaarten'][$counter2][$counter4]) 
                                            && 
                                            ($_SESSION['kaarten'][$counter][$counter4] == $_SESSION['kaarten'][$counter3][$counter4]) 
                                        ) // allemaal gelijk 
                                    
                                        || 
                                    
                                        ( 
                                            ($_SESSION['kaarten'][$counter][$counter4] != $_SESSION['kaarten'][$counter2][$counter4]) 
                                            && 
                                            ($_SESSION['kaarten'][$counter][$counter4] != $_SESSION['kaarten'][$counter3][$counter4]) 
                                            && 
                                            ($_SESSION['kaarten'][$counter2][$counter4] != $_SESSION['kaarten'][$counter3][$counter4]) 
                                        ) // allemaal verschillend 
                                    ) 
                            ) 
                            { 
                                $counter4 = 5; // ... afkappen, dus de while loop eindigt omdat de eindwaarde is bereikt 
                            } 
                            else // als de eigenschap wel aan de eis voldoet, door naar de volgende eigenschap 
                            { 
                                $counter4++; 
                                
                                if ($counter4 == 5) // als alle eigenschappen aan de eisen hebben voldaan 
                                { 
                                    
                                    ($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?

1
<?php ?>
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.

1
2
3
4
<?php
error_reporting(E_ALL);
display_errors("on");
?>
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?';
?>
Inloggen wachtwoord vergeten? Aanmelden