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.