1. ## Tic-Tac-Toe-HELP!!!!

Does anyone have a Tic-Tac-Toe program? I am currently working on a game in C++ where I have to code using both the MINIMAX and the alpha-beta algorithms, and am having problems figuring it out.

HELP

Tesita

2. I am also in the middle of a Tic Tac Toe game. I don't know what you mean by MINIMAX and alpha beta algorithms. I am currently using a 2 dimensional array. I recently learned how to pass a 2d array to a function so I will probably start using functions instead of just loops and straight up main function.

Ryan

3. ## Tic-Tac-Toe-HELP

I am working on an artificial intelligence course where I have to write a program that simulates a tic-tac-toe game. The program has to devise an evaluation function that can be used to evaluate the state of the game board each time a move has to be made. I have already implemented the game board as a 3x3 array but its the actual game play itself that I am having problems coding.

Remember, at the end of the day I should be able to play a game against the program itself.

Hope this clarifies

Tesita

4. here is my version just finished tonight have not worked out all bugs cause haven't had any but anyways if I was to do AI I would just have it do a random number between 1 and 9 until it finds a place it can go. If it finds 2 0's in a row (if that is what the AI is) then it will try to place in the next spot. If it finds 2 X's then it will block.

#include <iostream.h>
#include <windows.h>
#include "checktack.h"

int getgrid(int gridnum);
char winner(char grid[][12], int MAXCOL);

void main()
{
const int MAXCOL = 12;
const int MAXROW = 12;
const char filled[] = "You can't go here it is already filled";
char grid[MAXCOL][MAXROW];
int fplayer;
int gridnum = 0;

for(int i = 0; i < MAXROW; ++i)
{
for(int j = 0; j < MAXCOL; ++j)
{
grid[j][i] = ' ';
}
}

for(int k = 0; k < MAXROW; ++k)
{
grid[11][k] = '\n';
}

MessageBox(0, "Tic Tac Toe V5.130ash", "Tic Tac Toe", MB_OK);

do
{
cout << "Who goes first 1 for X and 2 for 0: \n";
cin >> fplayer;
if(fplayer > 2 || fplayer < 1)
{
MessageBox(0, "Pretty Smart Using A Window For Errors Oh And It Wasn't Between 1 and 2 ", "Your Stupid", MB_OK || MB_ICONWARNING);
}
}
while(fplayer > 2 || fplayer < 1);

do
{

gridnum = getgrid(gridnum);
if(fplayer == 1)
{
if(gridnum == 1)
{
CHECKTACKX(1,1);
}
if(gridnum == 2)
{
CHECKTACKX(5, 1);
}

if(gridnum == 3)
{
CHECKTACKX(9, 1);
}
if(gridnum == 4)
{
CHECKTACKX(1, 5);
}
if(gridnum == 5)
{
CHECKTACKX(5, 5);
}
if(gridnum == 6)
{
CHECKTACKX(9, 5);
}
if(gridnum == 7)
{
CHECKTACKX(1, 9);
}
if(gridnum == 8)
{
CHECKTACKX(5, 9);
}
if(gridnum == 9)
{
CHECKTACKX(9, 9);
}
}

else if(fplayer == 2)
{
if(gridnum == 1)
{
CHECKTACKO(1, 1);
}
if(gridnum == 2)
{
CHECKTACKO(5, 1);
}

if(gridnum == 3)
{
CHECKTACKO(9, 1);
}
if(gridnum == 4)
{
CHECKTACKO(1, 5);
}
if(gridnum == 5)
{
CHECKTACKO(5, 5);
}
if(gridnum == 6)
{
CHECKTACKO(9, 5);
}
if(gridnum == 7)
{

CHECKTACKO(1, 9);
}
if(gridnum == 8)
{
CHECKTACKO(5, 9);
}
if(gridnum == 9)
{
CHECKTACKO(9, 9);
}
}

for( i = 0; i < MAXROW; ++i)
{
for(int j = 0; j < MAXCOL; ++j)
{
cout << grid[j][i];
}
}

}while(winner(grid, MAXCOL));

}

