Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Kilpailuksi upseerishakki?

jone2712 [26.10.2017 20:04:10]

#

Kun pöly laskeutuu Datatähti-kilpailun osalta, ehdotan että seuraavaksi kilpaillaan shakissa. Shakin säännöt kevenevät suunnattomasti, jos pelataan pelkillä upseereilla alkuasemasta:

char set_up[64]=
{
/*   h   g   f   e   d   c   b   a   */
/* |---|---|---|---|---|---|---|---| */
    'T',' ',' ','K','D',' ',' ','T', // 1
/* |---|---|---|---|---|---|---|---| */
    'L',' ',' ','R','R',' ',' ','L', // 2
/* |---|---|---|---|---|---|---|---| */
    ' ',' ',' ',' ',' ',' ',' ',' ', // 3
/* |---|---|---|---|---|---|---|---| */
    ' ',' ',' ',' ',' ',' ',' ',' ', // 4
/* |---|---|---|---|---|---|---|---| */
    ' ',' ',' ',' ',' ',' ',' ',' ', // 5
/* |---|---|---|---|---|---|---|---| */
    ' ',' ',' ',' ',' ',' ',' ',' ', // 6
/* |---|---|---|---|---|---|---|---| */
    'l',' ',' ','r','r',' ',' ','l', // 7
/* |---|---|---|---|---|---|---|---| */
    't',' ',' ','k','d',' ',' ','t', // 8
/* |---|---|---|---|---|---|---|---| */
/*   h   g   f   e   d   c   b   a   */
};

Jossa siis esimerkiksi D on valkea daami ja d musta daami. Linnoittautuminen, sotilaan kaksoisaskel, ohestalyönnit, ym. säännöt on karsittu. Kaikki shakkinappulat mahtuvat neljään bittiin:

#define lahetti  0x01
#define   torni  0x02
#define   daami  0x03
#define   ratsu  0x04
#define  kaarle  0x08
#define sotilas  0x0c

Liikkumissäännöistä tulee pieni yksinkertainen taulukko. Oma kokemukseni on, että tällaisessa "upseerishakissa" tulee hurjia tilanteita, kun jompi kumpi uhraa nappuloitaan ja yllättäen ratsu tekee pussimatin.

Yhtä kaikki. Jos shakkikilpailun säännöt sorvataan yhdessä, uskon että siitä tulisi mielenkiintoinen koitos.

Vanaja [28.10.2017 21:38:00]

#

jone2712 kirjoitti:

Kaikki shakkinappulat mahtuvat neljään bittiin:

Jos vielä tiivistetään, shakkinappulat mahtuvat kolmeen bittiin:

#define lahetti  1
#define   torni  2
#define   daami  3
#define   ratsu  4
#define  kaarle  5
#define sotilas  6

Linjaupseerit voi yleistää samaan taulukkoon. Ratsu ja kuningas liikkuuvat niin ikään samalla periaatteella, eli tarvitaan kaksi vertailua:

if (nappula <= daami) {
   // nappula on lähetti, torni tai daami
   koodia...
}
else if (nappula <= kaarle) {
   // nappula on ratsu tai kaarle
   koodia...'
}
else {
   // nappula on sotilas
   koodia...
}

jalski [29.10.2017 10:53:12]

#

Vanaja kirjoitti:

Linjaupseerit voi yleistää samaan taulukkoon. Ratsu ja kuningas liikkuuvat niin ikään samalla periaatteella, eli tarvitaan kaksi vertailua.

Taitaa taulukkoja ja vertailuja tulla hiukan enemmän kuin kaksi. Kuningas ja sotilas liikkuvat samalla periaatteella, ratsun liikkeet tarvitsee kyllä käsitellä erikseen. "Liukuvien" nappuloiden käsittelyyn tarvitaan todennäköisesti useampia rotatoituja bittitauluja, tosin kuningatattaren tapauksessa voidaan bittioperaatioilla yhdistää tornin ja lähetin mahdolliset liikkeet.

Mietin pikaisesti, miten bittitauluja olisi ohjelmassa helpoin käsitellä ja päädyin seuraavaan PL/I-koodiin:

define ordinal CHESSGRID( H8 value(1), G8, F8, E8, D8, C8, B8, A8,
                          H7,          G7, F7, E7, D7, C7, B7, A7,
                          H6,          G6, F6, E6, D6, C6, B6, A6,
                          H5,          G5, F5, E5, D5, C5, B5, A5,
                          H4,          G4, F4, E4, D4, C4, B4, A4,
                          H3,          G3, F3, E3, D3, C3, B3, A3,
                          H2,          G2, F2, E2, D2, C2, B2, A2,
                          H1,          G1, F1, E1, D1, C1, B1, A1 );


dcl atab(64)  fixed bin(31) nonasgn init( 1, 2, 3, 4, 5, 6, 7, 8,
                                          1, 2, 3, 4, 5, 6, 7, 8,
                                          1, 2, 3, 4, 5, 6, 7, 8,
                                          1, 2, 3, 4, 5, 6, 7, 8,
                                          1, 2, 3, 4, 5, 6, 7, 8,
                                          1, 2, 3, 4, 5, 6, 7, 8,
                                          1, 2, 3, 4, 5, 6, 7, 8,
                                          1, 2, 3, 4, 5, 6, 7, 8 );


dcl numtab(64) fixed bin(31) nonasgn init( 1, 1, 1, 1, 1, 1, 1, 1,
                                           2, 2, 2, 2, 2, 2, 2, 2,
                                           3, 3, 3, 3, 3, 3, 3, 3,
                                           4, 4, 4, 4, 4, 4, 4, 4,
                                           5, 5, 5, 5, 5, 5, 5, 5,
                                           6, 6, 6, 6, 6, 6, 6, 6,
                                           7, 7, 7, 7, 7, 7, 7, 7,
                                           8, 8, 8, 8, 8, 8, 8, 8 );


dcl matrix(8,8) bit(1);
dcl board(64)   bit(1) based(addr(matrix));

Näin voin helposti käsitellä bittitaulua talukkona (1-ulotteisena ja 2-ulotteisena) ja bittimerkkijonona:

/* Voi käyttää ruudun tunnusta */
board(binvalue(B4)) = '1'b;

/* Helppo käsitellä bittioperaatioilla */
result = string(allPawns) & string(whitePawns);

/* Voi etsiä yksinkertaisesti merkkijonohaulla */
i = search(string(board), '1'b);

/* Voi käsitellä 2-ulotteisena taulukkona */
display(matrix(numtab(i), atab(i)));

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta