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.
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... }
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)));
Aihe on jo aika vanha, joten et voi enää vastata siihen.