#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 = originalY; }
    inline int getX() { return x;}
    inline int getY() {return y;}
    inline void moveUp() { y--;}
    inline void moveDown() { y++;}
    friend ostream & operator<<(ostream & o, cPaddle c)
     {
         o << "Paddle [" << c.x << "," << c.y << "]";
         return o;
     }

};
class cGameManager
{
private:
    int width, height;
    int score1, score2;
    char up1, down1, up2, down2;
    bool quit;
    cBall * ball;
    cPaddle *player1;
    cPaddle *player2;
public:
  cGameManager(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 - 3);
      player2 = new cPaddle(w-2, h/2 - 3);
  }
   ~cGameManager()
   {
       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;
        cout << "Score 2: " << score2 << endl;

    }
    void Input()
    {
        ball->Move();

        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(_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()
{

    cGameManager c(40, 20);
    c.Run();

    return 0;
} 

C++ Online Compiler

Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++ and start coding!

Read inputs from stdin

OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.

#include <iostream>
#include <string>
using namespace std;

int main() 
{
    string name;
    cout << "Enter name:";
    getline (cin, name);
    cout << "Hello " << name;
    return 0;
}

About C++

C++ is a widely used middle-level programming language.

  • Supports different platforms like Windows, various Linux flavours, MacOS etc
  • C++ supports OOPS concepts like Inheritance, Polymorphism, Encapsulation and Abstraction.
  • Case-sensitive
  • C++ is a compiler based language
  • C++ supports structured programming language
  • C++ provides alot of inbuilt functions and also supports dynamic memory allocation.
  • Like C, C++ also allows you to play with memory using Pointers.

Syntax help

Loops

1. If-Else:

When ever you want to perform a set of operations based on a condition If-Else is used.

if(conditional-expression) {
   //code
}
else {
   //code
}

You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.

2. Switch:

Switch is an alternative to If-Else-If ladder.

switch(conditional-expression){    
case value1:    
 // code    
 break;  // optional  
case value2:    
 // code    
 break;  // optional  
......    
    
default:     
 code to be executed when all the above cases are not matched;    
} 

3. For:

For loop is used to iterate a set of statements based on a condition.

for(Initialization; Condition; Increment/decrement){  
  //code  
} 

4. While:

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while (condition) {  
// code 
}  

5. Do-While:

Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.

do {  
 // code 
} while (condition); 

Functions

Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.

How to declare a Function:

return_type function_name(parameters);

How to call a Function:

function_name (parameters)

How to define a Function:

return_type function_name(parameters) {  
 // code
}