تبلیغات
IASBS IT - بازی ping-pong به زبان ++c
" Information is not knowledge " Albert Einstein

بازی ping-pong به زبان ++c

نویسنده : مسعود امجدی
ارسال شده در: برنامه نویسی ،

من این برنامه رو برای پروژه ی ترم دومم که باید 17 فروردین تحویل بدم نوشتم  .  مرحله به مرحله توضیحات رو نوشتم تا کاملا بفهمین . اگه تو جاییش مشکلی داشتین تو نظرات برام بنویسین تا توضیح بدم .

به ادامه ی مطلب برین . . .

کتابخونه ی مورد استفاده : Turbo c++ BGI

سیستم مورد نیاز : Windows XP Professional - Turbo c++ 3.0 installed in c:\TC

نوشتن تابع () main :

اولین چیزی که برای هر برنامه ای نیاز هست Include# کردن کتابخونه ها و نوشتن تابع () main می باشد . تنها کتابخونه ای که ما نیاز داریم <graphics.h> می باشد . Include کردن فایل های اضافی باعث افزایش حجم برنامه شده و زمان اجرا رو زیاد می کنه .

کد اولیه شما باید شبیه کد زیر باشد :

#include <graphics.h>

int main ()

{
           

return 0;

}

آماده سازی گرافیک :

حالا ما گرافیک رو وارد () main می کنیم و منتظر می مانیم تا کاربر یک کلید فشار دهد تا از حالت گرافیکی خارج شویم . اگر کد را اجرا کنید یک صفحه ی خالی را خواهید دید . اگر error داد برین و مطمین شین که TC رو در مسیر   c:\TC  نصب کردین . رزولوشن بازی ما 480*640 و در VGA mode خواهد بود . این نوع گرافیک به اندازه ی کافی برای بازی خوب است . اگر گرافیک بهتری خواستید می توانید آنرا تغییر دهید . حالا کد شما باید . . .

#include <graphics.h>

int main ()
{
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");       // Intializes Graphics
getch ();                                                      // Key Press
closegraph ();                                              // Close Graphics
return 0;
}

اطلاعات بازی :

در این بازی ما به داده های زیر نیاز دازیم .

score : Player A Score & Player B Score

Bats : Length, Width, X Coordinate, Old Y Coordinate, New Y Coordinate

Ball : Radius,Speed in X Direction, Speed in Y Direction, Old X center , Old Y center, New X centre, New Y centre

شما می توانید این پارامتر ها رو اون طور که دوست دارین تغییر بدین ولی دقت کنین که باید در همه ی برنامه این کارو بکنین و الا برنامه همش error  میده .

ما برای این داده ها از struct  استفاده می کنیم . یعنی یه struct  برای دسته ها (bats) ؛ یه  struct برای توپ و یه struct برای امتیازها (scores) درست می کنیم .

#include <graphics.h>

struct bat
{
 int l;                              //Length
 int w;                            //Width
 int xc;                           //xcoordinate
 int nyc;                         //new_ycoordinate
 int oyc;                         //old_ycoordinate
}batA, batB;                 
// Create Two Bats For Each User.

struct ball
{
 int r;                                //radius
 int xs;                             //speedx
 int ys;                             //speedy
 int ox;                            //old_xcenter
 int oy;                            //old_ycenter
 int nx;                            //new_xcenter
 int ny;                            //new_ycenter
}ball1;

struct score
{
  int score_A;
  int score_B;
}score_game;

int main ()

{
 int gdriver = DETECT, gmode;
 initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); // Intializes Graphics
 getch (); // Key Press
 closegraph (); // Close Graphics
 return 0;
}

آماده سازی اولیه بازی :

حالا ما توابع مورد نیاز  برای بازی رو می نویسیم و یک محیط بدون اشیا ی متحرک ایجاد می کنیم . اگه نفهمدین که یکی از تابع ها چه کاری رو انجام می ده روش Ctrl + F1 رو بزنین تا از help خود TC استفاده کنین . بعد از نوشتن توابع برنامه به صورت زیر در میاد .

#include <graphics.h>

struct bat
{
 int l;                              //Length
 int w;                            //Width
 int xc;                           //xcoordinate
 int nyc;                         //new_ycoordinate
 int oyc;                         //old_ycoordinate
}batA, batB;                 
// Create Two Bats For Each User.

