Hey, so now, that I started learning C++ I figured I could do a Tic Tac Toe game. So this is my code (i'm a newbie so be harsh on me):
Dont mind the language, it's my native, i'm sure you will be able to dechiphyr what does the code do. So I would like to hear your opinions (good or bad). And about the AI, i sure hope there is an alghoritm for turn-based games because i cant imagine programming all the possible solutions for games like chess or connect four.Code:// Krizec Krozec (c) Zunone, 2007 #include "stdafx.h" #include <iostream> #include <string> #include <ctime> #include <cstdlib> using namespace std; // Konstante spreminjanjoce se mreze in char array le te const int S_MREZA = 3; char mreza[S_MREZA][S_MREZA] = { {' ',' ',' ',}, {' ',' ',' ',}, {' ',' ',' ',} }; // Konstante oblike mreze const int O_MREZA = 7; //Prva poteza bool prvaPoteza; // Izris mreze za igranje string izris() { string sMreza = ""; // For loop za izris preproste mreze for (int i = 0;i < O_MREZA;i++) { if (i == 0) sMreza = sMreza + " 0 1 2\n -------\n"; if (i == (O_MREZA - 1) ||i == 2 || i == 4) sMreza = sMreza + " -------\n"; if (i == 1) sMreza = sMreza + "0" + " |" + mreza[0][0] + "|" + mreza[0][1] + "|" + mreza[0][2] + "|\n"; if (i == 3) sMreza = sMreza + "1" + " |" + mreza[1][0] + "|" + mreza[1][1] + "|" + mreza[1][2] + "|\n"; if (i == 5) sMreza = sMreza + "2" + " |" + mreza[2][0] + "|" + mreza[2][1] + "|" + mreza[2][2] + "|\n"; } return sMreza; } // Funkcija s katero preverjamo zmago int preveriZmago() { //-------------------------X----------------------------- // Kombinacije, ki so mozne za navpicno zmago. if (mreza[0][0] == 'X' && mreza[0][1] == 'X' && mreza[0][2] == 'X') return 37; if (mreza[1][0] == 'X' && mreza[1][1] == 'X' && mreza[1][2] == 'X') return 37; if (mreza[2][0] == 'X' && mreza[2][1] == 'X' && mreza[2][2] == 'X') return 37; // Kombinacije, ki so mozne za vodoravno zmago if (mreza[0][0] == 'X' && mreza[1][0] == 'X' && mreza[2][0] == 'X') return 37; if (mreza[0][1] == 'X' && mreza[1][1] == 'X' && mreza[2][1] == 'X') return 37; if (mreza[0][2] == 'X' && mreza[1][2] == 'X' && mreza[2][2] == 'X') return 37; // Kombinacije, ki so mozne za krizno zmago if (mreza[0][0] == 'X' && mreza[1][1] == 'X' && mreza[2][2] == 'X') return 37; if (mreza[2][0] == 'X' && mreza[1][1] == 'X' && mreza[0][2] == 'X') return 37; //-------------------------O----------------------------- // Kombinacije, ki so mozne za navpicno zmago. if (mreza[0][0] == 'O' && mreza[0][1] == 'O' && mreza[0][2] == 'O') return 5; if (mreza[1][0] == 'O' && mreza[1][1] == 'O' && mreza[1][2] == 'O') return 5; if (mreza[2][0] == 'O' && mreza[2][1] == 'O' && mreza[2][2] == 'O') return 5; // Kombinacije, ki so mozne za vodoravno zmago if (mreza[0][0] == 'O' && mreza[1][0] == 'O' && mreza[2][0] == 'O') return 5; if (mreza[0][1] == 'O' && mreza[1][1] == 'O' && mreza[2][1] == 'O') return 5; if (mreza[0][2] == 'O' && mreza[1][2] == 'O' && mreza[2][2] == 'O') return 5; // Kombinacije, ki so mozne za krizno zmago if (mreza[0][0] == 'O' && mreza[1][1] == 'O' && mreza[2][2] == 'O') return 5; if (mreza[2][0] == 'O' && mreza[1][1] == 'O' && mreza[0][2] == 'O') return 5; return 8; } // Reset funkcija za resetiranje mreze (priprava na novo igro) void reset() { for (int i = 0;i < S_MREZA;i++) { for (int j = 0; j < S_MREZA;j++) { mreza[i][j] = ' '; } } system("cls"); } // Funkcija, ki preverja, ce je rezultat neodlocen bool neodloceno() { int rowr = 0; for (int i = 0;i < S_MREZA;i++) { for (int j = 0; j < S_MREZA;j++) { if (mreza[i][j] != ' ') rowr++; } } if (rowr == 9) return true; return false; } // Koliko dolgo bo racunalnik razmisljal void razmisljaj(unsigned int sec) { clock_t cilj = (sec*1000) + clock(); while (cilj > clock()); } // Funkcija s katero racunalnik ovrednoti poteze int racOvrednoti() { //1. Prva poteza if (prvaPoteza) { srand(time(0)); int randNum = (rand() % 5); switch (randNum) { case 0: if (mreza[1][1] == ' ') { mreza[1][1] = 'O'; return 0; } case 1: if (mreza[0][0] == ' ') { mreza[0][0] = 'O'; return 0; } case 2: if (mreza[2][2] == ' ') { mreza[2][2] = 'O'; return 0; } case 3: if (mreza[0][2] == ' ') { mreza[0][2] = 'O'; return 0; } case 4: if (mreza[2][0] == ' ') { mreza[2][0] = 'O'; return 0; } } return 0; } //24 napadalnih potez // Vodoravno if (mreza[0][0] == 'O' && mreza[0][1] == 'O' && mreza[0][2] == ' ') mreza[0][2] = 'O'; else if (mreza[0][0] == 'O' && mreza[0][1] == ' ' && mreza[0][2] == 'O') mreza[0][1] = 'O'; else if (mreza[0][0] == ' ' && mreza[0][1] == 'O' && mreza[0][2] == 'O') mreza[0][0] = 'O'; else if (mreza[1][0] == 'O' && mreza[1][1] == ' ' && mreza[1][2] == 'O') mreza[1][1] = 'O'; else if (mreza[1][0] == 'O' && mreza[1][1] == 'O' && mreza[1][2] == ' ') mreza[1][2] = 'O'; else if (mreza[1][0] == ' ' && mreza[1][1] == 'O' && mreza[1][2] == 'O') mreza[1][0] = 'O'; else if (mreza[2][0] == ' ' && mreza[2][1] == 'O' && mreza[2][2] == 'O') mreza[2][0] = 'O'; else if (mreza[2][0] == 'O' && mreza[2][1] == ' ' && mreza[2][2] == 'O') mreza[2][1] = 'O'; else if (mreza[2][0] == 'O' && mreza[2][1] == 'O' && mreza[2][2] == ' ') mreza[2][2] = 'O'; // Navpicno else if (mreza[0][0] == 'O' && mreza[1][0] == ' ' && mreza[2][0] == 'O') mreza[1][0] = 'O'; else if (mreza[0][0] == 'O' && mreza[1][0] == 'O' && mreza[2][0] == ' ') mreza[2][0] = 'O'; else if (mreza[0][0] == ' ' && mreza[1][0] == 'O' && mreza[2][0] == 'O') mreza[0][0] = 'O'; else if (mreza[0][1] == 'O' && mreza[1][1] == ' ' && mreza[2][1] == 'O') mreza[1][1] = 'O'; else if (mreza[0][1] == ' ' && mreza[1][1] == 'O' && mreza[2][1] == 'O') mreza[0][1] = 'O'; else if (mreza[0][1] == 'O' && mreza[1][1] == 'O' && mreza[2][1] == ' ') mreza[2][1] = 'O'; else if (mreza[0][2] == 'O' && mreza[1][2] == 'O' && mreza[2][2] == ' ') mreza[2][2] = 'O'; else if (mreza[0][2] == 'O' && mreza[1][2] == ' ' && mreza[2][2] == 'O') mreza[1][2] = 'O'; else if (mreza[0][2] == ' ' && mreza[1][2] == 'O' && mreza[2][2] == 'O') mreza[0][2] = 'O'; //Krizno else if (mreza[0][0] == ' ' && mreza[1][1] == 'O' && mreza[2][2] == 'O') mreza[0][0] = 'O'; else if (mreza[0][0] == 'O' && mreza[1][1] == ' ' && mreza[2][2] == 'O') mreza[1][1] = 'O'; else if (mreza[0][0] == 'O' && mreza[1][1] == 'O' && mreza[2][2] == ' ') mreza[2][2] = 'O'; else if (mreza[2][0] == ' ' && mreza[1][1] == 'O' && mreza[0][2] == 'O') mreza[2][0] = 'O'; else if (mreza[2][0] == 'O' && mreza[1][1] == ' ' && mreza[0][2] == 'O') mreza[1][1] = 'O'; else if (mreza[2][0] == 'O' && mreza[1][1] == 'O' && mreza[0][2] == ' ') mreza[0][2] = 'O'; //24 obrambnih potez // Vodoravno else if (mreza[0][0] == 'X' && mreza[0][1] == 'X' && mreza[0][2] == ' ') mreza[0][2] = 'O'; else if (mreza[0][0] == 'X' && mreza[0][1] == ' ' && mreza[0][2] == 'X') mreza[0][1] = 'O'; else if (mreza[0][0] == ' ' && mreza[0][1] == 'X' && mreza[0][2] == 'X') mreza[0][0] = 'O'; else if (mreza[1][0] == 'X' && mreza[1][1] == ' ' && mreza[1][2] == 'X') mreza[1][1] = 'O'; else if (mreza[1][0] == 'X' && mreza[1][1] == 'X' && mreza[1][2] == ' ') mreza[1][2] = 'O'; else if (mreza[1][0] == ' ' && mreza[1][1] == 'X' && mreza[1][2] == 'X') mreza[1][0] = 'O'; else if (mreza[2][0] == ' ' && mreza[2][1] == 'X' && mreza[2][2] == 'X') mreza[2][0] = 'O'; else if (mreza[2][0] == 'X' && mreza[2][1] == ' ' && mreza[2][2] == 'X') mreza[2][1] = 'O'; else if (mreza[2][0] == 'X' && mreza[2][1] == 'X' && mreza[2][2] == ' ') mreza[2][2] = 'O'; // Navpicno else if (mreza[0][0] == 'X' && mreza[1][0] == ' ' && mreza[2][0] == 'X') mreza[1][0] = 'O'; else if (mreza[0][0] == 'X' && mreza[1][0] == 'X' && mreza[2][0] == ' ') mreza[2][0] = 'O'; else if (mreza[0][0] == ' ' && mreza[1][0] == 'X' && mreza[2][0] == 'X') mreza[0][0] = 'O'; else if (mreza[0][1] == 'X' && mreza[1][1] == ' ' && mreza[2][1] == 'X') mreza[1][1] = 'O'; else if (mreza[0][1] == ' ' && mreza[1][1] == 'X' && mreza[2][1] == 'X') mreza[0][1] = 'O'; else if (mreza[0][1] == 'X' && mreza[1][1] == 'X' && mreza[2][1] == ' ') mreza[2][1] = 'O'; else if (mreza[0][2] == 'X' && mreza[1][2] == 'X' && mreza[2][2] == ' ') mreza[2][2] = 'O'; else if (mreza[0][2] == 'X' && mreza[1][2] == ' ' && mreza[2][2] == 'X') mreza[1][2] = 'O'; else if (mreza[0][2] == ' ' && mreza[1][2] == 'X' && mreza[2][2] == 'X') mreza[0][2] = 'O'; //Krizno else if (mreza[0][0] == ' ' && mreza[1][1] == 'X' && mreza[2][2] == 'X') mreza[0][0] = 'O'; else if (mreza[0][0] == 'X' && mreza[1][1] == ' ' && mreza[2][2] == 'X') mreza[1][1] = 'O'; else if (mreza[0][0] == 'X' && mreza[1][1] == 'X' && mreza[2][2] == ' ') mreza[2][2] = 'O'; else if (mreza[2][0] == ' ' && mreza[1][1] == 'X' && mreza[0][2] == 'X') mreza[2][0] = 'O'; else if (mreza[2][0] == 'X' && mreza[1][1] == ' ' && mreza[0][2] == 'X') mreza[1][1] = 'O'; else if (mreza[2][0] == 'X' && mreza[1][1] == 'X' && mreza[0][2] == ' ') mreza[0][2] = 'O'; else { for (int i = 0; i < 3; i++){ for (int j = 0; j < 3; j++) { if (i == 0 && j == 0) { if (mreza[i][j] == ' ' && mreza[i+1][j+1] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i+1][j+1] == ' ') { mreza[i+1][j+1] = 'O'; return 0; } } if (i == 0) { if (mreza[i][j] == ' ' && mreza[i+1][j] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i+1][j] == ' ') { mreza[i+1][j] = 'O'; return 0; } } if (j == 0) { if (mreza[i][j] == ' ' && mreza[i][j+1] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i][j+1] == ' ') { mreza[i][j+1] = 'O'; return 0; } } if (i == 2 && j == 2) { if (mreza[i][j] == ' ' && mreza[i-1][j-1] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i-1][j-1] == ' ') { mreza[i-1][j-1] = 'O'; return 0; } } if (i == 2) { if (mreza[i][j] == ' ' && mreza[i-1][j] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i-1][j] == ' ') { mreza[i-1][j] = 'O'; return 0; } } if (j == 2) { if (mreza[i][j] == ' ' && mreza[i][j-1] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i][j-1] == ' ') { mreza[i][j-1] = 'O'; return 0; } } if (mreza[i][j] == ' ' && mreza[i+1][j+1] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i+1][j+1] == ' ') { mreza[i+1][j+1] = 'O'; return 0; } if (mreza[i][j] == ' ' && mreza[i-1][j-1] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i-1][j-1] == ' ') { mreza[i-1][j-1] = 'O'; return 0; } if (mreza[i][j] == ' ' && mreza[i][j-1] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i][j-1] == ' ') { mreza[i][j-1] = 'O'; return 0; } if (mreza[i][j] == ' ' && mreza[i-1][j] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i-1][j] == ' ') { mreza[i-1][j] = 'O'; return 0; } if (mreza[i][j] == ' ' && mreza[i][j+1] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i][j+1] == ' ') { mreza[i][j+1] = 'O'; return 0; } if (mreza[i][j] == ' ' && mreza[i+1][j] == 'O') { mreza[i][j] = 'O'; return 0; } if (mreza[i][j] == 'O' && mreza[i+1][j] == ' ') { mreza[i+1][j] = 'O'; return 0; } } } } return 0; } // Main funkcija z "game" loopom int main() { int stolpec = 0; int vrstica = 0; // Prvi game loop, ki omogoca ponavljanje igre while (true) { //Prva poteza prvaPoteza = true; cout << izris(); // Drugi game loop s katerim zacnemo igro while (true) { if (preveriZmago() == 37) { cout << "Zmagal si, cestitam!" << endl << endl; break; } if (preveriZmago() == 5) { cout << "Zal si izgubil. Poiskusi se enkrat!" << endl; break; } if (neodloceno()) { cout << "Bilo je neodloceno. Poiskusi se enkrat!" << endl; break; } cout << "Vpisi stolpec polja: "; cin >> stolpec; cout << endl << "Vpisi vrstico polja: "; cin >> vrstica; if (stolpec > (S_MREZA - 1) || vrstica > (S_MREZA - 1)) { cout << "To polje ne obstaja." << endl; continue; } if (mreza[vrstica][stolpec] != ' ') { cout << endl << "Ups, to polje je ze zasedeno." << endl << endl; continue; } else { mreza[vrstica][stolpec] = 'X'; system("cls"); cout << izris(); } if (preveriZmago() == 37) { cout << "Zmagal si, cestitam!" << endl << endl; break; } if (preveriZmago() == 5) { cout << "Zal si izgubil. Poiskusi se enkrat!" << endl; break; } if (neodloceno()) { cout << "Bilo je neodloceno. Poiskusi se enkrat!" << endl; break; } cout << endl << "Zdaj je na potezi racunalnik.." << endl; razmisljaj(3); racOvrednoti(); prvaPoteza = false; system("cls"); cout << izris(); } char izbira = 'n'; cout << "Bi odigral se eno igro? (d/n) "; cin >> izbira; if (izbira == 'd') { reset(); cout << endl; continue; } else { cout << "Adios." << endl; break; } } return 0; }
Thank you.
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks