Mogelijke posities van schaakstuk bepalen
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? ?
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.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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>';
?>
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.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
"Klinkt niet als moeilijk maar als veel werk. ", aldus de amateur (ik:-P).
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 ;-)
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 :)
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'.
Verder:
- Het script moet ook gaan zien wanneer het op een remise uit draait, bijvoorbeeld als de koning geen enkele zet meer kan doen, maar NIET schaak staat.
- Er moet rekening mee worden houden met de pionnen dat die alleen rechtuit mogen lopen, maar dan ook meteen weer diagonaal mogen slaan.
- Alleen paarden mogen over andere speelstukken heen springen. Voor de rest van de schaakstukken geld dat als er iets in de weg staat, dat ook die velden voor dat stuk niet bereikbaar zijn.
Dus, het is inderdaad moeilijk, en een beste hoeveelheid werk.
Eris schreef op 28.11.2006 22:15:
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 en niet schaak gestaan heeft
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 ;-)
1) de koning en de toren die gaat rokeren nog niet bewogen heeft
2) de koning niet schaak staat en niet schaak gestaan heeft
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 ;-)
Ik weet dat het erg ingewikkeld en moeilijk gaat worden. Maar tevens is het een grote uitdaging voor me, zeker omdat ik nog een vrij amateur php'er ben. Kzie wel hoe ver het gaat lukken.
Verder heb ik geprobeerd de loper toe te voegen:
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 case 'loper':
for ($i = 0; $i < 8; $i++) {
array_push ($positions, $hor[$x - 1] . $ver[$y + 1]);
}
for ($j = 0; $j < 8; $j++) {
array_push ($positions, $hor[$x + 1] . $ver[$y + 1]);
}
for ($k = 0; $k < 8; $k++) {
array_push ($positions, $hor[$x - 1] . $ver[$y - 1]);
}
for ($l = 0; $l < 8; $l++) {
array_push ($positions, $hor[$x + 1] . $ver[$y - 1]);
}
break;
?>
for ($i = 0; $i < 8; $i++) {
array_push ($positions, $hor[$x - 1] . $ver[$y + 1]);
}
for ($j = 0; $j < 8; $j++) {
array_push ($positions, $hor[$x + 1] . $ver[$y + 1]);
}
for ($k = 0; $k < 8; $k++) {
array_push ($positions, $hor[$x - 1] . $ver[$y - 1]);
}
for ($l = 0; $l < 8; $l++) {
array_push ($positions, $hor[$x + 1] . $ver[$y - 1]);
}
break;
?>
Array
(
[0] => e6
[8] => g6
[16] => e4
[24] => g4
)
Wat heb ik verkeerd gedaan?
Gewijzigd op 01/01/1970 01:00:00 door JaccoZ
nogsteeds is het niet moeilijk.. gewoon per regel benaderen en samen voegen.. maar wel veel werk.. leuk probleem misschien ga ik der later ook nog wat mee doen.. ben nu eerst een multiplayer van freecell aan t maken :P en t lukt aardig..
Leuk probleem. Ik ga er iig neit aan beginnen:P hou k helemaal geen vrijetijd meer over :)
GR. mebus
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
for ($k = 0; $k < 8; $k++) {
array_push($positions, $hor[$x - $k] . $ver[$y - $k]);
}
for ($l = 0; $l < 8; $l++) {
array_push ($positions, $hor[$x + $l] . $ver[$y - $l]);
}
for ($m = 0; $m < 8; $m++) {
array_push ($positions, $hor[$x - $m] . $ver[$y + $m]);
}
for ($n = 0; $n < 8; $n++) {
array_push ($positions, $hor[$x + $n] . $ver[$y + $n]);
}
array_push($positions, $hor[$x - $k] . $ver[$y - $k]);
}
for ($l = 0; $l < 8; $l++) {
array_push ($positions, $hor[$x + $l] . $ver[$y - $l]);
}
for ($m = 0; $m < 8; $m++) {
array_push ($positions, $hor[$x - $m] . $ver[$y + $m]);
}
for ($n = 0; $n < 8; $n++) {
array_push ($positions, $hor[$x + $n] . $ver[$y + $n]);
}