I was going to ask at the time, but I forgot and just remembered now.
Even though it's a shitty shmup (and I made the playfield wider than tall despite being a vertical scroller), I still think it would be nice to know how to prevent memory leaks for the future.
Here's my code, by the way:
Spoiler
Code: Select all
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>
using namespace std;
void printField(char pF[15][20]) {
for (int y = 0; y < 15; y++) {
for (int x = 0; x < 20; x++) {
cout << pF[y][x] << ' ';
}
cout << endl;
}
}
void fieldRefresh(char pF[15][20]) {
for (int y = 0; y < 15; y++) {
for (int x = 0; x < 20; x++) {
pF[y][x] = ' ';
}
}
}
int main(void) {
char playField[15][20];
int playerPositionX = 9;
int playerPositionY = 7;
int enemyTick = 1;
int score = 0;
int scrollPosition = 0;
bool bulletOnScreen[3] = { false,false,false };
bool gameOver = false;
int bulletPositionX[3];
int bulletPositionY[3];
int enemyPosition[60][6][3];
int gameLength = 60;
for (int i = 0; i < gameLength; i++) {
for (int j = 0; j < 6; j++) {
enemyPosition[i][j][0] = 0;
enemyPosition[i][j][1] = 20;
enemyPosition[i][j][2] = -1;
}
}
//enemy positions
enemyPosition[45][1][1] = 7;
enemyPosition[45][0][1] = 12;
enemyPosition[44][1][1] = 8;
enemyPosition[44][0][1] = 11;
enemyPosition[43][1][1] = 9;
enemyPosition[43][0][1] = 10;
enemyPosition[42][1][1] = 9;
enemyPosition[42][0][1] = 10;
enemyPosition[41][1][1] = 8;
enemyPosition[41][0][1] = 11;
enemyPosition[40][1][1] = 7;
enemyPosition[40][0][1] = 12;
enemyPosition[31][1][1] = 12;
enemyPosition[31][0][1] = 15;
enemyPosition[30][1][1] = 11;
enemyPosition[30][0][1] = 14;
enemyPosition[29][2][1] = 8;
enemyPosition[29][0][1] = 13;
enemyPosition[28][2][1] = 7;
enemyPosition[28][0][1] = 12;
enemyPosition[27][1][1] = 8;
enemyPosition[27][0][1] = 11;
enemyPosition[26][1][1] = 7;
enemyPosition[26][0][1] = 10;
enemyPosition[25][1][1] = 6;
enemyPosition[25][0][1] = 9;
enemyPosition[24][1][1] = 5;
enemyPosition[24][0][1] = 8;
enemyPosition[23][1][1] = 4;
enemyPosition[23][0][1] = 7;
enemyPosition[22][1][1] = 5;
enemyPosition[22][0][1] = 8;
enemyPosition[21][1][1] = 6;
enemyPosition[21][0][1] = 9;
enemyPosition[20][1][1] = 7;
enemyPosition[20][0][1] = 10;
enemyPosition[19][1][1] = 8;
enemyPosition[19][0][1] = 11;
enemyPosition[18][2][1] = 7;
enemyPosition[18][1][1] = 9;
enemyPosition[18][0][1] = 12;
enemyPosition[17][2][1] = 8;
enemyPosition[17][1][1] = 10;
enemyPosition[17][0][1] = 13;
enemyPosition[16][1][1] = 11;
enemyPosition[16][0][1] = 14;
enemyPosition[15][1][1] = 12;
enemyPosition[15][0][1] = 15;
enemyPosition[7][0][1] = 9;
enemyPosition[6][0][1] = 9;
enemyPosition[5][0][1] = 9;
enemyPosition[4][0][1] = 9;
enemyPosition[3][0][1] = 11; // E
enemyPosition[2][0][1] = 10; // E
enemyPosition[1][1][1] = 11;
enemyPosition[1][0][1] = 9; // E E
enemyPosition[0][0][1] = 10; // E
//enemy positions
while (gameOver == false) {
system("cls");
fieldRefresh(playField);
//check input
if (_kbhit()) {
char input = _getch();
switch (input) {
case 'w':
if (playerPositionY > 0) {
playerPositionY -= 1;
}
break;
case 's':
if (playerPositionY < 14) {
playerPositionY += 1;
}
break;
case 'a':
if (playerPositionX > 0) {
playerPositionX -= 1;
}
break;
case 'd':
if (playerPositionX < 19) {
playerPositionX += 1;
}
break;
}
if (input == 'j') {
for (int i = 0; i < 3; i++) {
if (bulletOnScreen[i] == false) {
bulletOnScreen[i] = true;
bulletPositionX[i] = playerPositionX;
bulletPositionY[i] = playerPositionY - 1;
break;
}
}
}
}
//check input
playField[playerPositionY][playerPositionX] = 'A';
//bullet update
for (int i = 0; i < 3; i++) {
if (bulletOnScreen[i]) {
if (bulletPositionY[i] >= 0) {
playField[bulletPositionY[i]][bulletPositionX[i]] = '*';
bulletPositionY[i] -= 1;
}
else {
bulletOnScreen[i] = false;
}
}
}
//bullet update
//enemy update
if (enemyTick == 0) {
for (int i = 0; i < 6; i++) {
if (enemyPosition[scrollPosition][i][1] >= 0 && enemyPosition[scrollPosition][i][1] < 20 && enemyPosition[scrollPosition][i][2] == -1) {
enemyPosition[scrollPosition][i][0] = 1;
}
}
for (int j = 0; j < gameLength; j++) {
for (int k = 0; k < 6; k++) {
if (enemyPosition[j][k][2] == 20) {
enemyPosition[j][k][2] = -2;
enemyPosition[j][k][0] = 0;
}
if (enemyPosition[j][k][0] == 1) {
enemyPosition[j][k][2] += 1;
}
}
}
scrollPosition += 1;
}
for (int j = 0; j < gameLength; j++) {
for (int k = 0; k < 6; k++) {
if (enemyPosition[j][k][2] >= 0 && enemyPosition[j][k][2] < 20) {
playField[enemyPosition[j][k][2]][enemyPosition[j][k][1]] = 'E';
}
}
}
//enemy update
//collision check
for (int j = 0; j < gameLength; j++) {
for (int k = 0; k < 6; k++) {
for (int b = 0; b < 3; b++) {
if (enemyPosition[j][k][0] != 0) {
if (enemyPosition[j][k][2] == bulletPositionY[b] && enemyPosition[j][k][1] == bulletPositionX[b] && bulletOnScreen[b]) {
playField[enemyPosition[j][k][2]][enemyPosition[j][k][1]] = '%';
//playField[bulletPositionY[b]][bulletPositionX[b]] = ' ';
enemyPosition[j][k][2] = -2;
enemyPosition[j][k][0] = 0;
score = score + 1;
bulletOnScreen[b] = false;
}
}
if (enemyPosition[j][k][2] == playerPositionY && enemyPosition[j][k][1] == playerPositionX) {
gameOver = true;
}
}
}
}
printField(playField);
enemyTick = enemyTick + 1;
if (enemyTick == 5) {
enemyTick = 0;
}
Sleep(1000 / 30);
if (scrollPosition >= gameLength) {
gameOver = true;
}
}
system("cls");
cout << "Game Over\nScore: " << score << endl;
Sleep(1000);
}