0% found this document useful (0 votes)
916 views

C++ Tutorial 21 - Simple Pong Game Source Code

This document contains C++ code that defines classes for objects in a Pong-style game including a Ball class, Paddle class, and GameManager class. The Ball class tracks position and direction. The Paddle class represents player paddles. The GameManager class initializes and controls the game loop, handling display, input, ball/paddle logic, and scoring. It uses the Ball and Paddle classes to represent the game state and control game play, resetting on scores and changing the ball direction during collisions.

Uploaded by

hahaha
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
916 views

C++ Tutorial 21 - Simple Pong Game Source Code

This document contains C++ code that defines classes for objects in a Pong-style game including a Ball class, Paddle class, and GameManager class. The Ball class tracks position and direction. The Paddle class represents player paddles. The GameManager class initializes and controls the game loop, handling display, input, ball/paddle logic, and scoring. It uses the Ball and Paddle classes to represent the game state and control game play, resetting on scores and changing the ball direction during collisions.

Uploaded by

hahaha
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

#include <iostream>

#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);

player2 = new cPaddle(w - 2, h / 2 - 3);


}
~cGameManger()
{
delete ball, player1, player2;
}
void ScoreUp(cPaddle * player)
{
if (player == player1)
score1++;
else if (player == player2)
score2++;
ball->Reset();
player1->Reset();
player2->Reset();
}
void Draw()
{
system("cls");
for (int i = 0; i < width + 2; i++)
cout << "\xB2";
cout << endl;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int ballx = ball->getX();
int bally = ball->getY();
int player1x = player1->getX();
int player2x = player2->getX();
int player1y = player1->getY();
int player2y = player2->getY();
if (j == 0)
cout << "\xB2";
if (ballx == j && bally == i)
cout << "O"; //ball
else if (player1x == j && player1y == i)
cout << "\xDB"; //player1
else if (player2x == j && player2y == i)
cout << "\xDB"; //player2
else if (player1x == j && player1y + 1 == i)
cout << "\xDB"; //player1
else if (player1x == j && player1y + 2 == i)
cout << "\xDB"; //player1
else if (player1x == j && player1y + 3 == i)
cout << "\xDB"; //player1
else if (player2x == j && player2y + 1 == i)
cout << "\xDB"; //player1
else if (player2x == j && player2y + 2 == i)
cout << "\xDB"; //player1
else if (player2x == j && player2y + 3 == i)
cout << "\xDB"; //player1
else
cout << " ";

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;
}

You might also like