Volledige versie bekijken : zeeslag in php



pietergoed
16 April 2011, 11:43
hallo,

Ik heb de opdracht gekregen om zeeslag te maken in php.
Ik heb hiervoor al 2 bestandjes: zeeslag.php en zeeslagverwerk.php
mijn eerste bestand ziet er als volgt uit:


<!DOCTYPE html>
<html>
<head><title>zeeslag</title></head>
<body>

<p>
Plaats jouw schepen.
<br>Je hebt 3 schepen ter beschikking</br>
<br>1 van 3 blokjes en 2 van 2 blokjes</br>


</p>

<form action="zeeslagverwerk.php" method="post">
<table border = "1">


<tr><td><input type="checkbox" name="schepen[]" value="0" /></td><td><input type="checkbox" name="schepen[]" value="1" /></td><td><input type="checkbox" name="schepen[]" value="2" /></td><td><input type="checkbox" name="schepen[]" value="3" /></td><td><input type="checkbox" name="schepen[]" value="4" /></td></tr>
<tr><td><input type="checkbox" name="schepen[]" value="5" /></td><td><input type="checkbox" name="schepen[]" value="6" /></td><td><input type="checkbox" name="schepen[]" value="7" /></td><td><input type="checkbox" name="schepen[]" value="8" /></td><td><input type="checkbox" name="schepen[]" value="9" /></td></tr>
<tr><td><input type="checkbox" name="schepen[]" value="10" /></td><td><input type="checkbox" name="schepen[]" value="11" /></td><td><input type="checkbox" name="schepen[]" value="12" /></td><td><input type="checkbox" name="schepen[]" value="13" /></td><td><input type="checkbox" name="schepen[]" value="14" /></td></tr>
<tr><td><input type="checkbox" name="schepen[]" value="15" /></td><td><input type="checkbox" name="schepen[]" value="16" /></td><td><input type="checkbox" name="schepen[]" value="17" /></td><td><input type="checkbox" name="schepen[]" value="18" /></td><td><input type="checkbox" name="schepen[]" value="19" /></td></tr>
<tr><td><input type="checkbox" name="schepen[]" value="20" /></td><td><input type="checkbox" name="schepen[]" value="21" /></td><td><input type="checkbox" name="schepen[]" value="22" /></td><td><input type="checkbox" name="schepen[]" value="23" /></td><td><input type="checkbox" name="schepen[]" value="24" /></td></tr>


</table>
<input type="submit" value="Stuur door" />
</form>

</body>
</html>


het is dus een tabel met checkboxen om de plaats van mijn schepen te bepalen. Het moet een vierkant van 5X5 zijn en je hebt 1 schip van 3 en 2 schepen van 2 blokjes.
mijn verwerkbestand ziet er als volgt uit:


<!DOCTYPE html>
<html>
<head><title>zeeslag verwerk</title>
<body>
<table border = "1">
<?php
$schepen = $_POST["schepen"];

foreach ($schepen as $schip)
{
$schepenia[(floor($schip/5))][($schip%5)] ="X";
}
for($i=0;$i<=4;$i++)
{
echo "<tr>";
for($j=0 ; $j<=4 ; $j++)
{

echo "<td>" . $schepenia[$i][$j] . "</td>";
}
echo "</tr>";
}

print_r($schepenia);

?>
</table>
</body>
</html>

Het is de bedoeling dat de andere tegenstander de computer is, dus nu moet ik nog een tabel maken (vanzelf door de computer). De computer moet willekeurig 7 vakjes aankruisen waaarvan 2 boten met 2 vakjes naast elkaar en de derde boot met 3 vakjes (functie rand($min, $max).
Ik moet dan mijn eerste tabel van de plaatsen van mijn boten naar het scherm sturen en daarnaast de tabel waar de computer willekeurig zijn schepen heeft geplaatst. deze laatste tabel zal dan waarschijnlijk 'radioknoppen' hebben. dan verloopt het spel zoals de normale regels. Ik moet dus (later) ook nog een strategie uitwerken voor de computer. Als deze raak heeft geschoten moet hij de volgende keer naast dat punt schieten.
Geen eenvoudige opdracht dus!
Ik zou het erg appreciƫren als je me wilt helpen

ps: de volgende punten hebben we reeds behandeld in de klas: php, html , forms en arrays

Pieter

pietergoed
16 April 2011, 12:57
Hallo

ik zou de computer in een tabel van 5X5 7 willekeurig vakjes moeten laten aanduiden.
Het is voor het spel zeeslag (ik heb hierover al een eerdere post gemaakt).
ik heb 2 boten van 2 vakjes naast elkaar nodig en 1 boot van 3 vakjes naast elkaar.
ik weet nog niet zeker wat ik het best gebruik: een array of en tabel
de output moet echter een tabel zijn met checkboxen en als ik op de juist plaats 'schiet'(klik) dan moet de computer mij dat op de een of andere manier laten weten.

Pieter

Jelle
17 April 2011, 14:55
Hi Pieter,

Ik heb je twee topics samengevoegd en je code in tags gezet voor syntax highlighting.

Gelieve zelf ook concrete ideeƫn uit te werken, want ik denk dat je hier niemand bereid zal vinden om jouw hele huiswerk te maken. Je moet meer concrete vragen stellen :)

