Hoe controleer ik als X heeft gespeeld en draag ik dan de beurt aan O over
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Boter, Kaas & Eieren</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
Code (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
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
<?php
$winner = 'niemand';
$beurt = 'x';
$box = array('','','','','','','','','');
if (isset($_POST["submit"])){ //When the player hits submit, we retrieve the data
$box[0] = $_POST['box0'];
$box[1] = $_POST['box1'];
$box[2] = $_POST['box2'];
$box[3] = $_POST['box3'];
$box[4] = $_POST['box4'];
$box[5] = $_POST['box5'];
$box[6] = $_POST['box6'];
$box[7] = $_POST['box7'];
$box[8] = $_POST['box8'];
//print_r($box); //kijken in welke array, wat is ingevuld
if ($box[0]=='' && $box[1]=='' && $box[2]=='' && $box[3]=='' &&
$box[4]=='' && $box[5]=='' && $box[6]=='' && $box[7]=='' && $box[8]==''){
echo "Speler is <b>X</b> en <b>X</b> maakt de eerste stap!";
}
//check if the player has won
if (($box[0]=='x' && $box[1]=='x' && $box[2]=='x') ||
($box[3]=='x' && $box[4]=='x' && $box[5]=='x') ||
($box[6]=='x' && $box[7]=='x' && $box[8]=='x') ||
($box[0]=='x' && $box[4]=='x' && $box[8]=='x') ||
($box[2]=='x' && $box[4]=='x' && $box[6]=='x') ||
($box[0]=='x' && $box[3]=='x' && $box[6]=='x') ||
($box[1]=='x' && $box[4]=='x' && $box[7]=='x') ||
($box[2]=='x' && $box[5]=='x' && $box[8]=='x')){
$winner = 'x';
echo "Speler wint";
}
//check if X has played and switch turn to O
$blank = 0; //assume there is no empty box
//check for an empty box
for ($i=0; $i<=8; $i++){
if ($box[$i]==''){
$blank=1;
}
}
//if there is an empty box and no winner yet its O's turn
if ($blank == 1 && $winner == 'niemand' && $beurt == 'o'){
$i = rand(0,8);
while ($box[$i]!=''){ //keep looking for an empty box if $i isnt empty
$i = rand(0,8);
}
$box[$i] = "o";
//check if O has won
if (($box[0]=='o' && $box[1]=='o' && $box[2]=='o') ||
($box[3]=='o' && $box[4]=='o' && $box[5]=='o') ||
($box[6]=='o' && $box[7]=='o' && $box[8]=='o') ||
($box[0]=='o' && $box[4]=='o' && $box[8]=='o') ||
($box[2]=='o' && $box[4]=='o' && $box[6]=='o') ||
($box[0]=='o' && $box[3]=='o' && $box[6]=='o') ||
($box[1]=='o' && $box[4]=='o' && $box[7]=='o') ||
($box[2]=='o' && $box[5]=='o' && $box[8]=='o')){
$winner = "o";
echo "KI wint";
}
}
//check if it is a draw
if ($blank == 0 && $winner == 'niemand'){
echo "Gelijkspel!";
}
}
?>
$winner = 'niemand';
$beurt = 'x';
$box = array('','','','','','','','','');
if (isset($_POST["submit"])){ //When the player hits submit, we retrieve the data
$box[0] = $_POST['box0'];
$box[1] = $_POST['box1'];
$box[2] = $_POST['box2'];
$box[3] = $_POST['box3'];
$box[4] = $_POST['box4'];
$box[5] = $_POST['box5'];
$box[6] = $_POST['box6'];
$box[7] = $_POST['box7'];
$box[8] = $_POST['box8'];
//print_r($box); //kijken in welke array, wat is ingevuld
if ($box[0]=='' && $box[1]=='' && $box[2]=='' && $box[3]=='' &&
$box[4]=='' && $box[5]=='' && $box[6]=='' && $box[7]=='' && $box[8]==''){
echo "Speler is <b>X</b> en <b>X</b> maakt de eerste stap!";
}
//check if the player has won
if (($box[0]=='x' && $box[1]=='x' && $box[2]=='x') ||
($box[3]=='x' && $box[4]=='x' && $box[5]=='x') ||
($box[6]=='x' && $box[7]=='x' && $box[8]=='x') ||
($box[0]=='x' && $box[4]=='x' && $box[8]=='x') ||
($box[2]=='x' && $box[4]=='x' && $box[6]=='x') ||
($box[0]=='x' && $box[3]=='x' && $box[6]=='x') ||
($box[1]=='x' && $box[4]=='x' && $box[7]=='x') ||
($box[2]=='x' && $box[5]=='x' && $box[8]=='x')){
$winner = 'x';
echo "Speler wint";
}
//check if X has played and switch turn to O
$blank = 0; //assume there is no empty box
//check for an empty box
for ($i=0; $i<=8; $i++){
if ($box[$i]==''){
$blank=1;
}
}
//if there is an empty box and no winner yet its O's turn
if ($blank == 1 && $winner == 'niemand' && $beurt == 'o'){
$i = rand(0,8);
while ($box[$i]!=''){ //keep looking for an empty box if $i isnt empty
$i = rand(0,8);
}
$box[$i] = "o";
//check if O has won
if (($box[0]=='o' && $box[1]=='o' && $box[2]=='o') ||
($box[3]=='o' && $box[4]=='o' && $box[5]=='o') ||
($box[6]=='o' && $box[7]=='o' && $box[8]=='o') ||
($box[0]=='o' && $box[4]=='o' && $box[8]=='o') ||
($box[2]=='o' && $box[4]=='o' && $box[6]=='o') ||
($box[0]=='o' && $box[3]=='o' && $box[6]=='o') ||
($box[1]=='o' && $box[4]=='o' && $box[7]=='o') ||
($box[2]=='o' && $box[5]=='o' && $box[8]=='o')){
$winner = "o";
echo "KI wint";
}
}
//check if it is a draw
if ($blank == 0 && $winner == 'niemand'){
echo "Gelijkspel!";
}
}
?>
<div id="beurt">
<p>
<form action="destroy.php" method="get">
<input type="submit" id="destroy" onClick="windows.location.href'index.php'" value="Begin opnieuw!">
</form>
</p>
</div>
<form id="game" name="tictactoe" method="post">
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
//create the grid to play
for ($i=0; $i<=8; $i++){
echo "<input class=\"box\" type=\"text\" name=\"box$i\" value=\"$box[$i]\">";
if ($i==2||$i==5||$i==8){ //put in a break if $i is 2,5 or 8
echo "<br>";
}
}
if ($winner == 'niemand'){
echo "<br><input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Spelen!\"><br></form>";
}
?>
//create the grid to play
for ($i=0; $i<=8; $i++){
echo "<input class=\"box\" type=\"text\" name=\"box$i\" value=\"$box[$i]\">";
if ($i==2||$i==5||$i==8){ //put in a break if $i is 2,5 or 8
echo "<br>";
}
}
if ($winner == 'niemand'){
echo "<br><input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Spelen!\"><br></form>";
}
?>
</body>
</html>
Alleen de code geven helpt mij niet, aub leg het uit zodat ik snap wat er gebeurd en waarom het gebeurd. Alvast bedankt
Is er iets veranderd dan is de computer aan de beurt, anders niet.
Gewijzigd op 04/10/2015 12:32:13 door Randy vsf
Je zou kunnen overwegen om een scheiding aan te brengen tussen de ingevulde en nog in te vullen velden. Als je dan je formulier submit hoef je enkel te controleren of er een leeg veld een waarde heeft gekregen.
Als je ook per speler bijhoudt wie welke velden heeft ingevuld, kun je de conditie voor beeindiging van het spel (winnende combinaties) vereenvoudigen.
En indien je je specificaties nog wat verder aanpast, waarbij je drie lijstjes van velden bijhoudt:
- de ingevulde velden van speler O
- de ingevulde velden van speler X
- niet ingevulde velden
Dan heb je meteen de drie condities voor beeindiging van het spel:
- O heeft een winnende combinatie, of
- X heeft een winnende combinatie, of
- de lijst van niet ingevulde velden is leeg (gelijkspel)
Elke beurt (iteratie) wordt een veld overgeheveld van de lijst van niet ingevulde velden naar het lijstje van ofwel O ofwel X, dit zou tevens als controle kunnen dienen om te zien of er een "geldig leeg veld" is geselecteerd.
Op de bovenstaande manier heb je al een "recept" om je applicatie te schrijven. Vaak is dit dan een kwestie van simpelweg "uitschrijven", je weet namelijk al precies wat je dient te programmeren omdat je (al) een specificatie hebt (uitgedacht).
Hiermee blijft altijd de speler aan de beurt.
Gebruik een session en wissel de beurt.
Mijn idee was: array $box is het speelveld
array $x onthoud de waarden van de speler, array $o onthoud de waarden van de computer. Elke keer als de speler dus submit klikt word array $x vergeleken met array $o zodat een speler niet de ingevulde Otjes van de computer kan vervangen.
Nou is het probleem waar ik dan tegen aan loop:
a. Wanneer ik submit klik word de zet van de computer niet meteen in zijn array opgeslagen maar 1 beurt later
b. Ik niet weet of het wel kan op de manier die ik hierboven heb beschreven aangezien ik alleen de basis van PHP ken en dit de eerste keer is dat ik met arrays werk (ik weet niet wat er allemaal mogelijk is en wat niet. ik volg tutorials op w3schools.com maar kom er even niet uit nu)
Tips, hints, voorbeelden en sites met uitleg over arrays zijn van harte welkom en worden zeer gewaardeerd.
Alvast bedankt
EDIT: daarbij, dat is het probleem van de TS niet; het gaat om controle van de invoer :].
EDIT2: je zou op een hele eenvoudige manier de "toestand" van het spel door kunnen geven door elk veld (0 t/m 8) te representeren door een waarde wat een veelvoud van 2 is:
veld 0 = 2 ^ 0 = 1
veld 1 = 2 ^ 1 = 2
veld 2 = 2 ^ 2 = 4 etc.
Je kunt dan de geselecteerde / vrije velden doorgeven via de url door de veldwaarden op te tellen (de som van de producten).
Bijvoorbeeld = 7 = 1 + 2 + 4 (dus resp. veld 0, 1 en 2) - dit is tevens een winnende combinatie.
Gewijzigd op 04/10/2015 22:06:21 door Thomas van den Heuvel
- SanThe - op 04/10/2015 21:52:59:
$beurt = 'x';
Hiermee blijft altijd de speler aan de beurt.
Gebruik een session en wissel de beurt.
Hiermee blijft altijd de speler aan de beurt.
Gebruik een session en wissel de beurt.
$beurt = 'x'; idd maar de computer speelt wel pas als $beurt = 'o' is.
Ik weet niet wanneer ik dus de $beurt = x naar $beurt = o kan omzetten zodat de computer speelt of hoe dat moet.
een session? dit is mn 3e opdracht pas mn kennis gaat op dit moment niet verder als de basis van de basis. Ik ben tutorials op w3schools.com aan het volgen ook etc maar ik kom er niet altijd uit :(
misschien stel ik wel een voordehandliggende vraag maar ik kom er ff niet uit :(
if ($box[0]=='' && $box[1]=='' && $box[2]=='' && $box[3]=='' &&
$box[4]=='' && $box[5]=='' && $box[6]=='' && $box[7]=='' && $box[8]==''){
echo "Speler is <b>X</b> en <b>X</b> maakt de eerste stap!";
}
vervangen met:
for ($i=0; $i<=8; $i++){
if ($box[$i] != '' && $box[$i] != 'x' && $box[$i] != 'o'){
echo "Je kunt alleen d.m.v. een X in te vullen spelen!<BR><BR>";
} elseif ($box[$i] == 'x') {
$beurt = 'o';
}
}
Nou speelt ie niet als er niks is ingevuld, iets anders dan een x of 0 word ingevuld.
Echter doet ie dat alleen voor de allereerste keer, als een speler wel eerst een X invuld en daarna niks of een andere letter en submit speelt de computer toch weer gewoon.
Ik heb in dit scriptje heel mijn weekend geinvesteerd en verder als dit kom ik niet :(
Ik waardeer ook alle reacties hierboven maar ik kom er alsnog niet uit.
Zou iemand mij willen laten zien hoe dit probleem opgelost kan worden maar dan wel binnen de kaders van het script dat ik heb geschreven (grote aanpassingen of geheel iets anders zou betekenen dat ik dit onderwerp niet eens goed begrijp en al verder ga naar andere dingen)
PS: voor de mensen die denken dat ze misschien mijn opdracht afmaken of wat dan ook, nee dat is niet zo. Ik hoef voor mijn opdracht alleen het spel te laten weten wanneer de speler wint, wanneer de computer wint en of het een gelijkspel is. Dat het script weet wie aan de beurt is, als de speler niet een ingevuld vakje gebruikt en als de speler wel met een X het veld invult wil ik er bij maken om extra te oefenen. Alleen nu lijkt dat wel het meest ingewikkelde :(
Toevoeging op 05/10/2015 13:34:54:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Boter, Kaas & Eieren</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
Code (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
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
<?php
$winner = 'niemand';
$beurt = 'x';
$box = array('','','','','','','','','');
if (isset($_POST["submit"])){ //als de speler submit klikt word de data opgehaald
for($i=0; $i<=8; $i++){
$box[$i] = $_POST['box'.$i];
}
for ($i=0; $i<=8; $i++){
if ($box[$i] != '' && $box[$i] != 'x' && $box[$i] != 'o'){
echo "Je kunt alleen d.m.v. een X in te vullen spelen!<BR><BR>";
} elseif ($box[$i] == 'x') {
$beurt = 'o';
}
}
//kijken als de speler heeft gewonnen
if (($box[0]=='x' && $box[1]=='x' && $box[2]=='x') ||
($box[3]=='x' && $box[4]=='x' && $box[5]=='x') ||
($box[6]=='x' && $box[7]=='x' && $box[8]=='x') ||
($box[0]=='x' && $box[4]=='x' && $box[8]=='x') ||
($box[2]=='x' && $box[4]=='x' && $box[6]=='x') ||
($box[0]=='x' && $box[3]=='x' && $box[6]=='x') ||
($box[1]=='x' && $box[4]=='x' && $box[7]=='x') ||
($box[2]=='x' && $box[5]=='x' && $box[8]=='x')){
$winner = 'x';
echo "X wint";
}
}
//als de speler heeft gespeeld en niet gewonnen de beurt aan O geven
if ($beurt == 'o') {
$blank = 0; //aannemen dat er geen leeg vakje is
//zoek een leeg vakje
for ($i=0; $i<=8; $i++){
if ($box[$i]==''){
$blank=1;
}
}
//als er een leeg vakje is en geen winnaar nog dan is O aan de beurt
if ($blank == 1 && $winner == 'niemand'){
$i = rand(0,8);
while ($box[$i]!=''){ //blijf een leeg vakje zoeken als $i niet leeg is
$i = rand(0,8);
}
$box[$i] = "o";
//check als O heeft gewonnen
if (($box[0]=='o' && $box[1]=='o' && $box[2]=='o') ||
($box[3]=='o' && $box[4]=='o' && $box[5]=='o') ||
($box[6]=='o' && $box[7]=='o' && $box[8]=='o') ||
($box[0]=='o' && $box[4]=='o' && $box[8]=='o') ||
($box[2]=='o' && $box[4]=='o' && $box[6]=='o') ||
($box[0]=='o' && $box[3]=='o' && $box[6]=='o') ||
($box[1]=='o' && $box[4]=='o' && $box[7]=='o') ||
($box[2]=='o' && $box[5]=='o' && $box[8]=='o')){
$winner = "o";
echo "O wint";
}
}
//check als het een gelijkspel is
if ($blank == 0 && $winner == 'niemand'){
echo "Gelijkspel!";
$winner = 'gelijkspel';
}
}
?>
$winner = 'niemand';
$beurt = 'x';
$box = array('','','','','','','','','');
if (isset($_POST["submit"])){ //als de speler submit klikt word de data opgehaald
for($i=0; $i<=8; $i++){
$box[$i] = $_POST['box'.$i];
}
for ($i=0; $i<=8; $i++){
if ($box[$i] != '' && $box[$i] != 'x' && $box[$i] != 'o'){
echo "Je kunt alleen d.m.v. een X in te vullen spelen!<BR><BR>";
} elseif ($box[$i] == 'x') {
$beurt = 'o';
}
}
//kijken als de speler heeft gewonnen
if (($box[0]=='x' && $box[1]=='x' && $box[2]=='x') ||
($box[3]=='x' && $box[4]=='x' && $box[5]=='x') ||
($box[6]=='x' && $box[7]=='x' && $box[8]=='x') ||
($box[0]=='x' && $box[4]=='x' && $box[8]=='x') ||
($box[2]=='x' && $box[4]=='x' && $box[6]=='x') ||
($box[0]=='x' && $box[3]=='x' && $box[6]=='x') ||
($box[1]=='x' && $box[4]=='x' && $box[7]=='x') ||
($box[2]=='x' && $box[5]=='x' && $box[8]=='x')){
$winner = 'x';
echo "X wint";
}
}
//als de speler heeft gespeeld en niet gewonnen de beurt aan O geven
if ($beurt == 'o') {
$blank = 0; //aannemen dat er geen leeg vakje is
//zoek een leeg vakje
for ($i=0; $i<=8; $i++){
if ($box[$i]==''){
$blank=1;
}
}
//als er een leeg vakje is en geen winnaar nog dan is O aan de beurt
if ($blank == 1 && $winner == 'niemand'){
$i = rand(0,8);
while ($box[$i]!=''){ //blijf een leeg vakje zoeken als $i niet leeg is
$i = rand(0,8);
}
$box[$i] = "o";
//check als O heeft gewonnen
if (($box[0]=='o' && $box[1]=='o' && $box[2]=='o') ||
($box[3]=='o' && $box[4]=='o' && $box[5]=='o') ||
($box[6]=='o' && $box[7]=='o' && $box[8]=='o') ||
($box[0]=='o' && $box[4]=='o' && $box[8]=='o') ||
($box[2]=='o' && $box[4]=='o' && $box[6]=='o') ||
($box[0]=='o' && $box[3]=='o' && $box[6]=='o') ||
($box[1]=='o' && $box[4]=='o' && $box[7]=='o') ||
($box[2]=='o' && $box[5]=='o' && $box[8]=='o')){
$winner = "o";
echo "O wint";
}
}
//check als het een gelijkspel is
if ($blank == 0 && $winner == 'niemand'){
echo "Gelijkspel!";
$winner = 'gelijkspel';
}
}
?>
<div id="beurt">
<p>
<form action="destroy.php" method="get">
<input type="submit" id="destroy" onClick="windows.location.href'index.php'" value="Begin opnieuw!">
</form>
</p>
</div>
<form id="game" name="tictactoe" method="post">
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
//creeer het veld om te spelen
for ($i=0; $i<=8; $i++){
echo "<input class=\"box\" type=\"text\" name=\"box$i\" value=\"$box[$i]\">";
if ($i==2||$i==5||$i==8){ //sla een regel over als $i 2,5 of 8 is
echo "<br>";
}
}
if ($winner == 'niemand'){
echo "<br><input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Spelen!\"><br></form>";
}
?>
//creeer het veld om te spelen
for ($i=0; $i<=8; $i++){
echo "<input class=\"box\" type=\"text\" name=\"box$i\" value=\"$box[$i]\">";
if ($i==2||$i==5||$i==8){ //sla een regel over als $i 2,5 of 8 is
echo "<br>";
}
}
if ($winner == 'niemand'){
echo "<br><input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Spelen!\"><br></form>";
}
?>
</body>
</html>
Hoe het script nu is!
In zekere zin hoef je dus niet bij te houden wiens beurt het is, tenzij dit programma ook in staat moet zijn om gespeeld te kunnen worden door twee menselijke spelers?
En als je niet wilt dat iemand ergens iets invult, moet je hem/haar deze keuze niet geven, je zou misschien kunnen denken aan een ander formulierlelement, bijvoorbeeld een radio-button?
Thomas van den Heuvel op 05/10/2015 16:56:07:
Misschien is het makkelijker als je de volgende strategie hanteert: het maakt niet uit wat iemand invult als je maar zorgt dat het veld wat iemand invult een nog in te vullen veld is. Elke keer als de pagina met de puzzel wordt geladen is het jouw beurt toch (er van uitgaande dat de andere beurt altijd door de computer wordt ingenomen)?
In zekere zin hoef je dus niet bij te houden wiens beurt het is, tenzij dit programma ook in staat moet zijn om gespeeld te kunnen worden door twee menselijke spelers?
En als je niet wilt dat iemand ergens iets invult, moet je hem/haar deze keuze niet geven, je zou misschien kunnen denken aan een ander formulierlelement, bijvoorbeeld een radio-button?
In zekere zin hoef je dus niet bij te houden wiens beurt het is, tenzij dit programma ook in staat moet zijn om gespeeld te kunnen worden door twee menselijke spelers?
En als je niet wilt dat iemand ergens iets invult, moet je hem/haar deze keuze niet geven, je zou misschien kunnen denken aan een ander formulierlelement, bijvoorbeeld een radio-button?
ja je speelt elke keer tegen de computer dus opzich heel logisch wat je zegt. Ik heb het geprobeerd maar kun je mij vertellen waarom het volgende niet werkt?
ipv:
if (isset($_POST["submit"])){ //als de speler submit klikt word de data opgehaald
for($i=0; $i<=8; $i++){
$box[$i] = $_POST['box'.$i];
}
}
heb ik dit gedaan:
if (isset($_POST["submit"])){ //als de speler submit klikt word de data opgehaald
if ($box[0] == NULL){
$box[0] = $_POST['box0'];
}
}
Als ik voor box 0 dan een X invul en in de volgende beurt een A bijv probeer in te vullen veranderd die hem alsnog naar een A. Hoort dat? Want volgens mij heb ik toch echt geschreven als box0 gelijk is aan niks, dan pas de waarde van box0 naar $box[0] posten. Heb btw NULL ook vervangen met ' ', maar dat levert het zelfde resultaat op
Gewijzigd op 06/10/2015 00:52:52 door Sunil Kisoensingh