int getgrid(int gridnum)
{
do
{
cout << "What grid number would you like to go in 1 - 9\n";
cin >> gridnum;
if(gridnum > 9 || gridnum < 1)
{
MessageBox(0, "Pretty Smart Using A Window For Errors Oh And It Wasn't Between 1 and 9 ", "Your Stupid", MB_OK || MB_ICONWARNING);
}
}
while(gridnum > 9 || gridnum < 1);
return gridnum;
}

char winner(char grid[][12], int MAXCOL)
{
grid[MAXCOL][12];

if((grid[1][1] == 'X' && grid[5][1] == 'X' && grid[9][1] == 'X') ||
(grid[1][5] == 'X' && grid[5][5] == 'X' && grid[9][5] == 'X') ||
(grid[1][9] == 'X' && grid[5][9] == 'X' && grid[9][9] == 'X') ||
(grid[1][1] == 'X' && grid[1][5] == 'X' && grid[1][9] == 'X') ||
(grid[5][1] == 'X' && grid[5][5] == 'X' && grid[5][9] == 'X') ||
(grid[9][1] == 'X' && grid[9][5] == 'X' && grid[9][9] == 'X') ||
(grid[1][1] == 'X' && grid[5][5] == 'X' && grid[9][9] == 'X') ||
(grid[9][1] == 'X' && grid[5][5] == 'X' && grid[1][9] == 'X'))
{
cout << "X wins ";
cin >> grid[0][0];
return 0;
}
if((grid[1][1] == 'O' && grid[5][1] == 'O' && grid[9][1] == 'O') ||
(grid[1][5] == 'O' && grid[5][5] == 'O' && grid[9][5] == 'O') ||
(grid[1][9] == 'O' && grid[5][9] == 'O' && grid[9][9] == 'O') ||
(grid[1][1] == 'O' && grid[1][5] == 'O' && grid[1][9] == 'O') ||
(grid[5][1] == 'O' && grid[5][5] == 'O' && grid[5][9] == 'O') ||
(grid[9][1] == 'O' && grid[9][5] == 'O' && grid[9][9] == 'O') ||
(grid[1][1] == 'O' && grid[5][5] == 'O' && grid[9][9] == 'O') ||
(grid[9][1] == 'O' && grid[5][5] == 'O' && grid[1][9] == 'O'))
{
cout << "O wins ";
cin >> grid[0][0];
return 0;
}
}

here is the header file checktack.h

#include <iostream.h>

#ifndef __CHECKTACK_H__
#define __CHECKTACK_H__

#define CHECKTACKX(a, b)\
if(grid[a][b] == ' ') \
{ \
grid[a][b] = 'X'; \
fplayer += 1;\
}\
else \
{\
cout << filled << '\n'; \
continue;\
}\

#define CHECKTACKO(a, b)\
if(grid[a][b] == ' ') \
{ \
grid[a][b] = 'O'; \
fplayer -= 1;\
}\
else \
{\
cout << filled << '\n'; \
continue;\
}\

#endif

5. No offense, but your Tic tac toe seems overly complicated.. here's mine.

