|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <string>
|
|
#include "Utilities.h"
|
|
#include "Game.h"
|
|
#include "Ghost.h"
|
|
#include "Pacman.h"
|
|
#include "Maze.h"
|
|
#include <climits>
|
|
#include <ctime>
|
|
using namespace std;
|
|
Ghost::Ghost(){
|
|
ax = 1;
|
|
ay = 1;
|
|
direction = 5;
|
|
d = 0;
|
|
g = "A";
|
|
OrgX = 0;
|
|
OrgY = 0;
|
|
limit = 0;
|
|
speed = 0;
|
|
reduceLimit = 100;
|
|
}
|
|
|
|
Ghost::Ghost(int x, int y, string GhostG)
|
|
{
|
|
ax = x;
|
|
ay = y;
|
|
direction = 5;
|
|
d = 0;
|
|
g = GhostG;
|
|
OrgX = x;
|
|
OrgY = y;
|
|
limit = 0;
|
|
reduceLimit = 100;
|
|
}
|
|
void Ghost::increaseSpeed(int &dot){
|
|
if(limit >60){
|
|
if(dot == 20)
|
|
reduceLimit = 80;
|
|
if(dot == 40)
|
|
reduceLimit = 90;
|
|
if(dot == 60)
|
|
reduceLimit = 70;
|
|
}
|
|
}
|
|
void Ghost::ChangePosition()
|
|
{
|
|
if(g == "A")
|
|
g = "a";
|
|
else if(g == "B")
|
|
g = "b";
|
|
else if(g == "C")
|
|
g = "c";
|
|
else if(g == "D")
|
|
g = "d";
|
|
|
|
}
|
|
|
|
void Ghost::showGhost(Utilities a)
|
|
{
|
|
|
|
a.gotoXY(ax, ay);
|
|
if (g == "A")
|
|
a.changeColour(FOREGROUND_RED);
|
|
if (g == "B")
|
|
a.changeColour(0x000d);
|
|
if (g == "C")
|
|
a.changeColour(FOREGROUND_GREEN);
|
|
if (g == "D")
|
|
a.changeColour(FOREGROUND_BLUE | FOREGROUND_INTENSITY);
|
|
if (g == "a" || g == "b" || g == "c" || g == "d")
|
|
a.changeColour(BACKGROUND_WHITE | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
|
|
cout << g;
|
|
}
|
|
|
|
void Ghost::Move(Maze &m, Utilities a)
|
|
{
|
|
|
|
if (limit > 0)
|
|
{
|
|
--limit;
|
|
return;
|
|
}
|
|
limit = reduceLimit;
|
|
|
|
a.gotoXY(ax,ay);
|
|
a.changeColour(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
|
|
if (m.getMazeArray(ax, ay)=='X')
|
|
{
|
|
m.setMazeArray(ax, ay,'X');
|
|
cout << "X";
|
|
}
|
|
else if (m.getMazeArray(ax, ay)=='.')
|
|
{
|
|
m.setMazeArray(ax, ay,'.');
|
|
cout << ".";
|
|
}
|
|
else if (m.getMazeArray(ax, ay)==' ')
|
|
{
|
|
m.setMazeArray(ax, ay,' ');
|
|
cout << " ";
|
|
}
|
|
a.gotoXY(ax,ay);
|
|
a.changeColour(FOREGROUND_GREEN | FOREGROUND_BLUE);
|
|
if (m.getMazeArray(ax, ay)=='!')
|
|
{
|
|
m.setMazeArray(ax, ay,'!');
|
|
cout << "!";
|
|
}
|
|
else if (m.getMazeArray(ax, ay)=='*')
|
|
{
|
|
m.setMazeArray(ax, ay,'*');
|
|
cout << "*";
|
|
}
|
|
else if (m.getMazeArray(ax, ay)=='#')
|
|
{
|
|
m.setMazeArray(ax, ay,'#');
|
|
cout << "#";
|
|
}
|
|
|
|
|
|
do{
|
|
|
|
do{
|
|
d = rand() % 4 + 1;
|
|
if (m.getMazeArray(ax, ay-1)!='-' && m.getMazeArray(ax, ay-1)!='|' && d == 1)
|
|
break;
|
|
else if (m.getMazeArray(ax, ay+1)!='-' && m.getMazeArray(ax, ay+1)!='|'&& d == 4)
|
|
break;
|
|
else if (m.getMazeArray(ax-1, ay)!='-' && m.getMazeArray(ax-1, ay)!='|'&& d == 2)
|
|
break;
|
|
else if (m.getMazeArray(ax+1, ay)!='-' && m.getMazeArray(ax+1, ay)!='|'&& d == 3)
|
|
break;
|
|
}while (true);
|
|
}while (d == 5 - direction ||
|
|
(d == 4 && (ax==8 && ay==5))||
|
|
(d == 4 && (ax==9 && ay==5))||
|
|
(d == 4 && (ax==10 && ay==5))||
|
|
(d == 4 && (ax==11 && ay==5))||
|
|
(d == 4 && (ax==12 && ay==5)));
|
|
|
|
|
|
|
|
switch(d){
|
|
case 1:
|
|
ay--;
|
|
direction = 1;
|
|
break;
|
|
|
|
case 4:
|
|
ay++;
|
|
direction = 4;
|
|
break;
|
|
|
|
case 2:
|
|
ax--;
|
|
direction = 2;
|
|
break;
|
|
|
|
case 3:
|
|
ax++;
|
|
direction = 3;
|
|
break;
|
|
}
|
|
a.gotoXY(ax,ay);
|
|
cout << g;
|
|
|
|
|
|
}
|
|
|
|
void Ghost::slowMove(Maze &m, Utilities a)
|
|
{
|
|
|
|
if (speed > 0)
|
|
{
|
|
--speed;
|
|
return;
|
|
}
|
|
speed = 200;
|
|
|
|
|
|
a.gotoXY(ax,ay);
|
|
a.changeColour(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
|
|
if (m.getMazeArray(ax, ay)=='X')
|
|
{
|
|
m.setMazeArray(ax, ay,'X');
|
|
cout << "X";
|
|
}
|
|
else if (m.getMazeArray(ax, ay)=='.')
|
|
{
|
|
m.setMazeArray(ax, ay,'.');
|
|
cout << ".";
|
|
}
|
|
else if (m.getMazeArray(ax, ay)==' ')
|
|
{
|
|
m.setMazeArray(ax, ay,' ');
|
|
cout << " ";
|
|
}
|
|
|
|
else if (m.getMazeArray(ax, ay)=='!')
|
|
{
|
|
m.setMazeArray(ax, ay,'!');
|
|
cout << "!";
|
|
}
|
|
else if (m.getMazeArray(ax, ay)=='*')
|
|
{
|
|
m.setMazeArray(ax, ay,'*');
|
|
cout << "*";
|
|
}
|
|
else if (m.getMazeArray(ax, ay)=='#')
|
|
{
|
|
m.setMazeArray(ax, ay,'#');
|
|
cout << "#";
|
|
}
|
|
|
|
|
|
do{
|
|
|
|
do{
|
|
d = rand() % 4 + 1;
|
|
if (m.getMazeArray(ax, ay-1)!='-' && m.getMazeArray(ax, ay-1)!='|' && d == 1)
|
|
break;
|
|
else if (m.getMazeArray(ax, ay+1)!='-' && m.getMazeArray(ax, ay+1)!='|'&& d == 4)
|
|
break;
|
|
else if (m.getMazeArray(ax-1, ay)!='-' && m.getMazeArray(ax-1, ay)!='|'&& d == 2)
|
|
break;
|
|
else if (m.getMazeArray(ax+1, ay)!='-' && m.getMazeArray(ax+1, ay)!='|'&& d == 3)
|
|
break;
|
|
}while (true);
|
|
}while (d == 5 - direction ||
|
|
(d == 4 && (ax==8 && ay==5))||
|
|
(d == 4 && (ax==9 && ay==5))||
|
|
(d == 4 && (ax==10 && ay==5))||
|
|
(d == 4 && (ax==11 && ay==5))||
|
|
(d == 4 && (ax==12 && ay==5)));
|
|
|
|
|
|
|
|
switch(d){
|
|
case 1:
|
|
ay--;
|
|
direction = 1;
|
|
break;
|
|
|
|
case 4:
|
|
ay++;
|
|
direction = 4;
|
|
break;
|
|
|
|
case 2:
|
|
ax--;
|
|
direction = 2;
|
|
break;
|
|
|
|
case 3:
|
|
ax++;
|
|
direction = 3;
|
|
break;
|
|
}
|
|
a.gotoXY(ax,ay);
|
|
cout << g;
|
|
|
|
|
|
}
|
|
|
|
|
|
void Ghost::EatPacman(Pacman &p, Game &g, Utilities &a,Utilities &u,Utilities &j, Utilities &k, Utilities &l, Ghost &o, Ghost &m, Ghost &n)
|
|
{
|
|
|
|
if (ax == p.getPacmanX() && ay == p.getPacmanY())
|
|
{
|
|
g.life--;
|
|
Ghost::ResetGhost(a);
|
|
n.ResetGhost(j);
|
|
m.ResetGhost(k);
|
|
o.ResetGhost(l);
|
|
p.Die(u);
|
|
}
|
|
}
|
|
|
|
void Ghost::ResetGhost(Utilities &a){
|
|
a.gotoXY(ax, ay);
|
|
a.changeColour(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
|
|
cout << " ";
|
|
Ghost::ResetLocation();
|
|
a.gotoXY(ax, ay);
|
|
a.changeColour(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
|
|
cout << g;
|
|
}
|
|
void Ghost::ResetLocation(){
|
|
|
|
ax = OrgX;
|
|
ay = OrgY;
|
|
}
|
|
void Ghost::RechangePosition(){
|
|
|
|
if(g == "a")
|
|
g = "A";
|
|
else if(g == "b")
|
|
g = "B";
|
|
else if(g == "c")
|
|
g = "C";
|
|
else if(g == "d")
|
|
g = "D";
|
|
}
|
|
int Ghost::GetGhostX(){
|
|
return ax;
|
|
}
|
|
int Ghost::GetGhostY(){
|
|
return ay;
|
|
}
|
|
string Ghost::GetGhostMember(){
|
|
return g;
|
|
}
|
|
Ghost::~Ghost(){
|
|
|
|
} |