Error printing Arrays on Traffic Jam Game

This is a project we're working on for our final project where we have a game field thats populated with X's and O's that start and standard positions, for example XXXX_OOO we are then supposed to code 5 seperate function prototypes for the moves, jumps, and a swap. The point is so that the array when printed at the end ends like this OOO_XXXX . We are having a small problem getting the array to print once one move has been made. We thought we could just cout in all the function prototypes but it doesnt print. We want it to print out the last move it just made before waiting for the user to hit enter before going to the next one. Any help would be greatly appreciated.

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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
//Header
bool xMove(char*, int&, int&);
void Swap(char*, char*);
bool oMove(char*, int&, int&);
//bool xJump(char*)
//bool oJump(char*)

 //Main function
#include<iostream>
#include<iomanip>
#include"Header.h"


using namespace std;

int main()
{
	char *HB = nullptr;
	int X, O, Field;
	int alt;
	bool aMove, bMove, cMove, dMove;

	cout << "Enter X: ";
	cin >> X;

	while (X <= 0 || X > 9 || (cin.fail()))
	{
		cin.clear();
		cin.ignore(cin.rdbuf()->in_avail());
		cout << "Invalid number: Try entering a number from 0 to 9\n";
		cout << endl;
		cout << "Enter X: \n";
		cin >> X;

	}

	cout << endl;

	cout << "Enter O: ";
	cin >> O;

	while (O <= 0 || X > 9 || (cin.fail()))
	{
		cin.clear();
		cin.ignore(cin.rdbuf()->in_avail());
		cout << "invalid number: Try again\n";
		cout << endl;
		cout << "Enter O: \n";
		cin >> O;

	}
	cout << endl;

	Field = X + O + 1;

	HB = new char[Field];

	int count = 0;
	for (int i = 0; i < X; i++)
	{
		HB[count++] = 'X';
	}
	HB[count++] = '_';

	for (int j = 0; j < O; j++)
	{
		HB[count++] = 'O';
	}
	cout << endl << endl;
	cout << "You have entered " << X << " (Xs) and " << O
		<< " (Os)" << " and (_) is automaticaly added between the Xs and Os" << endl;
	cout << endl;
	for (int a = 0; a < Field; a++)
	{
		cout << HB[a];
	}

	delete[] HB;
	HB = nullptr;
	cout << endl << endl;
	cout << "Plase press Enter after each line, until the Field is complete" << endl;
	cout << "-------------------------------------------------------------" << endl;

	system("pause");

	//Call function
	alt = Field / 2;
	for (int i = 0; i < alt; i++)
	{
		bMove = aMove = cMove= dMove = true;

		while (aMove == true || bMove == true)
		{
			aMove = xMove(new char, X, Field);
			for (int a = 0; a < Field; a++)
			{
				cout << HB[a];
			}
			bMove = oMove(new char, O, Field);
			for (int a = 0; a < Field; a++)
			{
				cout << HB[a];
			}

		}
	}




	return 0;




}
//O Move
#include<iostream>
#include<iomanip>
#include"Header.h"

using namespace std;

bool oMove(char* HB, int& O, int& Field)
{
	char eIndex = HB[O + 1];
	char xIndex = O;
	if (HB[xIndex] == '_'&& HB[xIndex + 1] == 'X')
	{
		eIndex = xIndex + 1;


		Swap(HB + eIndex, HB + xIndex);
     }

	
	system("pause");
	return false;
}
//swap
#include<iostream>
#include<iomanip>
#include"Header.h"


using namespace std;


void Swap(char* a, char* b)
{
	char temp;
	temp = *a;
	*a = *b;
	*b = temp;
		
}
//X Move
#include<iostream>
#include<iomanip>
#include"Header.h"


using namespace std;



bool xMove(char* HB, int& X, int& Field)
{
	char eIndex = HB[X + 1];
	char xIndex = X;

	if (HB[eIndex] == '_'&& HB[eIndex + 1] == 'O')
	{
		xIndex = eIndex - 1;

		Swap(HB + eIndex , HB + xIndex );

    }
	
	system("pause");
	return false;
}
Your functions xMove and oMove have system("pause"); in them.

This seems really odd. Also, they leak memory, and you've really screwed up with the first parameter.

bMove = oMove(new char, O, Field);
See how the first parameter is a pointer to a single char?

Now look at what the function oMove does with that pointer to a single char; pretends it's an array of char, and reads from it! But it's just some random value because you never set it. This is awful. You're reading random memory, beyond the char that you made and never even set a value on, and the char that was made with new is never deleted so you leak memory. This is awful.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool oMove(char* HB, int& O, int& Field)
{
	char eIndex = HB[O + 1]; // HB is a pointer to a SINGLE char, but you're treating it like an array
	char xIndex = O;
	if (HB[xIndex] == '_'&& HB[xIndex + 1] == 'X')  // You're fiddling around with an array that doesn't exist
	{
		eIndex = xIndex + 1;


		Swap(HB + eIndex, HB + xIndex);
     }

	
	system("pause");
	return false;
}


Last edited on
Furthermore, look at this code:
1
2
3
4
5
6
7
8
	while (aMove == true || bMove == true)
		{
			aMove = xMove(new char, X, Field);
			for (int a = 0; a < Field; a++)
			{
				cout << HB[a];
			}
			bMove = oMove(new char, O, Field);


Your while loop is controlled by aMove and oMove. Those values get set by the returned value from the functions xMove and oMove. What do those functions return? false, always. Always always returning false. This makes no sense.
Last edited on
See how you delete HB on line 78, and then on line 79 you set it to nullptr?

On line 97, when you then try to use it, what are you expecting it to do? You already deleted the array and HB doesn't even point at the deleted array anymore.

This code is a big mess. I think you should start again, and this time build it and run it every time you add a single line. Make sure it works as expected at every line before moving on.
Last edited on
Topic archived. No new replies allowed.