Olen aivan aloittelija tässä ohjelmointijutussa. Tein ohjelman, jolla voi pelata ristinollaa konetta vastaan. Laudan muodostin tyyliin char[3][3]. Aluksi tein tietokoneen siirrot satunnaisiksi, mutta koska sitä vastaan oli tylsä pelata, ajattelin lisätä hieman tekoalyä. Kaikkien mahdollisten variaatioiden kirjoittaminen on niin suuritöistä, että ajattelin että helpompikin tapa saattaisi löytyä.
Eli saanko jotenkin tietokoneen pelaamaan kahden peräkkäisen saman merkin perään siirron, ilman että kirjoitan kaikki mahdolliset variaatiot, missä tällainen tilanne on mahdollinen?
Eli saanko jotenkin tietokoneen pelaamaan kahden peräkkäisen saman merkin perään siirron, ilman että kirjoitan kaikki mahdolliset variaatiot, missä tällainen tilanne on mahdollinen?
Vastaukset 2
Vanhimmat
Noin yksinkertaisen pelilaudan ollessa kyseessä on mahdollista luoda täydellinen tekoäly, joka ei voi hävitä.
Yksinkertainen tekoäly voisi ensi vaiheessa tarkistaa onko vastustajalla jossain voittosuoraa tulossa, eli kaksi samalla suoralla ja tyhjä keskellä. Tuohon voi tehdä vaikka kolme metodia, joista yksi tarkistaa kaikki rivit, yksi sarakkeet ja yksi vinot suorat.
esim:
int tarkistaRivi(const char taulu[3][3], char merkki) {
for (int y = 0; y < 3; y ) {
int tulos = 0;
for (int x = 0; x < 3; x ) {
if (taulu[y][x] == merkki) tulos ;
}
if (tulos == 2) return y;
}
return 0;
}
Jos joku näistä funktioista löytää tällaisen paikan niin siirto tehdään sen mukaan, muuten voidaan käyttää vaikka satunnaisuutta koska voittamaton ristinollakin on aika tylsä :)
Merkitään O_n on sellaisten rivien, sarakkeiden ja diagonaalien määrä, joilla on n kappaletta ympyröitä. Vastaavasti X_n sellaisille joissa on n kappaletta ristejä. Laske jokaiselle ruudulle (siirtovaihtoehdolle) "hyvyys" kaavalla
3*X_2 X_1 - ( 3*O_2 O_1) ja piirrä seuraava rasti sellaiseen kohtaan missä saat suurimman arvon.
En tiedä miten toimii käytännössä, mutta olen kiinnostunut kuulemaan miten kävi :) (kyseinen kaava on vanhoista tekoälykurssin laskuharjoitustehtävistä poimittu).