struct ball
{
 int r;                                //radius
 int xs;                             //speedx
 int ys;                             //speedy
 int ox;                            //old_xcenter
 int oy;                            //old_ycenter
 int nx;                            //new_xcenter
 int ny;                            //new_ycenter
}ball1;

struct score
{
  int score_A;
  int score_B;
}score_game;

void initialize () // Initialize the game.

{
 char tempstring [10]; //This String holds score in char format temporarily
 
 //Initialise Bat A
 
 batA.l = 20;
 batA.w = 2;
 batA.xc = 20;
 batA.nyc = 237;
 batA.oyc = 237;
 
 // Intialise Bat B
 
 batB.l = 20;
 batB.w = 2;
 batB.xc = 620;
 batB.nyc = 237;
 batB.oyc = 237;
 
 // Intialise Ball


 ball1.r = 3;
 ball1.xs = 4;
 ball1.ys = 0;
 ball1.ox = 320;
 ball1.oy = 250;
 ball1.nx = 320;
 ball1.ny = 250;
 
 // Initialise Score
 score_game.score_A = 0;
 score_game.score_B = 0;
 
 // Set Background to BLACK

 setbkcolor (BLACK);

 // Draw Ball at Initial Position
 setfillstyle (1,15);
 fillellipse (ball1.nx,ball1.ny,ball1.r,ball1.r);

 // Draw Bats at Intial Position
 bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
 bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);

 // Display Score
 textcolor ();
 sprintf (tempstring,"A - %d",score_game.score_A);
 outtextxy (10,450,tempstring);
 sprintf (tempstring,"B - %d",score_game.score_A);
 outtextxy (590,450,tempstring);

}

int main ()

{
 int gdriver = DETECT, gmode;
 initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); // Intializes Graphics
 initialize ();
 getch (); // Key Press
 closegraph (); // Close Graphics
 return 0;
} 

موتور بازی :

حالا ما یک قدم بزرگ بر می داریم و از برنامه نویسی static (غیر متحرک) به برنامه نویسی dynamic (متحرک) میریم و یک موتور بازی طراحی می کنیم تا اونچه رو که می خواهیم انجام بده . تغییراتی که باید انجام بشه :

1. دسته های هر دو بازیکن باید به بالا و پایین حرکت کنند .

2 . توپی که توسط کامپیوتر کنترل می شود بین دو دسته حرکت می کند .

3 . وقتی بازیکنی توپ رو نتونه بزنه امتیازات تغییر می کنه .

تمام این کارهایی که در  موتور بازی ما اتفاق خواهد افتاد را تابعی به نام () play انجام خواهد داد . این تابع از یک حلقه ی بینهایت تشکیل شده که تا وقتی کلید Q فشرده نشود ادامه می یابد . حالا بخش های مختلف موتور بازی رو طراحی می کنیم .

-- حرکت دسته ها (moving bats)

ما چهار دکمه ، دو تا برای Player A و دو تا برای Player B برای بالا و پایین رفتن انتخاب می کنیم . به صورت زیر :

A ---> Player A UP

Z ---> Player A DOWN

J ---> Player B UP

M ---> Player B DOWN

برای بررسی اینکه چه دکمهای زده شده ما از تابع () inportb استفاده می کنیم که در فایل کتابخونه ای <dos.h> تعریف شده . ما از پورت 0X60 که برای keyboard طراحی شده استفاده می کنیم . سپس از تابع switch case  برای عملکرد دسته استفاده می کنیم .

عملکرد دسته ها توسط تابعی به نام () movebat کنترل می شود. این تابع جای قبلی bat  رو پاک کرده و با محاسبه ی جای جدید bat رو در اونجا می کشه . حالا کد ما میشه ...

#include <graphics.h>
#include <dos.h>

struct bat
{
 int l;                              //Length
 int w;                            //Width
 int xc;                           //xcoordinate
 int nyc;                         //new_ycoordinate
 int oyc;                         //old_ycoordinate
}batA, batB;                 
// Create Two Bats For Each User.

struct ball
{
 int r;                                //radius
 int xs;                             //speedx
 int ys;                             //speedy
 int ox;                            //old_xcenter
 int oy;                            //old_ycenter
 int nx;                            //new_xcenter
 int ny;                            //new_ycenter
}ball1;

struct score
{
  int score_A;
  int score_B;
}score_game;

void initialize () // Initialize the game.

