C++ Tutorial 21 - Simple Pong Game Source Code
C++ Tutorial 21 - Simple Pong Game Source Code
#include <time.h>
#include <conio.h>
using namespace std;
enum eDir { STOP = 0, LEFT = 1, UPLEFT = 2, DOWNLEFT = 3, RIGHT = 4, UPRIGHT = 5
, DOWNRIGHT = 6};
class cBall
{
private:
int x, y;
int originalX, originalY;
eDir direction;
public:
cBall(int posX, int posY)
{
originalX = posX;
originalY = posY;
x = posX; y = posY;
direction = STOP;
}
void Reset()
{
x = originalX; y = originalY;
direction = STOP;
}
void changeDirection(eDir d)
{
direction = d;
}
void randomDirection()
{
direction = (eDir)((rand() % 6) + 1);
}
inline int getX() { return x; }
inline int getY() { return y; }
inline eDir getDirection() { return direction; }
void Move()
{
switch (direction)
{
case STOP:
break;
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
case UPLEFT:
x--; y--;
break;
case DOWNLEFT:
x--; y++;
break;
case UPRIGHT:
x++; y--;
break;
case DOWNRIGHT:
x++; y++;
break;
default:
break;
}
}
friend ostream & operator<<(ostream & o, cBall c)
{
o << "Ball [" << c.x << "," << c.y << "][" << c.direction << "]"
;
return o;
}
};
class cPaddle
{
private:
int x, y;
int originalX, originalY;
public:
cPaddle()
{
x = y = 0;
}
cPaddle(int posX, int posY) : cPaddle()
{
originalX = posX;
originalY = posY;
x = posX;
y = posY;
}
inline void Reset() { x = originalX; y =
inline int getX() { return x; }
inline int getY() { return y; }
inline void moveUp() { y--; }
inline void moveDown() { y++; }
friend ostream & operator<<(ostream & o,
{
o << "Paddle [" << c.x << "," <<
return o;
}
};
class cGameManger
{
private:
int width, height;
int score1, score2;
char up1, down1, up2, down2;
bool quit;
cBall * ball;
cPaddle *player1;
cPaddle *player2;
public:
cGameManger(int w, int h)
{
srand(time(NULL));
quit = false;
up1 = 'w'; up2 = 'i';
down1 = 's'; down2 = 'k';
score1 = score2 = 0;
width = w; height = h;
ball = new cBall(w / 2, h / 2);
player1 = new cPaddle(1, h / 2 -
originalY; }
cPaddle c)
c.y << "]";
3);
if (j == width - 1)
cout << "\xB2";
}
cout << endl;
}
for (int i = 0; i < width + 2; i++)
cout << "\xB2";
cout << endl;
cout << "Score 1: " << score1 << endl << "Score 2: " << score2 <
< endl;
}
void Input()
{
ball->Move();
int
int
int
int
int
int
ballx = ball->getX();
bally = ball->getY();
player1x = player1->getX();
player2x = player2->getX();
player1y = player1->getY();
player2y = player2->getY();
if (_kbhit())
{
char current = _getch();
if (current == up1)
if (player1y > 0)
player1->moveUp();
if (current == up2)
if (player2y > 0)
player2->moveUp();
if (current == down1)
if (player1y + 4 < height)
player1->moveDown();
if (current == down2)
if (player2y + 4 < height)
player2->moveDown();
if (ball->getDirection() == STOP)
ball->randomDirection();
if (current == 'q')
quit = true;
}
}
void Logic()
{
int ballx = ball->getX();
int bally = ball->getY();
int player1x = player1->getX();
int player2x = player2->getX();
int player1y = player1->getY();
int player2y = player2->getY();
//left paddle
for (int i = 0; i < 4; i++)
if (ballx == player1x + 1)
if (bally == player1y + i)
ball->changeDirection((eDir)((rand() % 3
) + 4));
//right paddle
for (int i = 0; i < 4; i++)
if (ballx == player2x - 1)
if (bally == player2y + i)
ball->changeDirection((eDir)((rand() % 3
) + 1));
//bottom wall
if (bally == height - 1)
ball->changeDirection(ball->getDirection() == DOWNRIGHT
? UPRIGHT : UPLEFT);
//top wall
if (bally == 0)
ball->changeDirection(ball->getDirection() == UPRIGHT ?
DOWNRIGHT : DOWNLEFT);
//right wall
if (ballx == width - 1)
ScoreUp(player1);
//left wall
if (ballx == 0)
ScoreUp(player2);
}
void Run()
{
while (!quit)
{
Draw();
Input();
Logic();
}
}
};
int main()
{
cGameManger c(40, 20);
c.Run();
return 0;
}