http://dodo5.netfirms.com/game.html .
does not work under win9x.
Code:
#include "main.h"
#include <vector>
using namespace std;
GAMEDATA GDATA;
ENTITY Player;
ENTITY Enemies[EN];
COORD zeroZero = {0, 0};
vector<ENTITY> globalBullet;
bool Collide(ENTITY test, int dir);
bool gameover = false;
int score;
int lifeCheck;
int time = GetTickCount();
int last_time;
int delay = 200;
int time2 = time;
int last_time2;
int delay2 = 25;
bool InitGame(){
Player.posx = 5;
Player.posy = 4;
Player.health = 100;
GDATA.hInput = GetStdHandle(STD_INPUT_HANDLE);
GDATA.hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
GDATA.rect.Top = 2;
GDATA.rect.Bottom = GDATA.rect.Top+50;
GDATA.rect.Left = 0;
GDATA.rect.Right = 80;
SetConsoleMode(GDATA.hInput, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);
SetConsoleCursorPosition(GDATA.hOutput,zeroZero);
return true;
}
ENTITY Fire(ENTITY shooter,int dir, char name)
{
shooter.name = name;
if(dir == UP){shooter.dir = UP;}
if(dir == DOWN){shooter.dir = DOWN; }
PlaySound("laser.wav", NULL, SND_FILENAME | SND_ASYNC);
shooter.alive = true;
return shooter;
}
void MoveBullets(){
for (int x = 0; x < globalBullet.size(); x++){
if(globalBullet[x].posy == 0){
globalBullet[x].alive = false;
}
if(globalBullet[x].posy == 49){
globalBullet[x].alive = false;
}
if(globalBullet[x].alive == false){
globalBullet[x].posx = NULL;
globalBullet[x].posy = NULL;
}
int previndex = ((globalBullet[x].posy*WIDTH)+globalBullet[x].posx);
GDATA.ScreenBuff[previndex].Char.AsciiChar = ' ';
GDATA.ScreenBuff[previndex].Attributes = BACKGROUND_BLUE | FOREGROUND_BLUE;
switch(globalBullet[x].dir){
case UP:
if(!Collide(globalBullet[x],UP)){
globalBullet[x].posy--;
break;
}
else{
globalBullet[x].alive = false;
}
break;
case DOWN:
if(!Collide(globalBullet[x],DOWN)){
globalBullet[x].posy++;
break;
}
else{
globalBullet[x].alive = false;
}
break;
}
}
for (int i = 0; i < globalBullet.size(); i++){
if(globalBullet[i].alive == true){
int index = ((globalBullet[i].posy*WIDTH)+globalBullet[i].posx);
if(globalBullet[i].alive == true){
GDATA.ScreenBuff[index].Char.AsciiChar = '|';
if(globalBullet[i].name != 'E'){
GDATA.ScreenBuff[index].Attributes = BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY;
}
else{
GDATA.ScreenBuff[index].Attributes = BACKGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
}
}
else{
GDATA.ScreenBuff[index].Char.AsciiChar = ' ';
GDATA.ScreenBuff[index].Attributes = BACKGROUND_BLUE | FOREGROUND_BLUE;
}
}
else if(globalBullet[i].alive == false){
int index = ((globalBullet[i].posy*WIDTH)+globalBullet[i].posx);
GDATA.ScreenBuff[index].Attributes = BACKGROUND_BLUE | FOREGROUND_BLUE;
}
}
if(globalBullet.size() > 4096){ globalBullet.clear();}
}
bool Collide(ENTITY test, int dir){
switch(dir){
case UP:
test.posy--;
break;
case DOWN:
test.posy++;
break;
case LEFT:
test.posx--;
break;
case RIGHT:
test.posx++;
break;
}
int index = ((test.posy*WIDTH)+ test.posx);
if(GDATA.ScreenBuff[index].Char.AsciiChar == '#'){
return true;
}
else{
return false;
}
}
bool LoadMap()
{
ifstream file_in("map.txt");
if(!file_in){
cout << "---Could not load map---\n";
system("PAUSE");
return false;
}
GDATA.width = WIDTH;
GDATA.height = HEIGHT;
if(GDATA.ScreenBuff == NULL)
{
file_in.close();
return false;
}
int x = 0;
int y = 0;
char temp;
while(y != GDATA.height)
{
file_in >> temp;
switch(temp)
{
case '0':
GDATA.ScreenBuff[x + y * WIDTH].Char.AsciiChar = ' ';
GDATA.ScreenBuff[x + y * WIDTH].Attributes = BACKGROUND_BLUE;
break;
case '1':
GDATA.ScreenBuff[x + y * WIDTH].Char.AsciiChar = '#';
GDATA.ScreenBuff[x + y * WIDTH].Attributes = BACKGROUND_BLUE | FOREGROUND_GREEN;
break;
default:
file_in.close();
return false;
}
if(++x == GDATA.width)
{
x = 0;
y++;
}
}
file_in.close();
return true;
}
void SpawnEnemies(){
int index;
for(int x = 0; x < EN; x++){
do{
Enemies[x].posx = rand()%79;
Enemies[x].posy = rand()%49;
index = (Enemies[x].posy*WIDTH)+Enemies[x].posx;
}while(GDATA.ScreenBuff[index].Char.AsciiChar == '#');
Enemies[x].name = 'E';
Enemies[x].alive = true;
Enemies[x].killed = false;
}
}
void CheckInput(){
DWORD Events = 0; //nfi what this is for but who cares, we needs it
if(WAIT_TIMEOUT == WaitForSingleObject(GDATA.hInput,0))
return; //so that the "enemies" keep moving even if you dont push a key
ReadConsoleInput(GDATA.hInput, &GDATA.InputRecord, 1, &Events); //waits for a key press
int previndex = ((Player.posy*WIDTH)+ Player.posx); //next part here is what leaves the trail...
GDATA.ScreenBuff[previndex].Char.AsciiChar = ' ';
GDATA.ScreenBuff[previndex].Attributes = BACKGROUND_BLUE |FOREGROUND_BLUE;
if(GDATA.InputRecord.EventType == KEY_EVENT && GDATA.InputRecord.Event.KeyEvent.bKeyDown){ //so winnt doesnt do double moves
switch(GDATA.InputRecord.Event.KeyEvent.wVirtualKeyCode){ //switch for keyboard input
case VK_RIGHT: //rest of this stuff is self explanitory
FlushConsoleInputBuffer(GDATA.hInput);
if(Collide(Player,RIGHT)){
break;
}
Player.posx++;
break;
case VK_LEFT:
FlushConsoleInputBuffer(GDATA.hInput);
if(Collide(Player,LEFT)){
break;
}
Player.posx--;
break;
case VK_UP:
FlushConsoleInputBuffer(GDATA.hInput);
if(Collide(Player,UP)){
break;
}
Player.posy--;
break;
case VK_DOWN:
FlushConsoleInputBuffer(GDATA.hInput);
if(Collide(Player,DOWN)){
break;
}
Player.posy++;
break;
case VK_ESCAPE:
gameover = true;
break;
case VK_SPACE:
globalBullet.push_back(Fire(Player,UP,'P'));
}
}
int index = ((Player.posy*WIDTH)+ Player.posx); //this part here gets the place in the sbuffer array
GDATA.ScreenBuff[index].Char.AsciiChar = '^';
GDATA.ScreenBuff[index].Attributes = BACKGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
return;
}
void MoveEnemies(){
for(int x = 0; x < EN; x++){
int previndex = ((Enemies[x].posy*WIDTH)+ Enemies[x].posx);
if(GDATA.ScreenBuff[previndex].Attributes == FOREGROUND_BLUE){
continue;
}
GDATA.ScreenBuff[previndex].Char.AsciiChar = ' ';
GDATA.ScreenBuff[previndex].Attributes = BACKGROUND_BLUE |FOREGROUND_BLUE;
}
for(int y = 0; y < EN; y++){
if(Enemies[y].alive == false){continue;}
int num;
num = rand()%4;
switch(num){
case RIGHT:
if(Collide(Enemies[y],RIGHT)){
break;
}
Enemies[y].posx++;
break;
case LEFT:
if(Collide(Enemies[y],LEFT)){
break;
}
Enemies[y].posx--;
break;
case UP:
if(Collide(Enemies[y],UP)){
break;
}
Enemies[y].posy--;
break;
case DOWN:
if(Collide(Enemies[y],DOWN)){
break;
}
Enemies[y].posy++;
break;
}
int firerand = rand()%10;
if(firerand == 5){
if(Player.posy > Enemies[y].posy){
if(!Collide(Enemies[y],DOWN)){
globalBullet.push_back(Fire(Enemies[y],DOWN,'E'));
}
}
if(Player.posy < Enemies[y].posy){
if(!Collide(Enemies[y],UP)){
globalBullet.push_back(Fire(Enemies[y],UP,'E'));
}
}
}
}
for(int z = 0; z < EN; z++){
if(Enemies[z].alive == false){continue;}
int index = ((Enemies[z].posy*WIDTH)+ Enemies[z].posx);
GDATA.ScreenBuff[index].Char.AsciiChar = char(135);
GDATA.ScreenBuff[index].Attributes = BACKGROUND_BLUE |FOREGROUND_GREEN | FOREGROUND_INTENSITY;
}
}
void DrawScreen(){
SetConsoleCursorPosition(GDATA.hOutput,zeroZero); //puts the cursor to 0,0
cout << "Player health: "<< Player.health << " "; //stuff here outputs info
cout << "\nEnemies dead: " << lifeCheck << " ";
cout << " Score: " << score;
int index = ((Player.posy*WIDTH)+ Player.posx); //put this here so player is always visible
GDATA.ScreenBuff[index].Char.AsciiChar = '^';
GDATA.ScreenBuff[index].Attributes = BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY;
COORD gridSize = {80, 50};
WriteConsoleOutput(GDATA.hOutput, GDATA.ScreenBuff, gridSize, zeroZero, &GDATA.rect);
return;
}
void CheckLife(){
for (int x = 0; x < EN; x++){
for(int y = 0; y < globalBullet.size(); y++){
if(globalBullet[y].posx == Player.posx && globalBullet[y].posy == Player.posy && globalBullet[y].name == 'E'){
Player.health--;
}
if(globalBullet[y].name == 'E'){
continue;
}
if(globalBullet[y].posx == Enemies[x].posx && globalBullet[y].posy == Enemies[x].posy && globalBullet[y].alive == true){
if(Enemies[x].alive == true){
PlaySound("explos.wav", NULL, SND_FILENAME | SND_ASYNC);
score++;
}
Enemies[x].alive = false;
}
}
}
if(Player.health < 1){
cout <<"YOU LOSE";
system("PAUSE");
gameover = true;
}
for (int C = 0; C < EN; C++){
if(Enemies[C].alive == false){
if(Enemies[C].killed == false){
lifeCheck++;
Enemies[C].killed = true;
}
}
}
if(lifeCheck == EN){
cout << "Again...";
lifeCheck = 0;
SpawnEnemies();
}
}
int main(){
InitGame();
if(!LoadMap()){
cout << "---Could Not Load Map---";
}
SpawnEnemies();
while(1){
time = GetTickCount();
if(time-last_time>delay){
last_time = GetTickCount();
MoveEnemies();
}
time2 = GetTickCount();
if(time2-last_time2>delay2){
last_time2 = GetTickCount();
MoveBullets();
CheckLife();
}
CheckInput();
DrawScreen();
if(gameover == true){return 0;}
}
return 0;
} Code:
#ifndef GAME_H
#define GAME_H
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <mmsystem.h>
#include <fstream>
#define WIDTH 80
#define HEIGHT 50
#define EN 8
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
using namespace std;
typedef struct _GAMEDATA{
CHAR_INFO ScreenBuff[4000]; //holds screenbuffer chars
HANDLE hInput, hOutput; //input and output handles
INPUT_RECORD InputRecord;
SMALL_RECT rect;
bool gameover;
int width;
int height;
} GAMEDATA;
typedef struct _ENTITY{
int posx;
int posy;
bool alive;
char name;
int dir;
bool killed;
int health;
}ENTITY;
#endif .