{
 char tempstring [10]; //This String holds score in char format temporarily
 
 //Initialise Bat A
 
 batA.l = 20;
 batA.w = 2;
 batA.xc = 20;
 batA.nyc = 237;
 batA.oyc = 237;
 
 // Intialise Bat B
 
 batB.l = 20;
 batB.w = 2;
 batB.xc = 620;
 batB.nyc = 237;
 batB.oyc = 237;
 
 // Intialise Ball


 ball1.r = 3;
 ball1.xs = 4;
 ball1.ys = 0;
 ball1.ox = 320;
 ball1.oy = 250;
 ball1.nx = 320;
 ball1.ny = 250;
 
 // Initialise Score
 score_game.score_A = 0;
 score_game.score_B = 0;
 
 // Set Background to BLACK

 setbkcolor (BLACK);

 // Draw Ball at Initial Position
 setfillstyle (1,15);
 fillellipse (ball1.nx,ball1.ny,ball1.r,ball1.r);

 // Draw Bats at Intial Position
 bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
 bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);

 // Display Score
 textcolor ();
 sprintf (tempstring,"A - %d",score_game.score_A);
 outtextxy (10,450,tempstring);
 sprintf (tempstring,"B - %d",score_game.score_A);
 outtextxy (590,450,tempstring);

void movebat(char input)
{
switch(input)

{

case 'A' :

  if(batA.nyc > 0) // top of screen.
                  {
                    batA.oyc = batA.nyc;
                    batA.nyc --;
                    setfillstyle (1,0); // Remove last postion.
                    bar (batA.xc,batA.oyc,batA.xc+batA.w,batA.oyc+batA.l);
                    setfillstyle (1,15); // Display New postion.
                    bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
                    break;
                  }
    
     case 'Z' :
               if (batA.nyc+ batA.l < 480) // buttom of the screen
          {
                    batA.oyc = batA.nyc;
                    batA.nyc ++;
                    setfillstyle (1,0); // Remove last postion.
                    bar (batA.xc,batA.oyc,batA.xc+batA.w,batA.oyc+batA.l);
                    setfillstyle (1,15); // Display New postion.
                    bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
                    break;
                   }
    
     case 'J' :
               if (batB.nyc > 0) //top of the screen
           {
                   batB.oyc = batB.nyc;
                   batB.nyc --;
                   setfillstyle (1,0); // Remove last postion.
                   bar (batB.xc,batB.oyc,batB.xc+batB.w,batB.oyc+batB.l);
                   setfillstyle (1,15); // Display New postion.
                   bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);
                   break;
                 }
   
    case 'M' :
              if (batB.nyc+batB.l < 480) //buttom of  the screen.
                {
                  batB.oyc = batB.nyc;
                  batB.nyc ++;
                  setfillstyle (1,0); // Remove last postion.
                  bar (batB.xc,batB.oyc,batB.xc+batB.w,batB.oyc+batB.l);
                  setfillstyle (1,15); // Display New postion.
                  bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);
                  break;
                }
    
   }

}

void play () //Game Engine

{
   while (inportb (0X60) != 16) // if Q press so exit

delay(10);
      if (inportb (0X60) == 30)  movebat ('A');
      if (inportb (0X60) == 44)  movebat ('Z');
      if (inportb (0X60) == 36)  movebat ('J');
      if (inportb (0X60) == 50)  movebat ('M');
    }
}
           

int main ()

{       
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); // Intializes Graphics
initialize ();
play ();                                   // Game Engine
closegraph ();                            // Close Graphics
return 0;
}

 

-- حرکت توپ (Move the ball)

حالا که د سته ها رو حرکت دادیم موقع حرکت دادن توپه . اگه سرعت توپ در راستای x مثبت باشه توپ به سمت راست میره و اگه منفی باشه توپ به چپ می ره .

اگه سرعت توپ در راستای y مثبت باشه به بالا می ره و اگه منفی باشه به پایین میره . اگه توپ به بالا یا پایین صفحه بخوره باید علامت سرعته y اش عوض شه . ما همه ی این کارا رو در تابعی به نام ()moveball انجام میدیم که در موتور بازی به کار میره .

همچنین باید حرکت توپ رو غیر قابل پیش بینی کنیم . بنابرین از توابع srand , rand  استفاده می کنیم تا سرعت y رو به طور رندوم عددی بین 0 تا 3 انتخاب کند . بنابرین به فایل کتابخونه ای <time.h> نیاز داریم .

** وقتی می گیم سرعت در راستای x  برابر 2 است یعنی در هر ثانیه توپ به اندازه ی 2 پیکسل در راستای  x حرکت می کند. پس واحد سرعت می شود   pixel per second

