Matrix in Code -> .txt file

I need to move g_tileState and g_shipPlacement into text files saveGameTileState.txt and saveGameShips.txt respectively. If you code wizards can debug the code as well or optimize it that would be nice.

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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
//Gabriel Featherstone - ICS3U.03 Ms. Cullum
//Battleship Summative Game

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string>
#include <iostream>

const std::string horiz = "+---+---+---+---+---+---+---+---+";
const std::string verti = "|   |   |   |   |   |   |   |   |";


//reusing structure from previous excercise 
//(program titled qwerguiaiod)
struct Matrix {
  int rows;
	int cols;
	int Matrix[8][8];
};

Matrix g_tileState = {8,8, 
	{
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
	}
};

Matrix g_shipPlacement = {8,8,
	{
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,
	}
};

void createStartingBoard() {

	int activeTileNumber;

	srand(time(0));

	for(int i = 0; i < 24; i++) {

		activeTileNumber = rand() % 64;

		int y = activeTileNumber / 8;
		int x = activeTileNumber % 8;

		//printf("%d,%d\n", y, x);

		g_shipPlacement.Matrix[y][x] = 1;

	}
	
}

bool applyHit(int X, int Y) {

	g_shipPlacement.Matrix[Y][X] = 0;
	
	for(int y = 0; y < 8; y++) {

		for(int x = 0; x < 8; x++) {
			
			if(g_shipPlacement.Matrix[y][x] == 1) {
				return false;
			}

		}

	}

	return true;

}

void updateBoard(int X, int Y, int val) {

	g_tileState.Matrix[Y][X] = val;

}

void printBoard(const Matrix& tileState) {

	for(int y = 0; y < 8; y++) {

		std::string vertiCopy;

		vertiCopy = verti;

		for(int x = 0; x < 8; x++)	{

			if(tileState.Matrix[y][x] == 2)	{
				vertiCopy[x*4+2] = 'O';
			}

			if(tileState.Matrix[y][x] == 1)	{
				vertiCopy[x*4+2] = 'X';
			}

		}

		std::cout << horiz << std::endl;
		std::cout << vertiCopy << std::endl;

	}

	std::cout << horiz << std::endl;

}

bool do_comparison(int X, int Y) {
	return g_shipPlacement.Matrix[Y][X] == 1;
}

void playerTurn() {
	
	int playerX;
	int playerY;

}

void saveGame() {
	
}

int main() {

	bool gameInProgress = true;
	int X;
	int Y;

	while(gameInProgress == true) {

		createStartingBoard();
		
		printf("\nEnter an X coordinate: ");
		scanf("%d", &X);
		
		if(X <= 0 || X > 8) {
			printf("\nThe X value you entered does not exist!");
			printf(" The value must be between 1 and 8.\n");

			continue;
		
		}
		
		printf("\nEnter a Y coordinate: ");
		scanf("%d", &Y);
		
		if(Y <= 0 || Y > 8) {
			printf("\nThe Y value you entered does not exist!");
			printf(" The value must be between 1 and 8.\n");

			continue;

		}

		printf("\nYou entered coordinates (%d, %d).\n", X, Y);

		X = X - 1;
		Y = Y - 1;

		bool isaHit = do_comparison(X,Y);

		if(isaHit) {

			printf("\nYou hit an enemy ship!\n");
			updateBoard(X,Y,1);

			if(applyHit(X,Y)) {
				printBoard(g_tileState);
				printf("\nCongradulations! You sunk all enemy ships!");
				break;
			}

		} 
		else {
			printf("\nYou didn't hit anything.\n");
			updateBoard(X,Y,2);

		}
		
		printBoard(g_tileState);

		
	}

}
does it need to be a text file?
its a lot easier if you can just write(structvar, sizeof(struct)) to a binary file (possibly, both matrices in one file here?). that would 'optimize' it :) If it needs to be text files, you will need to loop over the data and print it into the files or make the matrix of type string (or each row thereof?) so you can write it (them?) at one go as text.

as for optimize/cleanup stuff:
you are using C headers. fix them to c++, eg <cmath>, <cstdio> etc.
you can zero initialize those arrays without the explicit array in the code.
you can use c++ <random> instead of rand().
you can use cin and cout instead of printf.
you can fix the magic numbers. (eg 8 hard coded everywhere).
This code looks like C but you included <string> and <iostream>. Are you trying to write c++ or C?
there isnt a lot of point in making it optimal (faster). It will run faster than you can blink even on a 40 year old PC. Instead, for now, focus on making it clean and modern.
Last edited on
for the assignment's purposes, yes. it does need to be a text file. i have an incomplete section in the code that asks the user whether or not they want to save the game state in a text file. i haven't really gotten a hold of the differences between c and c++, but im willing to learn such things.
You can just use stream extractors, like how std::cout and std::cin function, but instead with a std::ifstream (like cin), and std::ofstream (like cout), make sure to check for errors (hint: operator bool() is used for validity, and most writing functions return a reference to &stream, so you check for errors like "if(stream >> value){success}").
Topic archived. No new replies allowed.