loeppoe / tira-labra

0 stars 0 forks source link

Tira vertaisarvointi #2

Open Kissaniemi opened 2 months ago

Kissaniemi commented 2 months ago

Gomoku oli itselleni uusi peli, mutta koitin soveltaa neljän suoran sääntöjä miettiessäni miten koodia voisi parannella (joten jos jokin tässä sanomani ei olekaan hyvä idea tämän pelin kannalta niin pahoitteluni).

Pelipohja toimii (ehkä voisi muokata virhekäsittelyä, jos pelaaja antaa muun kuin int tyypin tai luvun joka on pienempi kuin 0 tai isompi kuin 18 syötteeksi), algoritmi itsessään on vielä vain hidas ja tekoälyllä menee pitkään (päälle minuutti tai kaksi) tehdä siirto kun syvyys on 2. Muita funktioita tehostamalla minmax funktion toiminta pitäisi nopeutua, jolloin myös sen etsintä syvyyttä päästään nostamaan.

Koodin nopeuteen löytyy yksi apu, kun score_lines funktioon laitetaan ehto if board[i][j] == 1 or board[i][j] == 2: ennen kuin lähdetään turhaan käymään jokaista laudan tyhjää kohtaa läpi.

Tekoäly ei tehnyt parasta mahdollista siirtoa ja esim. ei huomaa blokata pelaajan kolmen suoraa, vaan vasta pelaajan neljän suoran toisen pään, jolloin pelaaja pääsee voittamaan seuraavalla siirrolla. Evaluate_pattern funktion pisteiden muutos voisi auttaa tässä, eli arvotetaan vastustajan kolmen suorat suuremmiksi. Esimerkiksi opponent_patternsin # Live four voisi antaa jonkun huomattavasti isomman arvon, sillä jos pelaajalla on neljän suora ja molemmissa sen päissä vapaat paikat, niin tämähän on silloin jo voittanut, koska viiden suoraa ei pystytä enää blokkaamaan. Samalla myös vastustajan kolmen suorien pisteitä voisi nostaa, koska silloin on viimeinen mahdollisuus blokata ennen varmaa häviötä.

Tekoäly heitti ekan x:n jälkeen toista x:ää muualle, mutta tähän auttoi kun valuate_lines funktioon lisää pisteytyksiä myös kahden suorille.

Siirtojen generoinnissa voisi olla hyvä keskittyä ensisijaisesti keskikohdan lähellä oleviin siirtoihin ja käydä niiden minmax:it läpi. Laidalle tulevat siirrot olisivat todennäköisesti huonompia ja karsiutuisivat muutenkin pois, joten säästetään aikaa kun ei aloiteta niistä käymään läpi.

Funktio is_winning_move näyttäisi käyvän läpi koko pelilaudan voittoa tarkistaessa, mikä vie paljon aikaa, kun se käy läpi joka kerralla koko laudan. Tätä voisi rajata tarkistamaan vain edellinen siirto.

Hyvä aloitus, funktioita tehostamalla saa varmasti toimivan algoritmin!