Code:
```#include <iostream.h>
#include <windows.h>
#include <conio.h>

typedef unsigned short int USHORT;
char board[3][3];
char playername1[25];
char playername2[25];
const char player1 = 'x';
const char player2 = 'o';
char playerup = 'x';
const char blankchar = '-';
USHORT i, ii, x, y, moves, move;

void table(void);
int init(void);
int getInput(char player);
int setInput(char player);
USHORT checkWin(char playerup);

int main ()
{

init();
system("CLS");
table();
do
{
if (moves < 9)
{
getInput(playerup);
while (setInput(playerup))
{
getInput(playerup);
}
system("CLS");
table();
if (playerup == 'o')
{
playerup = 'x';
} else {
playerup = 'o';
}
} else {
cout << "\n\tNo winner this time, thanks for playing\n\n\n\t";
//system("PAUSE");
_getch();
return 0;
}
} while (checkWin(playerup) == 2);
if (playerup == 'x')
{
cout << "\n\tCongratulations " << playername2 << ", you've won!\n\n\n\t";
//system("PAUSE");
_getch();
return 0;
} else {
cout << "\n\tCongratulations " << playername1 << ", you've won!\n\n\n\t";
//system("PAUSE");
_getch();
return 0;
}
}

USHORT checkWin(char playerup)
{
if (playerup == 'x')
{

if (board[0][0] == board[0][1] && board[0][1] == board[0][2] && board[0][2] != blankchar)
{
return 0;
}
if (board[1][0] == board[1][1] && board[1][1] == board[1][2] && board[1][2] != blankchar)
{
return 0;
}
if (board[2][0] == board[2][1] && board[2][1] == board[2][2] && board[2][2] != blankchar)
{
return 0;
}
//CHECK COLUMNS
if (board[0][0] == board[1][0] && board[1][0] == board[2][0] && board[2][0] != blankchar)
{
return 0;
}
if (board[0][1] == board[1][1] && board[1][1] == board[2][1] && board[2][1] != blankchar)
{
return 0;
}
if (board[0][2] == board[1][2] && board[1][2] == board[2][2] && board[2][2] != blankchar)
{
return 0;
}
//CHECK DIAGONALS
if (board[0][2] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != blankchar)
{
return 0;
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != blankchar)
{
return 0;
}

} else {

if (board[0][0] == board[0][1] && board[0][1] == board[0][2] && board[0][2] != blankchar)
{
return 1;
}
if (board[1][0] == board[1][1] && board[1][1] == board[1][2] && board[1][2] != blankchar)
{
return 1;
}
if (board[2][0] == board[2][1] && board[2][1] == board[2][2] && board[2][2] != blankchar)
{
return 1;
}
//CHECK COLUMNS
if (board[0][0] == board[1][0] && board[1][0] == board[2][0] && board[2][0] != blankchar)
{
return 1;
}
if (board[0][1] == board[1][1] && board[1][1] == board[2][1] && board[2][1] != blankchar)
{
return 1;
}
if (board[0][2] == board[1][2] && board[1][2] == board[2][2] && board[2][2] != blankchar)
{
return 1;
}
//CHECK DIAGONALS
if (board[0][2] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != blankchar)
{
return 1;
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != blankchar)
{
return 1;
}

}
return 2;

}

//UGLY CODE; THIS PRINTS OUT A NICE LOOKING TABLE.
void table(void)
{
cout << "\n\n\tCurrent Table\n";
cout << "\t" << (char) 201 << char (205) << char (205) << char (205) << char (205) << char (205) << char (203) << (char) 205 << char (205) << char (205) << char (205) << (char) 205 << (char) 203 << (char) 205 << char (205) << (char) 205 << char (205) << char (205) << char (187) << endl;
cout << "\t" << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << endl;
cout << "\t" << (char) 186 << "  " <<board[0][0]<<"  " << (char) 186 << "  " << board[0][1] << "  " << (char) 186 << "  " <<board[0][2]<<"  " << (char) 186 << endl;
cout << "\t" << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << endl;
cout << "\t" << (char) 204 << char (205) << char (205) << char (205) << char (205) << char (205) << (char) 206 << char (205) << char (205) << char (205) << char (205) << char (205) << (char) 206 << char (205) << char (205) << char (205) << char (205) << char (205) << char (185) << endl;
cout << "\t" << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << endl;
cout << "\t" << (char) 186 << "  " <<board[1][0]<<"  " << (char) 186 << "  " << board[1][1]<<"  " << (char) 186 << "  " <<board[1][2]<<"  " << (char) 186 << endl;
cout << "\t" << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << endl;
cout << "\t" << (char) 204 << char (205) << char (205) << char (205) << char (205) << char (205) << (char) 206 << char (205) << char (205) << char (205) << char (205) << char (205) << (char) 206 << char (205) << char (205) << char (205) << char (205) << char (205) << char (185) << endl;
cout << "\t" << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << endl;
cout << "\t" << (char) 186 << "  " <<board[2][0]<<"  " << (char) 186 << "  " << board[2][1] << "  " << (char) 186 << "  " << board[2][2] << "  " << (char) 186 << endl;
cout << "\t" << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << "     " << (char) 186 << endl;
cout << "\t" << (char) 200 << char (205) << char (205) << char (205) << char (205) << char (205) << char (202) << (char) 205 << char (205) << char (205) << char (205) << (char) 205 << (char) 202 << (char) 205 << char (205) << (char) 205 << char (205) << char (205) << char (188) << endl;
cout << "\n";
}

//UGLY CODE; THIS JUST PRINTS OUT A PRETTY TITLE
int init(void)
{
cout << "\t" << (char) 201 << (char) 205 << (char) 203 << (char) 205 << (char) 187 << " " << (char) 201 << (char) 205 << (char) 203 << (char) 205 << (char) 187 << " " << (char) 201 << (char) 205 << (char) 205 << (char) 187 << "  " << (char) 201 << (char) 205 << (char) 203 << (char) 205 << (char) 187 << " " << (char) 201 << (char) 205 << (char) 205 << (char) 187 << " " << (char) 201 << (char) 205 << (char) 205 << (char) 187 << "  " << (char) 201 << (char) 205 << (char) 203 << (char) 205 << (char) 187 << " " << (char) 201 << (char) 205 << (char) 205 << (char) 187 << " " << (char) 201 << (char) 205 << (char) 205 << (char) 187 << "\n";
cout << "\t  " << (char) 186 << "     " << (char) 186 << "   " << (char) 186 << "       " << (char) 186 << "   " <<  (char) 204  <<  (char) 205 << (char) 205 <<  (char) 185 << " " << (char) 186 << "       " << (char) 186 << "   " << (char) 186 << "  " << (char) 186 << " " << (char) 204 << (char) 205 << "\n";
cout << "\t  " << (char) 186 << "     " << (char) 186 << "   " << (char) 186 << "       " << (char) 186 << "   " <<  (char) 186 << "  " <<  (char) 186 << " " << (char) 186 << "       " << (char) 186 << "   " << (char) 186 << "  " << (char) 186 << " " << (char) 186 << " \n";
cout << "\t  " << (char) 202 << "   " << (char) 200 << (char) 205 << (char) 202 << (char) 205 << (char) 188 << " " << (char) 200 << (char) 205 << (char) 205 << (char) 188 << "    " << (char) 202 << "   " << (char) 202 << "  " << (char) 202 << " " << (char) 200 << (char) 205 << (char) 205 << (char) 188 << "    " << (char) 202 << "   " << (char) 200 << (char) 205 << (char) 205 << (char) 188 << " " << (char) 200 << (char) 205 << (char) 205 << (char) 188 << "\n";
cout << "\tInstructions: use number keys to determine move.\n\n";
cout << "\t[1][2][3]\n";
cout << "\t[4][5][6]\n";
cout << "\t[7][8][9]\n\n";
cin.getline(playername1, 25, '\n');
cout << "\t[o] Player 2; enter yours->";
cin.getline(playername2, 25, '\n');

for (i = 0; i < 3; i++)
{
for (ii = 0; ii < 3; ii++)
{
board[i][ii] = blankchar;
}
}
return 0;
}

int getInput(char player)
{
if (player == 'x')
{
cout << "\t" << playername1 << ", make your move->";
cin>>move;
while (move != 1 && move != 2 && move != 3 && move != 4 && move != 5 && move != 6 && move != 7 && move != 8 && move != 9)
{
cout << "\n\t Invalid input, please restate->";
cin>>move;
}
switch (move)
{
case 1: { x = 0; y = 0; break; }
case 2: { x = 0; y = 1; break; }
case 3: { x = 0; y = 2; break; }
case 4: { x = 1; y = 0; break; }
case 5: { x = 1; y = 1; break; }
case 6: { x = 1; y = 2; break; }
case 7: { x = 2; y = 0; break; }
case 8: { x = 2; y = 1; break; }
case 9: { x = 2; y = 2; break; }
{
cout << "\n\tInvalid input, please restate->";
getInput(playerup);
}

}
return 1;
} else {
cout << "\t" << playername2 << ", make your move->";
cin>>move;
switch (move)
{
case 1: { x = 0; y = 0; break; }
case 2: { x = 0; y = 1; break; }
case 3: { x = 0; y = 2; break; }
case 4: { x = 1; y = 0; break; }
case 5: { x = 1; y = 1; break; }
case 6: { x = 1; y = 2; break; }
case 7: { x = 2; y = 0; break; }
case 8: { x = 2; y = 1; break; }
case 9: { x = 2; y = 2; break; }
{
cout << "\n\tInvalid input, please restate->";
getInput(playerup);
}

}
return 2;
}
}

int setInput(char player)
{
if (board[x][y] == blankchar)
{
board[x][y] = player;
moves++;
return 0;
}
return 1;
}```

6. Try to make your code less complicated by using functions.