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.
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 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.
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
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
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'.