Closed Thread
Results 1 to 2 of 2

Thread: A simple TicTacToe game

  1. #1
    Zunone is offline Newbie
    Join Date
    Aug 2007
    Posts
    2
    Rep Power
    0

    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. CODECALL Circuit advertisement
    Join Date
    Always
    Posts
    Many

     
  3. #2
    Join Date
    Jul 2006
    Posts
    16,466
    Blog Entries
    74
    Rep Power
    143
    There is another thread about Tic-Tac-Toe. Check it out here and here.
    Programming is a branch of mathematics.
    My CodeCall Blog | My Personal Blog

Closed 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 : Very simple C# game
    By static21 in forum C# Programming
    Replies: 5
    Last Post: 10-29-2010, 09:54 AM
  2. need help with simple C++ TicTacToe game with AI
    By flupke1 in forum C and C++
    Replies: 13
    Last Post: 05-30-2010, 10:25 AM
  3. C++ Simple Game.
    By united07 in forum C and C++
    Replies: 2
    Last Post: 05-04-2010, 11:49 AM
  4. Help with a simple game.
    By Ascension in forum C# Programming
    Replies: 3
    Last Post: 03-10-2009, 06:06 PM
  5. just a simple guessing game
    By deryni in forum C and C++
    Replies: 2
    Last Post: 12-13-2008, 03:57 PM

Tags for this Thread

Bookmarks

Posting Permissions

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