Mogelijke posities van schaakstuk bepalen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

JaccoZ

JaccoZ

28/11/2006 20:59:00
Quote Anchor link
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? ?
 
PHP hulp

PHP hulp

17/11/2024 20:46:40
 
Robert Deiman

Robert Deiman

28/11/2006 21:24:00
Quote Anchor link
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.
 
JaccoZ

JaccoZ

28/11/2006 21:42:00
Quote Anchor link
Ik wil eigenlijk eerst al de mogelijke posities bepalen en daarna de posities die niet kunnen door andere stukken enz. eruit filteren
 
Jan Koehoorn

Jan Koehoorn

28/11/2006 21:46:00
Quote Anchor link
Het is inderdaad een leuk probleem. Je hebt per stuk een andere functie nodig. Ik ga er ook even mee aan de slag.
 
Jan Koehoorn

Jan Koehoorn

28/11/2006 22:07:00
Quote Anchor link
Ik heb hier een stukje voorbeeldcode dat alle mogelijk posities van een toren berekent.
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
<?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.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
K i p

K i p

28/11/2006 22:10:00
Quote Anchor link
"Klinkt niet als moeilijk maar als veel werk. ", aldus de amateur (ik:-P).
 
Jan Koehoorn

Jan Koehoorn

28/11/2006 22:12:00
Quote Anchor link
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 ;-)
 
Eris -

Eris -

28/11/2006 22:15:00
Quote Anchor link
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 ;-)
 
Jan Koehoorn

Jan Koehoorn

28/11/2006 22:17:00
Quote Anchor link
@ Eris: klopt, goede aanvulling.
 
Eris -

Eris -

28/11/2006 22:21:00
Quote Anchor link
Ik kan nog wel een beetje schaken :)
 
K i p

K i p

28/11/2006 22:22:00
Quote Anchor link
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'.
 
Robert Deiman

Robert Deiman

28/11/2006 23:19:00
Quote Anchor link
- Wat ook nog een hele moeilijke is is wanneer iemand de koning zet, en je mag jezelf NIET schaak zetten, om te berekenen waar die koning dan wel heengezet mag worden.

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.
 
PHP Newbie

PHP Newbie

28/11/2006 23:22:00
Quote Anchor link
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 ;-)
 
JaccoZ

JaccoZ

29/11/2006 12:08:00
Quote Anchor link
In eerste instantie is dit plan bedoelt om schaakproblemen op te lossen. Zowel tweezetten (wit mag een zet doen daarna zwart een tegenzet en de volgende zet van wit dan moet het mat zijn) als driezetten.
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)
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         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;
?>
maar als resultaat krijg ik
Array
(
[0] => e6
[8] => g6
[16] => e4
[24] => g4
)

Wat heb ik verkeerd gedaan?
Gewijzigd op 01/01/1970 01:00:00 door JaccoZ
 
CrawlBackwards

CrawlBackwards

29/11/2006 14:00:00
Quote Anchor link
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..
 
Jurgen assaasas

Jurgen assaasas

29/11/2006 14:50:00
Quote Anchor link
ziet er ingewikkeld uit.. iig veel denkwerk voor de programmeur.(alle regels etc)

Leuk probleem. Ik ga er iig neit aan beginnen:P hou k helemaal geen vrijetijd meer over :)
 
Mebus  Hackintosh

Mebus Hackintosh

29/11/2006 15:24:00
Quote Anchor link
De phphulper ZIM had weleens zoiets gemaakt geloof ik mischien zouw je hem even een PM kunnen sturen?

GR. mebus
 
JaccoZ

JaccoZ

30/11/2006 21:54:00
Quote Anchor link
Het leukst is om het juist zelf te maken. maar wat is er nu fout aan de volgende berekeningen voor de loper?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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]);
                }
 



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.