+ Reply to Thread
Results 1 to 2 of 2

Thread: A simple TicTacToe game

  1. #1
    Newbie Zunone is an unknown quantity at this point
    Join Date
    Aug 2007
    Posts
    2

    A simple TicTacToe game

    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):

    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;
    }
    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.

    Thank you.

  2. #2
    Super Moderator WingedPanther has much to be proud of WingedPanther has much to be proud of WingedPanther has much to be proud of WingedPanther has much to be proud of WingedPanther has much to be proud of WingedPanther has much to be proud of WingedPanther has much to be proud of WingedPanther has much to be proud of WingedPanther has much to be proud of WingedPanther's Avatar
    Join Date
    Jul 2006
    Age
    36
    Posts
    11,687
    Blog Entries
    57
    There is another thread about Tic-Tac-Toe. Check it out here and here.
    CodeCall Blog | CodeCall Wiki | Shareware
    Programming is a branch of mathematics.
    My CodeCall Blog | My Personal Blog

+ Reply to Thread

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

     

Similar Threads

  1. need help with simple C++ TicTacToe game with AI
    By flupke1 in forum C and C++
    Replies: 11
    Last Post: 08-14-2007, 10:27 AM
  2. Replies: 1
    Last Post: 07-19-2007, 06:46 AM
  3. Paying for Links
    By Chan in forum Marketing
    Replies: 26
    Last Post: 05-02-2007, 08:37 PM

Bookmarks

Bookmarks

     
        Algorithms and Data Structures

        Java tutorials

        Algorithms Forum

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts