Giter Site home page Giter Site logo

shakkialy's People

Contributors

jjjjm avatar ktojala avatar nooblue avatar saskeli avatar strajama avatar

Watchers

 avatar

shakkialy's Issues

Koodikatselmointi

Koodi oli yleisesti ottaen helposti luettavaa; luokkien vastuujako oli erityisen selkeä ja kokonaisuuden toiminnasta pääsi nopeasti kärryille. Ylipäätään projektista näkee, että siihen on nähty vaivaa ja koodin laatua on mietitty.

Korjaus / parannusehdotuksia:
dokumentaatio:

  • Teen itsekin minimaxia ja itse löysin netistä sen tilavaativuudeksi O(bd), mutta toisaalta en itsekään osaa asiasta varmaksi sanoa.
  • Testausdokumentissa on kehitettävää; testaustavan kuvaus on tällä hetkellä aika ympäripyöreä.
  • Voisit mainita jossain, että itse tekemäsi osuus on pakkauksessa datastrctrproject ja loppu on kopioitua muulata.
  • Voisit selittää mikä on siirto-luokassa käytetty siirron ylennys, sekä lyhyesti en passant- ja tornitussiirrot.
  • Repon kopioija ei saa automaattisesti execute-oikeuksia, ohjeeseen voisi lisätä, että ennen ./gradlew build: a on ajettava chmod +x gradlew

koodaustapa:

  • tornin ja lähetin siirtojen hakua olisi syytä yksinkertaistaa: esim. lähetille final int[][] suunnat = {{-1,-1},{-1,1},{1,-1},{1,1}} ja for suunta in suunnat kohde = new Ruutu(getX+suunta[0], getY+suunta[1])
  • shakin alkutilaa kuvaava char[][] shakkitemplaatti voisi olla nimeltään alkutila tms
  • minimaxin implementointi voisi olla lähempänä pseudokoodia; minimaxin tunteva ymmärtäisi toiminnan helpommin. Ainakin syvyyden voisi asettaa väheneväksi niin, että minimax-puun alin taso, jossa heuristinen evaluaatio tehdään, olisi taso 0, siis kutsu aina syvyys-1.

algot:

  • Syvyyden 3 minimax ei ole vielä erityisen tehokas. Syvyysluokissa noin 7 on vielä heikko pelaaja, kymmenen toisella puolen hyvä, ja >20 maailmanluokkaa. Saisiko syvyyttä vielä nostettua jotenkin, oletko kokeillut syvempien hakujen kestoja? Itse löysin hyvää inspiraatiota täältä: https://www.youtube.com/watch?v=STjW3eH0Cik

pilkunviilausta:

  • minimax kahdella i:llä, heuristiikka i:llä ja eksponentiaalinen k:lla. Pahoittelut mutta nämä aina särähtää isosti :)

Koodikatselmointi

Hyvää työtä. Koodi näyttää oikein siistiltä ja hyvin kommentoidulta. Testejäkin on kohtuullisesti.

ArvoSiirto-nimi luokalle on ehkä vähän harhaanjohtava. Siitä tulee mieleen, että siirto arvottaisiin.

Transpositiotaulun avulla hakua voitaisiin tehostaa. Tällä hetkellä minmax-algoritmi voi päätyä laskemaan saman position arvon moneen kertaan sillä sama positio voidaan saavuttaa eri siirtosarjojen kautta. Algoritmi tehostuu, jos minmax-algoritmin alussa aina tarkistetaan onko position arvo jo laskettu.

Sellainen asia, joka voisi nopeuttaa koodin vakiokertoimia, olisi käyttää koko ajan samaa lautaa minmax-algoritmin aikana. Tällä hetkellä joka siirtoa varten rakenntaan kokonaan uusi lauta uutta siirtoa varten. Sen sijaan siirto voitaisiin tehdä jo olemassa olevalla laudalla, sitten kutsuttaisiin rekursiivisesti minmax-algoritmia ja kutsun jälkeen tehty siirto peruttaisiin. Tällöin siirron tekemiseen tarvitaan vain pari pientä operaatiota eikä tarvitse kopioida koko lautaa joka kerralla.

Alpha-beta etsinnän kannalta olisi tärkeää, että siirrot järjestettäisiin jonkin järkevän heuristiikan avulla aina ennen siirtojen kokeilemista, jotta haaroja saataisiin karsittua mahdollisimman paljon. Siirtojen järkevällä järjestämisellä on valtava vaikutus alpha-beta etsinnän tehokkuuteen.

minArvo ja maxArvo olisi mahdollista yhdistää yhdeksi metodiksi, mikä säästää koodin toisteisuutta. Tähän kävisi Negamax-algoritmi.

Heuristiikka on shakkiin ehkä vielä aika yksinkertainen. Sitä voisi ehkä vielä parantaa, vaikka toki kieltämättä shakkiin ei ole turhan helppoa keksiä hyviä heuristiikkoja, sillä esim. kuninkaan turvallisuudella on täysin eri merkitys alku- ja loppupelissä.

Jos on aikaa ja mielenkiintoa niin seuraavat kikat tunnetusti toimivat shakissa hyvin:
killer-heuristiikka eli jos jokin siirto on paras siirto jossain variaatiossa niin on todennäköistä että se on myös parassiirto jossain toisessa variaatossa.
vaihteleva laskenta syvyys:
jos juuri tehty siirto esim. lyö jonkin nappulan niin tätä laskentahaaraa kannattaa laskea vielä pikkaisen syvemmälle, sillä monesti vastustaja voi lyödä takaisin ja muuten heuristiikka antaa todella huonon arvion positiosta.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.