RE: C++ Tic Tac Toe

I am a bit confused as to why my program won't execute. It runs the code and immediately terminates. Also, for my void printboard function, is there a way to return the board?

#include <iostream>


using namespace std;

int main()
{
bool checkboard (int myarray[3][3], bool decider1);
bool winorlose(int myarray[3][3], bool decider2);
bool decider1;
bool decider2;
char person1 = 'X';
char person2 = 'O';
int x;
int y;
int a;
int b;
char myarray[3][3];

cout << "In real life, play Rock,paper or scissors to see who goes first." << endl;

while (decider1 = false)
{

cout << "Player one start." << endl;
cin >> a;
cin >> b;

while (a > 2 && a < 0 && b > 2 && b < 0)
{
cout << "Invalid move. Try again" << endl;
cin >> a;
cin >> b;
}

myarray[a][b] = person1;

cout << "Player two start." << endl;
cin >> x;
cin >> y;

while (x > 2 && x < 0 && y > 2 && y < 0)
{
cout << "Invalid move. Try again" << endl;
cin >> a;
cin >> b;
}

myarray[x][y] = person2;


}
return 0;

}


bool checkboard (int myarray[3][3],bool decider1)
{

decider1 = false;

for (int i=0;i<=2;i++)
{
for (int j=0;j<=2;j++)
{
while (myarray[i][j] == 1)
{
cout << "Invalid move." << endl;
decider1 = true;
}
}
}

return decider1;
}

bool winorlose(int myarray[3][3],bool decider2)
{
decider2 = false;

if (myarray[0][0] == 1 && myarray[0][1] == 1 && myarray[0][2] == 1)
{
cout << "Congratulations, you won!" << endl;
decider2 = true;
}

else if (myarray[1][0] == 1 && myarray[1][1] == 1 && myarray[1][2] == 1)
{
cout << "Congratulations, you won!" << endl;
decider2 = true;
}

else if (myarray[2][0] == 1 && myarray[2][1] == 1 && myarray[2][2] == 1)
{
cout << "Congratulations, you won!" << endl;
decider2 = true;
}

else if (myarray[0][0] == 1 && myarray[2][0] == 1 && myarray[3][0] == 1)
{
cout << "Congratulations, you won!" << endl;
decider2 = true;
}

else if (myarray[0][1] == 1 && myarray[1][1] == 1 && myarray[2][1] == 1)
{
cout << "Congratulations, you won!" << endl;
decider2 = true;
}

else if (myarray[0][2] == 1 && myarray[1][2] == 1 && myarray[2][2] == 1)
{
cout << "Congratulations, you won!" << endl;
decider2 = true;
}

else if (myarray[0][0] == 1 && myarray[1][1] == 1 && myarray[2][2] == 1)
{
cout << "Congratulations, you won!" << endl;
decider2 = true;
}

else if (myarray[0][2] == 1 && myarray[1][1] == 1 && myarray[2][0] == 1)
{
cout << "Congratulations, you won!" << endl;
decider2 = true;
}

else
{
cout << "Wow, it's a draw!" << endl;
decider2 = true;
}


return decider2;

}


void PrintBoard (char myarray[3][3], char person1, char person2)
{

cout << "_" << myarray[1][1] << "_|_" << myarray[1][2] << "_|_" << myarray[1][3] << "_" << endl;
cout << "_" << myarray[2][1] << "_|_" << myarray[2][2] << "_|_" << myarray[2][3] << "_" << endl;
cout << " " << myarray[3][1] << " | " << myarray[3][2] << " | " << myarray[3][3] << endl;


}
http://www.cppforschool.com/project/tic-tac-toe-project.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>
using namespace std;

char square[10] = {'o','1','2','3','4','5','6','7','8','9'};

int checkwin();
void board();

