#include #include enum Symbolid{sNone, sRist, sRing}; enum ManguSeisud{msNone,msVoit,msViik}; enum ErrNumbrid{enNone,enKohtKinni,enValeKoht} const sArvuti = sRing; const sInimene = sRist; const true = -1; const false = 0; int TTT[3][3]; //trips-traps-trulli lahinguväli void PuhastaLahinguvali(void){ int i, j; for(i=0;i<3;i++){ for(j=0;j<3;j++){ TTT[i][j]=sNone; } } return; } void JoonistaSymbol(int Sym){ switch(Sym){ case sNone: printf(" "); break; case sRist: printf("><"); break; case sRing: printf("()"); break; } return; } void JoonistaRuudustik(void){ int i, j; system("cls"); for(i=0;i<3;i++){ for(j=0;j<3;j++){ JoonistaSymbol(TTT[i][j]); if(j<2){ printf("|"); } } printf("\n"); if(i<2){ printf("--------\n"); } } return; } int TeeNumbriks(char Chr){ return Chr - 49; } int OnNumber(char Chr){ if(Chr>=49 && Chr<=51){ return true; }else{ return false; } } int ManguSeis(void){ int i,j; // kontrollime horisontaale for(i=0;i<3;i++){ if(TTT[i][0]>sNone && TTT[i][0]==TTT[i][1] && TTT[i][0]==TTT[i][2]){ return msVoit; } } // kontrollime vertikaale for(i=0;i<3;i++){ if(TTT[0][i]>sNone && TTT[0][i]==TTT[1][i] && TTT[0][i]==TTT[2][i]){ return msVoit; } } // kontrollime diagonaale // diagonaal 1 if(TTT[0][0]>sNone && TTT[0][0]==TTT[1][1] && TTT[0][0]==TTT[2][2]){ return msVoit; } // diagonaal 2 if(TTT[0][2]>sNone && TTT[0][2]==TTT[1][1] && TTT[0][2]==TTT[2][0]){ return msVoit; } // kontrollime viiki for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(TTT[i][j]==sNone){ // kui on kasvõi üks tühi lahter, siis viiki pole return msNone; } } } // kui kõik lahtrid olid täis, siis on viik return msViik; } void Voit(int Symbol){ if(Symbol==sRist){ printf("Inimkonna võit masinate üle!\n"); }else{ printf("Arvuti v6itis sind!\nThe matrix has you...\nMUAHHAHHAHAHAHAAAA..\n"); } return; } void Viik(void){ printf("M2ng j2i viiki...\n"); return; } int VastandSymbol(int Symbol){ if(Symbol==sRist){ return sRing; }else{ return sRist; } } void KirjutaKelleKaik(int Symbol){ if(Symbol==sRist){ printf("Inimese käik.\n"); }else{ printf("Arvuti käik.\n"); } return; } void KirjutaVeateade(ErrNo){ switch(ErrNo){ case enKohtKinni: printf("Sinna kohta ei saa k2jja - see on juba kinni.\n"); break; case enValeKoht: printf("Sisestasid vale sümboli. Ainult arvud 1 kuni 3 on lubatud.\n"); printf("Sisestus olgu kujul 'xy' kus x on reanumber ja y veerunumber.\n"); break; } return; } int AILisaKolmas(int Mangija, int OtsitavSymbol){ int i,j; int SymCount,NoneCount,NonePos; // kontrollime horisontaale for(i=0;i<3;i++){ SymCount=0; NoneCount=0; //loendame tühjad ja Symboliga täidetud väljad for(j=0;j<3;j++){ if(TTT[i][j]==OtsitavSymbol){ SymCount++; } if(TTT[i][j]==sNone){ NoneCount++; NonePos = j; } } if(NoneCount == 1 && SymCount==2){ TTT[i][NonePos] = Mangija; return true; } } // kontrollime vertikaale for(i=0;i<3;i++){ SymCount=0; NoneCount=0; //loendame tühjad ja Symboliga täidetud väljad for(j=0;j<3;j++){ if(TTT[j][i]==OtsitavSymbol){ SymCount++; } if(TTT[j][i]==sNone){ NoneCount++; NonePos = j; } } if(NoneCount == 1 && SymCount==2){ TTT[NonePos][i] = Mangija; return true; } } // kontrollime diagonaale // Diagonaal 1 SymCount=0; NoneCount=0; //loendame tühjad ja Symboliga täidetud väljad for(i=0;i<3;i++){ if(TTT[i][i]==OtsitavSymbol){ SymCount++; } if(TTT[i][i]==sNone){ NoneCount++; NonePos = i; } } if(NoneCount == 1 && SymCount==2){ TTT[NonePos][NonePos] = Mangija; return true; } // Diagonaal 2 SymCount=0; NoneCount=0; //loendame tühjad ja Symboliga täidetud väljad for(i=0;i<3;i++){ if(TTT[i][2-i]==OtsitavSymbol){ SymCount++; } if(TTT[i][2-i]==sNone){ NoneCount++; NonePos = i; } } if(NoneCount == 1 && SymCount==2){ TTT[NonePos][2-NonePos] = Mangija; return true; } return false; } void AIRandom(void){ int i,j; srand(time(0)); do{ i=rand()%3; j=rand()%3; }while(TTT[i][j]>sNone); TTT[i][j] = sArvuti; return; } // Suurepärane Kunstlik Intellekt !!! Jee!!! void AI(void){ // otsime kas arvuti saab ehk juba võita if(!AILisaKolmas(sArvuti, sArvuti)){ // otsime, kas arvuti saab blokeerida inimese rünnakut if(!AILisaKolmas(sArvuti, sInimene)){ AIRandom(); } } return; } int VoitVoiViik(int Mangija){ int Seis; // leiame mängu seisu Seis = ManguSeis(); if(Seis==msVoit){ JoonistaRuudustik(); Voit(Mangija); return true; } if(Seis==msViik){ JoonistaRuudustik(); Viik(); return true; } return false; } int main(int argc, char *argv[]) { char RidaChr, VeergChr, Enter, Alustaja; int x,y; int Seis; int ErrNo=enNone; PuhastaLahinguvali(); printf("Trips-Traps-Trull\n\nHuman v/s AI\n\n"); printf("Vali, kes alustab. 1=Inimene, 2=Arvuti: "); scanf("%c%c",&Alustaja, &Enter); if(Alustaja=='2'){ AI(); } while(true){ JoonistaRuudustik(); KirjutaVeateade(ErrNo); KirjutaKelleKaik(sInimene); printf("Sisesta rida ja veerg: "); scanf("%c%c%c", &RidaChr, &VeergChr, &Enter); // kontrollime sisendi õigsust if(OnNumber(RidaChr) && OnNumber(VeergChr)){ y = TeeNumbriks(RidaChr); x = TeeNumbriks(VeergChr); // kontrollime, kas väli on tühi if(TTT[y][x]==sNone){ // kirjutame väljale TTT[y][x]=sInimene; // leiame mängu seisu if(VoitVoiViik(sInimene)){ break; } // mängu astup superintelligents AI(); if(VoitVoiViik(sArvuti)){ break; } ErrNo = enNone; }else{ ErrNo = enKohtKinni; } }else{ ErrNo = enValeKoht; } } system("PAUSE"); return 0; }