Hoe controleer ik als X heeft gespeeld en draag ik dan de beurt aan O over

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sunil Kisoensingh

Sunil Kisoensingh

04/10/2015 11:32:34
Quote Anchor link
Ik ben pas met een opleiding ICT begonnen aan het HBO en moet voor mn 3e opdracht een TicTacToe spelletje maken. Nou ben ik al aardig wat opgeschoten dankzij tutorials etc. en kan je nu gewoon een potje spelen. Alleen weet het script niet wiens beurt het is dus kan je bij wijze van spreken hele tijd submit blijven drukken en dan vult de computer hele tijd Otjes in zonder dat de speler ee X invoerd. Hoe controleer ik nu als de speler een X heeft ingevoerd en dat ik daarna pas de computer zn beurt geef? Hier is mijn code:

<!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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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!";
    }
}


?>

<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)
PHP script in nieuw venster Selecteer het PHP script
1
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>";
    }

                
?>

</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
 
PHP hulp

PHP hulp

25/04/2024 01:02:00
 
Randy vsf

Randy vsf

04/10/2015 12:30:27
Quote Anchor link
je kan controleren of er iets veranderd is tussen de oude en nieuwe waardes.
Is er iets veranderd dan is de computer aan de beurt, anders niet.
Gewijzigd op 04/10/2015 12:32:13 door Randy vsf
 
Thomas van den Heuvel

Thomas van den Heuvel

04/10/2015 14:57:13
Quote Anchor link
(dit alles nog even los van de beveiliging en veiligheid van je applicatie)

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).
 
- SanThe -

- SanThe -

04/10/2015 21:52:59
Quote Anchor link
$beurt = 'x';

Hiermee blijft altijd de speler aan de beurt.
Gebruik een session en wissel de beurt.
 
Sunil Kisoensingh

Sunil Kisoensingh

04/10/2015 21:54:53
Quote Anchor link
Hoi ik heb nu 2 arrays bijgemaakt, eentje die de zetten van de speler bijhoud en eentje die de zetten van de computer bijhoud. Nou merk ik dat als ik een X invul en submit dat die x in de array $box meteen komt en de array van de speler maar de O die de computer invult verschijnt niet meteen in de array $box en ook niet in de aaray van de computer, dat doet ie namelijk pas wanneer ik weer nog een keer submit klik. (opzich wel logisch aangezien hij pas dingen begint te doen als er submit is geklikt, maar hoe kan ik dat veranderen? Of zou ik voor dat helemaal opnieuw moeten beginnen (wat ik totaal niet erg vind, gaat me erom dat ik het ga begrijpen))

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
 
Thomas van den Heuvel

Thomas van den Heuvel

04/10/2015 21:55:25
Quote Anchor link
@SanThe de vraag is of de TS gebruik mag maken van sessies (en/of deze van het bestaan ervan weet), zo is de applicatie iig niet opgezet.

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
 
Sunil Kisoensingh

Sunil Kisoensingh

04/10/2015 22:00:21
Quote Anchor link
- 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.


$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 :(
 
- SanThe -

- SanThe -

04/10/2015 22:01:51
 
Sunil Kisoensingh

Sunil Kisoensingh

05/10/2015 13:33:30
Quote Anchor link
Ik heb dit stukje:

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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';
    }
}


?>

<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)
PHP script in nieuw venster Selecteer het PHP script
1
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>";
    }

                
?>

</body>
</html>

Hoe het script nu is!
 
Thomas van den Heuvel

Thomas van den Heuvel

05/10/2015 16:56:07
Quote Anchor link
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?
 
Sunil Kisoensingh

Sunil Kisoensingh

06/10/2015 00:52:22
Quote Anchor link
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?


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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.