Hoi,

Het volgende wil ik gaan proberen: ik kies de locatie van een schaakstuk op het bord en de computer zegt en toont de mogelijke zetten die dat schaakstuk kan doen in die situatie.

Om dit voor elkaar te krijgen dacht ik dat het makkelijkst is dat ik de positie bepaal als (x,y) dus bijvoorbeeld (3,1) dus niet zoals bij een schaakbord dat de x-as gekenmerkt wordt door de letters a t/m h.


Probleem: Als ik een loper op (3,1) heb staan, hoe kan ik dan makkelijk de opdracht geven om te kijken naar welke positie hij kan. dus dat de pc berekent (3-1,1+1) en (3-2,1+2) enz.

Wie kan mij helpen? ?
JaccoZ

Zoals je het nu in je voorbeeld hebt staan, hou je nog niet eens rekening met het feit dat er meerdere schaakstukken op het bord staan. Wel een leuk probleem dit, daar moet ik eens goed voor gaan zitten.
Ik wil eigenlijk eerst al de mogelijke posities bepalen en daarna de posities die niet kunnen door andere stukken enz. eruit filteren
Het is inderdaad een leuk probleem. Je hebt per stuk een andere functie nodig. Ik ga er ook even mee aan de slag.
Ik heb hier een stukje voorbeeldcode dat alle mogelijk posities van een toren berekent.
<?php
function get_positions ($piece, $x, $y) {
$hor = range ('a', 'h');
$ver = range (1, 8);
$positions = array ();
switch ($piece) {
case 'toren':
for ($i = 0; $i < 8; $i++) {
array_push ($positions, $hor[$x - 1] . $ver[$i]);
}
for ($j = 0; $j < 8; $j++) {
array_push ($positions, $hor[$j] . $ver[$y - 1]);
}
break;
}
return array_unique ($positions);
}

$toren = get_positions ('toren', 3, 4);
echo '<pre>';
print_r ($toren);
echo '</pre>';
?>
Er zijn echter wel wat problemen. Bijvoorbeeld bij een pion moet je kijken of hij op rij 2 staat of niet, omdat hij dan eventueel twee vooruit mag. Je moet ook links en rechts diagonaal kijken of daar een stuk staat, want hij mag schuin slaan. En dan heb je ook nog en passant slaan. Bij een koning moet je kijken of hij niet schaak komt te staan en dan heb je ook nog de korte en lange rokade.
"Klinkt niet als moeilijk maar als veel werk. ", aldus de amateur (ik:-P).
Het is ook wel moeilijk volgens mij. Ga maar na; een rokade mag alleen als:

1) de koning nog niet bewogen heeft
2) de koning niet schaak staat
3) de toren waarnaar je wilt rokeren niet aangevallen staat
4) één van de velden tussen de koning en de toren waarnaar je wilt rokeren niet aangevallen staat

maak daar maar eens een functie voor ;-)
Jan Koehoorn schreef op 28.11.2006 22:12
Het is ook wel moeilijk volgens mij. Ga maar na; een rokade mag alleen als:

1) de koning en de toren die gaat rokeren nog niet bewogen heeft
2) de koning niet schaak staat
3) de toren waarnaar je wilt rokeren niet aangevallen staat
4) één van de velden tussen de koning en de toren waarnaar je wilt rokeren niet aangevallen staat

maak daar maar eens een functie voor ;-)
@ Eris: klopt, goede aanvulling.
Ik kan nog wel een beetje schaken :)
Tsja, als je het zo uit een db kan halen, is het niet moeilijk om te kijken of de koning en de toren al bewogen hebben ;-) Maar goed, om het verschil tussen moeilijk en veel tijd te maken was ik op de verkeerde weg denk ik. Moeilijk en veel werk hangen op veel manier met elkaar samen.

Ik denk dat voor zo iets het handig is als je een spel_id in je sessie en in je db zet. In de db dan alles opslaan (elke beweging) en aan de hand van die bewegingen huidige spelsituatie 'berekenen'.

Reageren