int main()
{
	int player = 1,i,choice;

	char mark;
	do
	{
		board();
		player=(player%2)?1:2;

		cout << "Player " << player << ", enter a number:  ";
		cin >> choice;

		mark=(player == 1) ? 'X' : 'O';

		if (choice == 1 && square[1] == '1')

			square[1] = mark;
		else if (choice == 2 && square[2] == '2')

			square[2] = mark;
		else if (choice == 3 && square[3] == '3')

			square[3] = mark;
		else if (choice == 4 && square[4] == '4')

			square[4] = mark;
		else if (choice == 5 && square[5] == '5')

			square[5] = mark;
		else if (choice == 6 && square[6] == '6')

			square[6] = mark;
		else if (choice == 7 && square[7] == '7')

			square[7] = mark;
		else if (choice == 8 && square[8] == '8')

			square[8] = mark;
		else if (choice == 9 && square[9] == '9')

			square[9] = mark;
		else
		{
			cout<<"Invalid move ";

			player--;
			cin.ignore();
			cin.get();
		}
		i=checkwin();

		player++;
	}while(i==-1);
	board();
	if(i==1)

		cout<<"==>\aPlayer "<<--player<<" win ";
	else
		cout<<"==>\aGame draw";

	cin.ignore();
	cin.get();
	return 0;
}

/*********************************************

	FUNCTION TO RETURN GAME STATUS
	1 FOR GAME IS OVER WITH RESULT
	-1 FOR GAME IS IN PROGRESS
	O GAME IS OVER AND NO RESULT
**********************************************/

int checkwin()
{
	if (square[1] == square[2] && square[2] == square[3])

		return 1;
	else if (square[4] == square[5] && square[5] == square[6])

		return 1;
	else if (square[7] == square[8] && square[8] == square[9])

		return 1;
	else if (square[1] == square[4] && square[4] == square[7])

		return 1;
	else if (square[2] == square[5] && square[5] == square[8])

		return 1;
	else if (square[3] == square[6] && square[6] == square[9])

		return 1;
	else if (square[1] == square[5] && square[5] == square[9])

		return 1;
	else if (square[3] == square[5] && square[5] == square[7])

		return 1;
	else if (square[1] != '1' && square[2] != '2' && square[3] != '3' 
                    && square[4] != '4' && square[5] != '5' && square[6] != '6' 
                  && square[7] != '7' && square[8] != '8' && square[9] != '9')

		return 0;
	else
		return -1;
}


/*******************************************************************
     FUNCTION TO DRAW BOARD OF TIC TAC TOE WITH PLAYERS MARK
********************************************************************/


void board()
{
	system("cls");
	cout << "\n\n\tTic Tac Toe\n\n";

	cout << "Player 1 (X)  -  Player 2 (O)" << endl << endl;
	cout << endl;

	cout << "     |     |     " << endl;
	cout << "  " << square[1] << "  |  " << square[2] << "  |  " << square[3] << endl;

	cout << "_____|_____|_____" << endl;
	cout << "     |     |     " << endl;

	cout << "  " << square[4] << "  |  " << square[5] << "  |  " << square[6] << endl;

	cout << "_____|_____|_____" << endl;
	cout << "     |     |     " << endl;

	cout << "  " << square[7] << "  |  " << square[8] << "  |  " << square[9] << endl;

	cout << "     |     |     " << endl << endl;
}

/*******************************************************************
				END OF PROJECT
********************************************************************/
I could not get rid of feeling these horrible "switches" should be substituted with something more handy.

For the first: making user move could be simply converted to:

1
2
if (choice == u && square[u] == '0' + u)
	square[u] = mark;

Without all these 9 if-elses.

And now see here:

http://codeabbey.com/index/task_view/tic-tac-toe

Source of the small implementation inside this page could be seen:

For checking win condition the following code is used (sorry it is JavaScript but it could be rewritten to C++ straightforward):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function checkWin(x, y) {
   var s = 0;
   for (var i = 0; i != 3; i++) { // checking rows
       s += field[y][i];
   }
   if (Math.abs(s) == 3) {
       return s;
   }
   s = 0;
   for (i = 0; i != 3; i++) { // checking columns
       s += field[i][x];
   }
   if (Math.abs(s) == 3) {
       return s;
   }
   if (x == y) { // checking one diagonal
       s = 0;
       for (i = 0; i != 3; i++) {
           s += field[i][i];
       }
       if (Math.abs(s) == 3) {
           return s;
       }
   }
   if (x + y == 2) { // checking second diagonal
       s = 0;
       for (i = 0; i != 3; i++) {
           s += field[2 - i][i];
       }
       if (Math.abs(s) == 3) {
           return s;
       }
   }
   return 0;
}


Though the code should be more laconic if the check of if (Math.abs(s) == 3) is moved to the end from 4 branches.
yes, both of your codes make sense, but i am unsure why my code does not run. for my printboard function, i tried putting printboard(...); in the main function, but the parameters i had didn't work, said something like i needed a bracket in it.
Topic archived. No new replies allowed.