کد ما یه ذره بزرگتر شده اما نترسین فهمیدنش آسونه .

 

#include <graphics.h>
#include <dos.h>
#include <time.h>

struct bat
{

 int l;
 int w;
 int xc;
 int nyc;
 int oyc;
}batA, batB; // Create Two Bats For Each User.

struct ball
{
  int r;
  int xs;
  int ys;
  int ox;
  int oy;
  int nx;
  int ny;
}ball1;

struct score
{
  int score_A;
  int score_B;
}score_game;

void initialize () // Initialize the game.

{
 char tempstring [10]; //This String holds score temporarily
 time_t t;             // generate random number
       
 //Initialise Bat A
 batA.l = 20;
 batA.w = 2;
 batA.xc = 20;
 batA.nyc = 237;
 batA.oyc = 237;
 
 // Intialise Bat B
 batB.l = 20;
 batB.w = 2;
 batB.xc = 620;
 batB.nyc = 237;
 batB.oyc = 237;
 
 // Intialise Ball
 ball1.r = 3;
 ball1.xs = 2;
 srand((int) time(&t)); // Seed rand a random number
 ball1.ys = rand ()%3;// Sets speed from 0 to 3
 if (rand() % 2 == 0)
  {
    ball1.xs = - ball1.xs; // Generate Random X direction.
    ball1.ys = - ball1.ys; // Generate Random Y direction.
  }
 ball1.ox = 320;
 ball1.oy = 250;
 ball1.nx = 320;
 ball1.ny = 250;

 // Intialise Score
 score_game.score_A = 0;
 score_game.score_B = 0;
 
 // Set Background to BLACK

 setbkcolor (BLACK);
 
 // Draw Ball at Initial Position
 setfillstyle (1,15);
 fillellipse (ball1.nx,ball1.ny,ball1.r,ball1.r);
 
 // Draw Bats at Intial Position
 bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
 bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);
 
 // Display Score
 textcolor ();
 sprintf (tempstring,"A - %d",score_game.score_A);
 outtextxy (10,450,tempstring);
 sprintf (tempstring,"B - %d",score_game.score_A);
 outtextxy (590,450,tempstring);
 outtextxy (40,470,"Remove This Line by Learn Coding It yourself at http://iasbs-it.mihanblog.com");
        
}

void movebat (char input)

{
  switch (input)
      {
         case 'A' :
                   if (batA.nyc > 0) // top of screen.
                    {
                      batA.oyc = batA.nyc;
                      batA.nyc --;
                      setfillstyle (1,0); // Remove last postion.
                      bar (batA.xc,batA.oyc,batA.xc+batA.w,batA.oyc+batA.l);
                      setfillstyle (1,15); // Display New postion.
                      bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
                    }
                    break;
         case 'Z' :
                   if (batA.nyc+batA.l < 430) // buttom of the screen.
                    {
                      batA.oyc = batA.nyc;
                      batA.nyc ++;
                      setfillstyle (1,0); // Remove last postion.
                      bar (batA.xc,batA.oyc,batA.xc+batA.w,batA.oyc+batA.l);
                      setfillstyle (1,15); // Display New postion.
                      bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
                    }
                    break;
         case 'J' :
                   if (batB.nyc > 0) // top of screen.
                    {
                      batB.oyc = batB.nyc;
                      batB.nyc --;
                      setfillstyle (1,0); // Remove last postion.
                      bar (batB.xc,batB.oyc,batB.xc+batB.w,batB.oyc+batB.l);
                      setfillstyle (1,15); // Display New postion.
                      bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);
                    }
                    break;

          case 'M' :
                   if (batB.nyc+batB.l < 430) // buttom of the screen.
                    {
                      batB.oyc = batB.nyc;
                      batB.nyc ++;
                      setfillstyle (1,0); // Remove last postion.
                      bar (batB.xc,batB.oyc,batB.xc+batB.w,batB.oyc+batB.l);
                      setfillstyle (1,15); // Display New postion.
                      bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);
                    }
                    break;

         }

}

void moveball ()

{
  ball1.ox = ball1.nx;
  ball1.oy = ball1.ny;
  ball1.nx = ball1.nx + ball1.xs;
  ball1.ny = ball1.ny + ball1.ys;
  setcolor (0);
  setfillstyle (1,0);// Remove last postion.
  fillellipse (ball1.ox,ball1.oy,ball1.r,ball1.r);
  setfillstyle (1,15); // Display New postion.
  fillellipse (ball1.nx,ball1.ny,ball1.r,ball1.r);
  if ( ball1.ny - ball1.r < 0 ) ball1.ys = -ball1.ys; // Reflect From Top
  if ( ball1.ny + ball1.r > 430 ) ball1.ys = -ball1.ys; // Reflect From Bottom

}

