nakkekakke / rummy-ai Goto Github PK
View Code? Open in Web Editor NEWText based classic Rummy game with an AI that uses ISMCTS. Data Structures and Algorithms course project, University of Helsinki
License: MIT License
Text based classic Rummy game with an AI that uses ISMCTS. Data Structures and Algorithms course project, University of Helsinki
License: MIT License
Mielenkiintoinen aihe ja erittäin pätevä toteutus!
Määrittelydokumentti oli selkeä ja kattava. Suorituksen aikaiset konsolikäyttöliittymän ohjeet olivat myös hyvät.
PvP-pelistä oli tosin ohje, että ei kannata yrittää, mutta se vaikutti pikaisella testauksella kuitenkin toimivan.
Tekoälyn "ajatteluajan" vois tarkentaa tarkoittavan (ymmärtääkseni) sitä lukumäärää, montako kertaa ISMCTS-algoritmi suorittaa vuorolla, montako simulaatiota pelin tilanteesta ja päätöstä parhaalta vaikuttavista siirroista tehdään tms. Ennen koodin tarkastelua ajattelin, että aika tarkoittaa varmaan esim. millisekunteja.
Koodi on selkeää: muuttujat ja metodit on hyvin nimetty, ja vastuualueet eroteltu pääosin hyvin eri luokille ja metodeille. State-luokan findPossibleMelds() kohdalla voisi päätellä pituuden lisäksi myös metodin sisäisen kommentoinnin määrästä, että sitä voisi refaktoroida useammaksi metodiksi.
Kommentoitua debug-loggailu-koodia löytyy hieman luokista PlayGame ja ISMCTS. Mikäli loggailua vielä todennäköisesti tarvitaan, niin ei siinä mitään. Pisteet siitäkin, että mitän muuta mahdollisesti ylimääräistä en löytänytkään.
PvP-pelin logiikan voisi myös refaktoroida AIvsAI-pelin tavoin omaksi luokakseen. Layoff-loopin sisällä myös sisennyksen syvyys kasvaa aika suureksi.
Hakemistorakenne on pääosin erinomainen, mutta siltä osin vähän hankala, että pääohjelmaa ei ole sijoitettu ja nimetty kaikkein tavanomaisemmin. Voisi myös ehkä harkita, tarvitaanko sekä game-, että ui-kansiot, vai voisiko niiden sisältämät luokat laittaa saman hakemiston alle.
Mukavaa loppukurssia!
Date: 25.8. 11:22
Player luokassa on toinen konstruktori cloonaamista varten, mikä on ihan ok. Tietääkseni olisi kuitenkin mahdollista overridata clone metodi luokalle. Clone metodin käyttö olisi ehkä intuitiivisempi ja tutumpi koodatessa.
RunMeld ja SetMeld luokissa metodi layoff vaatii oikein toimiakseen että layOffAllowed metodia käytetään ensin tarkistamiseen. Tässä tapauksessa layoff metodi voisi ihan hyvin käyttää sitä sisäisesti, sillä ei pitäisi olla mitään tilannetta missä kyseinen toiminnallisuus ei olisi haluttua.
RunMeld ja SetMeld luokissa on melkein copioitu copy metodi. Vaihtoehtoisesti voisi pistää Meld superclassiin copyCards metodin, johon laittaa copy paste koodi, ja laittaa copy metodiin vain jäljellä oleva yksi rivi. Toisaalta metodi on muutenkin vain 3 riviä, joten muokkaaminen voisi olla turhaa.
Luokan tekeminen jokaiselle erilliselle siirrolle vaikuttaa hieman oudolta. En ole täysin varma miksi juuri näin on tehty, ehkä siirtojen vertaamiseen toisiinsa, mutta luulisi olevan mahdollista yhdistää erilliset siirto luokat yhteen yksittäiseen luokkaan. Tällainen muutos johtaisi ainakin omasta mielestäni puhtaampaan koodiin.
Kyseisen luokan metodi run on erittäin pitkä. Vaikka lisätyt kommentit auttavat koodin luettavuudessa, olisi kyseisen metodin refaktorointi useampaan pienempään metodiin merkittävä parannus.
Hieman outoa että peliä pelatessa ei ole Player vs AI vaihtoehtoa. Ilman tätä vaihtoehtoa on vaikea saada kunnollista tuntumaa siihen miten AI toimii käytännössä, varsinkin kun AI vs AI versio on hyvin epäselvä.
Huomasin että jossain kohdissa koodia oli suhteellisen pitkiä rivejä koodia, joita olisi voinut jakaa useammille riveille. Tämä auttaisi koodin lukemista myöhemmin.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.