Kukaan täällä tehnyt shakkipeliä ja piirtänyt shakkinappuloiden grafiikkoja valmiiksi?
Olen aloittamassa shakkipeli projektia Infernolle Limbolla ja ajattelin, että voisin piirtelyn sijaan keskittyä itse ohjelmaan. Pelistä tulee aluksi pelkästään kahden pelaajan verkkopeli, mutta tarkoituksena olisi kyllä lisätä tekoäly mukaan myöhemmin.
Netistä varmasti löytyy. Ota kuvaruutukaappaus ja tallenna kuvat.
Kuulostaa melkein siltä viimeiseltä oljenkorrelta: Kuvakaapatut kuvat voivat olla laadullisesti heikompia (ellei kuvaa käsitellä sekä lähettäjän että käyttäjän päässä häviöttömästi, häviöllinen -> häviötön taasen johtaa tarpeettoman isoon tiedostokokoon) ja niiden käyttöoikeuksia voi olla vaikea selvittää. Voisin kuvitella, että jos kuvat on tarkoitettu vapaaseen käyttöön, pelistä löytyy myös lähdekoodiversio, josta kuvat saa suoraan, tai peli linkittää kuvien lähteeseen.
Kahden pelaajan verkkopelitoteutus vaikuttaisi melko yksinkertaiselta toteuttaa?
Nopeasti mietittynä jakaisin ongelman kutakuinkin allaolevan kaltaisiin proseduureihin:
- movelist:
Pistää listaan tietyn position kaikki mahdolliset siirrot, käyttäen apuna kutakin erilaista pelinappulaa varten tehtyä proseduuria.
- queen:
Kuningattaren siirtomahdollisuudet listaan.
Mahdollisuus yksinkertaistaa. Kuningatar on yhdistelmä tornia ja piispaa
- king:
Kuninkaan siirtomahdollisuudet listaan.
- pawn:
Sotilaan siirtomahdollisuudet listaan.
- bishop:
Piispan siirtomahdollisuudet listaan.
- rook:
Tornin siirtomahdollisuudet listaan.
- knight:
Hevosen siirtomahdollisuudet listaan.
- incheck:
Onko shakki?
Jokaisen pelilaudalla olevan vastustajan pelinappulan siirtomahdollisuudet selvitetään movelist:in avulla ja selvitetään johtaako joku siirroista shakkiin.
- move:
Siirtää pelinappulaa.
Elikkä toiminta olisi lyhykäisyydessään sellainen, että kun pelivuorossa oleva pelaaja painaa pelilaudalla olevaa omaa pelinappulaa niin annetaan movelist proseduurille parametriksi pelinappulan positio pelilaudalla ja kutsutaan sitä. Movelist:in avulla saadun kyseisen pelinappulan siirtomahdollisuuslistan siirrot käydään vielä läpi incheck -funktion avulla ja poistetaan listalta kaikki ei sallitut siirrot, mitkä johtaisivat oman kuninkaan shakkiin. Nyt voidaan ruudulla sallitut siirrot pelilaudalla korostaa erivärillä ja hyväksyä kohteeksi joku näistä.
Varmaankin ihan toimiva vaihtoehto. Lisäksi itse siirroista kannattaa pitää kirjaa, koska se vaikuttaa siihen, voiko linnottautua tai sopia tasapeli.
jalski kirjoitti:
Kukaan täällä tehnyt shakkipeliä ja piirtänyt shakkinappuloiden grafiikkoja valmiiksi?
Tuolta löytyy kaikkien nappuloiden symbolit minkä vaan kokoisina ja GFDL, BSD ja GPL-lisenssillä.
Jaska kirjoitti:
Lisäksi itse siirroista kannattaa pitää kirjaa, koska se vaikuttaa siihen, voiko linnottautua tai sopia tasapeli.
Pelaajat voivat sopia tasapelin ihan milloin vain, mutta tehdyt siirrot vaikuttavat siihen voiko tasapeliä vaatia (lähinnä saman aseman toisto kolmeen kertaan ja 50 siirron sääntö).
Kiitoksia nappuloiden grafiikka linkistä.
Löysin netistä vanhan dokumentin 50-luvulta, mitä käytän oman toteutukseni pohjana.
Tallennan pelilaudan 2-ulotteiseen taulukkoon. Pelilaudan esitys alkutilanteessa tulee olemaan:
4, 2, 3, 5, 6, 3, 2, 4 1, 1, 1, 1, 1, 1, 1, 1 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0 -1, -1, -1, -1, -1, -1, -1, -1 -4, -2, -3, -5, -6, -3, -2, -4
Lambda muuttuja tallentaa tiedon kumman pelaajan vuoro on ja se voi saada arvon 1 tai -1.
Lambdan avulla voi myös yksinkertaisesti päätellä onko pelinappula pelilaudalla oma vai vastustajan. Tämä onnistuu yksinkertaisesti kertomalla peliruudun sisältö lambdalla. Tuloksen ollessa positivinen on kyseessä oma nappula, jos tulos on negatiivinen on kyseessä vastustajan nappula.
Lisäksi tarvitaan pari muuttujaa tallentamaan tiedot linnoittautumisoikeuksista.
Kahden pelaajan shakkipeli alkaa jo hahmottua mukavasti. Sain eilen parin tunnin koneella istumisen aikana toteutettua pelilaudan esityksen, useimmat piirtorutiinit, verkkopelin rungon ja käyttöliittymän alustavan toteutuksen.
Jos aika antaa myöten, niin illalla saan varmaankin lisättyä mukaan valitun pelinappulan siirtomahdollisuuksien korostamisen pelilaudalla eri värillä. Tämän jälkeen pelinappuloiden toiminta logiikan tarkastaminen käynee mukavasti muuttamalla käsipelillä pelilaudan tallentavan 2-ulotteisen taulukon arvoja ja klikkailemalla pelinappuloita ruudulla.
jalski kirjoitti:
Jos aika antaa myöten, niin illalla saan varmaankin lisättyä mukaan valitun pelinappulan siirtomahdollisuuksien korostamisen pelilaudalla eri värillä. Tämän jälkeen pelinappuloiden toiminta logiikan tarkastaminen käynee mukavasti muuttamalla käsipelillä pelilaudan tallentavan 2-ulotteisen taulukon arvoja ja klikkailemalla pelinappuloita ruudulla.
Hyvinhän tuo menetelmä tuntuu toimivan...
Eiköhän peli valmistu tulevan viikonlopun aikana. Laitan pelin lähdekoodit datatiedostoineen ladattaviksi, kunhan saan valmiiksi.
Mitä mieltä olette?
Onko valitun oman pelinappulan siirtomahdollisuuksien näyttäminen ruudulla hyvä asia vai helpottaako se liikaa pelaamista? Olisiko parempi vain näyttää pelkkä valittu pelinappula?
Tämän hetkisessä toteutuksessa valitun pelinappulan ruutu korostetaan paksulla värikehyksellä ja sallitut siirtovaihtoehdot ohuella värikehyksellä. Lisäksi toteutin vähän aikaa näkyvän nuolen näyttämään mistä mihin siirto tapahtui.
Mielestäni tuo helpottaa pelaamista liikaa, sillä yksi shakin ideoista on siinä, että osaat nähdä, mitä siirtoja voit tehdä...
Triton kirjoitti:
Mielestäni tuo helpottaa pelaamista liikaa, sillä yksi shakin ideoista on siinä, että osaat nähdä, mitä siirtoja voit tehdä...
Voihan peliin tehdä kaksi eri asetusta, toisessa näytetään mahdolliset siirrot ja toisessa ei.
Täytyy olla kyllä todella huono pelaaja, että kohdalla olevan vuoron siirtomahdollisuuksien näyttäminen oikeasti helpottaa pelaamista. Siis, helpottaa ehkä siinä mielessä että pelaaminen voi olla marginaalisesti nopeampaa, mutta ei siinä mielessä että voisi pärjätä paremmin (ellei tosiaan ole todella amatööri)
Shakkia vähänkin harrastaneille on harvinaisen itsestäänselvää, miten eri nappulat liikkuvat. Toisaalta jos käyttäjä vasta opettelee pelin sääntöjä, mahdollisten siirtojen näyttäminen voisi olla ihan hyödyllinen ominaisuus.
Jos tavoitteena on pelkästään tehdä esimerkki siitä, miten lempikielelläsi ohjelmoidaan, ei valinnalla ole juurikaan merkitystä. Mutta jos ohjelma on tarkoitettu oikeaan käyttöön (FICS-klientti?), Macron ehdotus on varmaan paras.
Shakki ei sinänsä ole vaikea peli, siinä vain joutuu ajattelemaan vähän pidemmälle. Itse kun pelasin ensimmäisen pelini, niin vähän siinä tietenkin oli alkukankeutta. Kuitenkin eri nappuloiden siirtomahdollisuudet oppii helposti. Pelilaudalla nappuloiden siirtely on tylsää, mutta hiirellä se on miellyttävä peli.
Päädyin siihen, että valitun oman pelinappulan siirtomahdollisuuksien esittäminen pelilaudalla saa jäädä peliin.
Peli on nyt melkein valmis. Oikeastaan ainoa isompi puuttuva asia on sotilaan korotuksen toteuttaminen sen päästessä pelilaudan toiseen päähän (valinta dialogi tai jotain. Tällä hetkellä korottaa aina kuningattareksi). Toteutettuna pitäisi olla kaikki mahdolliset shakkisiirrot, mukaan lukien: en passant ja linnoittautuminen.
On sille suomenkielinenkin nimitys: ohestalyönti
Tätä keskeneräistä testi versiota voitte kokeilla. Koodi ei ole mitenkään nättiä, kommentteja melkein nolla ja sotilaan päästessä toiseen päähän korottaa aina kuningattareksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.