pietergoed
18 April 2011, 19:30
random 7 vakjes aankruisen in array

Hallo

ik zou de computer in een tabel van 5X5 7 willekeurig vakjes moeten laten aanduiden.
Het is voor het spel zeeslag (ik heb hierover al een eerdere post gemaakt).
ik heb 2 boten van 2 vakjes naast elkaar nodig en 1 boot van 3 vakjes naast elkaar. Ik moet dus een 2dimensionale array hebben met 2 boten van 2 en 1 boot van 3 vakjes (zo mogen elkaar niet overlappen).
ik kan de array daarna overzetten naar een table.




enige hulp zou welkom zijn!!!!!

Pieter

kurt0015
19 April 2011, 19:58
Ik zou werken met een array dat je in een sessie steekt of je post steeds alle data maar dat is beetje een kwestie van voorkeur. Ik zou omdat de computer zijn gedeelte best verborgen blijft deze in een sessie stoppen en het array steeds bijwerken met nieuwe informatie.


<?php

$data = array(

/**
* Locatie van boten
*/
'boten' => array(
array(), // Boten van speler
array() // Boten van pc
),

/**
* Waar werden er al schoten gedaan
*/
'schoten' => array(
array(), // Schoten van speler
array() // Schoten van pc
)
);

function table($locations = false)
{
if($locations == false || (is_array($locations) && count($locations) == 0))
{
/**
* Lege tabel maken!
*/
}
else
{
/**
* Verwerking data
*/
}
}

# Wanneer je deze dan nodg hebt kan je simpel iets doen als
table($data['boten'][0]);

Vanuit het array zou ik dan steeds een tabel laten generen door een functie aan te roepen. Indien je je velden simpel indeelt kun je in je array dus waardes opnemen als A1. En zo de locaties bepalen. Er zijn natuurlijk meerdere mogelijkheden om dit op te bouwen maar dit is mijn eerste gedacht.

ultddave
19 April 2011, 21:52
@Pieter;

Hetgeen je eigenlijk wilt doen is een beetje zoals een "opening book" bij schaken. Daarbij ga je de beste openingszetten in een database opslaan.

In dit geval kan je eventueel een aantal goede startposities (ik ben niet vertrouwd met zeeslag, maar ik vermoed dat er een aantal goede strategische plaatsen zijn) hardcoden (dus de rij/columnindexen letterlijk in de code zetten) en via een random variabele laten kiezen welke "opening book" hij gaat pakken.



function startPosities1()
{
// Plaats de boten op de posities overeenstemmend met tactiek 1
}

function startPosities2()
{
// Plaats de boten op de posities overeenstemmend met tactiek 2
}

// Eventueel nog andere tactieken


En dan in de main function;



$choice = rand(1, 2); // random geheel getal genereren tussen 1 en 2 (inclusief 1 en 2 zelf)

if($choice == 1)
startPosities1();
else
startPosities2();


Bij meerdere keuzes kan je de voorkeur geven aan een switch ipv if-else if structuur. ;)

Een functie schrijven voor random wat boten in de array te plaatsen, neemt redelijk veel tijd in beslag (het coderen bedoel ik dan - niet noodzakelijk het uitvoeren van de functie).

Indien je het toch wilt proberen; 1 extra array bijhouden met alle boten die je wilt plaatsen.

Dan een loop voorzien, die door deze array loopt. Dan moet je voor elke boot een lijst genereren van alle mogelijke zetten voor deze boot. (Dit gaat redelijk wat code zijn volgens mij.)

En dan via "rand" weer 1 zet daaruit random kiezen en uitvoeren.


For i = 0 to botenArray.length
mogelijkePosities = genereerMogelijkePosities(botenArray[i]);
keuze = rand(0, mogelijkePosities.length - 1);
plaatsBoot(mogelijkePosities[keuze]);
Next


Mvg,
Dave