void play ()

{
  while (inportb (0X60) != 16) // if Q pressed so exit
    {
      delay (10); // Reduce game speed
      if (inportb (0X60) == 30)  movebat ('A');
      if (inportb (0X60) == 44)  movebat ('Z');
      if (inportb (0X60) == 36)  movebat ('J');
      if (inportb (0X60) == 50)  movebat ('M');
      moveball ();
     }
}
           

int main ()

{
  int gdriver = DETECT, gmode;
  initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); // Intializes Graphics
  initialize ();
  play (); // Game Engine
  closegraph (); // Close Graphics
  return 0;
}

 

پردازش گر فیزیکی :

بخش مهم دیگر بازی پردازش گر فیزیکی بازی است . این بخش فیزیک بازی رو بررسی می کنه تا بیشتر به محیط واقعی شبیه شه . در این بازی ساده این بخش خیلی هم پیچیده نیست ولی اگر بازی 3D باشد باید روی این بخش خیلی دقت کرد .

حالا ما فیزیک بازی مونو بررسی می کنیم تا ببینیم چه نیازی داریم . . .

1 . اگر توپ در چپ یا راست صفحه به دسته برخورد کند بازتاب می یابد در غیر این صورت توپ رد شده و یک امتیاز به طرف مقابل داده می شود و بازی از نو آغاز می گردد .

ما یک تابع به نام () phisics برای انجام این کارها ایجاد می کنیم .

در نهایت کد ما به صورت زیر تمام می شود . کد را کپی کرده و در یک new text document که ایجاد کرده اید paste کنید . سپس روی آن راست کلیک کرده و از منوی open with گزینه ی TC  رو انتخاب کنید .

 

#include <graphics.h>
#include <dos.h>
#include <time.h>

struct bat
{
 int l;
 int w;
 int xc;
 int nyc;
 int oyc;
}batA, batB; // Create Two Bats For Each User.

struct ball
{
 int r;
 int xs;
 int ys;
 int ox;
 int oy;
 int nx;
 int ny;
}ball1;

struct score
{
  int score_A;
  int score_B;
}score_game;


void initialize () // Initialize the game.

{
  int gdriver = DETECT, gmode;
  char tempstring [10]; //This String holds score
  time_t t; //  generate random number from system time.
  closegraph ();
  initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); // Intializes Graphics

  //Initialise Bat A
  batA.l = 40;
  batA.w = 2;
  batA.xc = 16;
  batA.nyc = 237;
  batA.oyc = 237;

  // Intialise Bat B
  batB.l = 40;
  batB.w = 2;
  batB.xc = 624;
  batB.nyc = 237;
  batB.oyc = 237;

   // Intialise Ball
   ball1.r = 3;
   ball1.xs = 2;
   srand((int) time(&t)); // Seed rand a random number
   ball1.ys = rand ()%1; // Sets speed from 0 to 2
   if (rand() % 2 == 0)
     {
       ball1.xs = - ball1.xs; // Generate Random X direction.
       ball1.ys = - ball1.ys; // Generate Random Y direction.
      }
    ball1.ox = 320;
    ball1.oy = 250;
    ball1.nx = 320;
    ball1.ny = 250;

   // Set Background to BLACK
   setbkcolor (BLACK);

   // Draw Ball at Initial Position
   setfillstyle (1,15);
   fillellipse (ball1.nx,ball1.ny,ball1.r,ball1.r);

   // Draw Bats at Intial Position
   bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
   bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);

   // Display Score
   textcolor ();
   sprintf (tempstring,"A - %d",score_game.score_A);
   outtextxy (10,450,tempstring);
   sprintf (tempstring,"B - %d",score_game.score_B);
   outtextxy (590,450,tempstring);
   outtextxy (130,462,"MASOUD AMJADI         iasbs-it.mihanblog.com");
}

void movebat (char input)

