Thread: My game
View Single Post
Old 06-27-2004, 03:34 AM   #1 (permalink)
Dodo
Registered User
 
Join Date: Jun 2004
Posts: 1
Dodo is on a distinguished road
My game

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
.
Dodo is offline   Reply With Quote