{
  switch (input)
     {
       case 'A' :
    if (batA.nyc > 0) // top of screen.
      {
        batA.oyc = batA.nyc;
        batA.nyc -=2;
        setfillstyle (1,0); // Remove last postion.
        bar (batA.xc,batA.oyc,batA.xc+batA.w,batA.oyc+batA.l);
        setfillstyle (1,15); // Display New postion.
        bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
       }
     break;

       case 'Z' :
    if (batA.nyc+batA.l < 430) // buttom of the screen.
      {
        batA.oyc = batA.nyc;
        batA.nyc +=2;
        setfillstyle (1,0); // Remove last postion.
        bar (batA.xc,batA.oyc,batA.xc+batA.w,batA.oyc+batA.l);
        setfillstyle (1,15); // Display New postion.
        bar (batA.xc,batA.nyc,batA.xc+batA.w,batA.nyc+batA.l);
      }
    break;
       case 'J' :
    if (batB.nyc > 0) // top of screen.
       {
        batB.oyc = batB.nyc;
        batB.nyc -=2;
        setfillstyle (1,0); // Remove last postion.
        bar (batB.xc,batB.oyc,batB.xc+batB.w,batB.oyc+batB.l);
        setfillstyle (1,15); // Display New postion.
        bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);
       }
    break;

 case 'M' :
    if (batB.nyc+batB.l < 430) // buttom of the screen.
      {
        batB.oyc = batB.nyc;
        batB.nyc +=2;
        setfillstyle (1,0); // Remove last postion.
        bar (batB.xc,batB.oyc,batB.xc+batB.w,batB.oyc+batB.l);
        setfillstyle (1,15); // Display New postion.
        bar (batB.xc,batB.nyc,batB.xc+batB.w,batB.nyc+batB.l);
      }
     break;
  }

}

void moveball ()

{
   ball1.ox = ball1.nx;
   ball1.oy = ball1.ny;
   ball1.nx = ball1.nx + ball1.xs;
   ball1.ny = ball1.ny + ball1.ys;
   setcolor (0);
   setfillstyle (1,0); // Remove last postion.
   fillellipse (ball1.ox,ball1.oy,ball1.r,ball1.r);
   setfillstyle (1,15); // Display New postion.
   fillellipse (ball1.nx,ball1.ny,ball1.r,ball1.r);
   if ( ball1.ny - ball1.r < 0 ) ball1.ys = -ball1.ys; // Reflect From Top
   if ( ball1.ny + ball1.r > 430 ) ball1.ys = -ball1.ys; // Reflect From Bottom
}

void physics ()

{
  char tempstring [10];
  if ( ball1.nx - ball1.r <= 20)
     {
         if (ball1.ny > batA.nyc && ball1.ny < batA.nyc+batA.l)
            {
               ball1.xs = - ball1.xs;
               ball1.ys = rand () % 2;// Sets speed from 0 to 2
               if (rand() % 2 == 0) ball1.ys = - ball1.ys; // Generate Random Y direction.
             }
          else // Reintialize entire game with new score
             {
               score_game.score_B ++;
               initialize ();
             }
          return;
      }

  if ( ball1.nx +  ball1.r > 620)
    
      {
         if (ball1.ny > batB.nyc && ball1.ny < batB.nyc+batB.l)
          {
            ball1.xs = - ball1.xs;
            ball1.ys = rand ()%2; // Sets speed from 0 to 2
            if (rand() % 2 == 0) ball1.ys = - ball1.ys; // Generate Random Y direction.
           }
         else // Reintialize game with new score
          {
           score_game.score_A ++;
           initialize ();
          }
           return;
       }
}

void play ()

{
  while (inportb (0X60) != 16) // if Q pressed so exit
     {
       delay (10); // Reduce game speed
       if (inportb (0X60) == 30)  movebat ('A');
       if (inportb (0X60) == 44)  movebat ('Z');
       if (inportb (0X60) == 36)  movebat ('J');
       if (inportb (0X60) == 50)  movebat ('M');
       moveball ();
       physics ();
      }
}
           

int main ()

{
  score_game.score_A = 0;
  score_game.score_B = 0;
  initialize ();
  play (); // Game Engine
  closegraph (); // Close Graphics
  return 0;
}

دانلود کد بازی

برنامه ی بالا  خیلی ساده نوشته شده . من یه ذره روی گرافیکش کار کردم . برنامه ی من حدود 400 خط شد ولی خیلی آسونه . من برا اولش یه LOADING گذاشتم .بعد از اون LOGO  خودمو گذاشتم . در آخر هم هر کی به امتیازه 5 برسه بازی رو میبره ! موفق باشین .

دانلود بازی ping-pong



نظرات: نظرات
با کلیک روی قلب یک امتیاز به این مطب بده