الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برمجة لعبة كرة المضرب

مغلق
بدأه madi في 8 يناير 2002 · 2 رد · 805 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام

هده مجموعة دروس لكي نصنع لعبة كرة مضرب .

بسم الله الرحمن الرحيم

الدرس الاول

في هدا الدرس سوف نحاول تكوين برنامج بسط كمقدمة لباقي اجزاء اللعبة , حيت سنكتفي بتكوين برنامج يقوم بتحريك الكرة داخل الفورم , بحيت تتحرك في جميع اتجاهات الفورم وتصطدم بالهوامش العلوية و السفلية و الجانبية وترتد بالاتجاه المعاكس .

game

كون مشروع جديد , تم قم بتخزينه .

بدلك تكون كونت اللعبة , والى اللقاء في مشاريع اخرى , :P

يا أخي انا بس بهزر معاك , يلى نبداء . ;)

ضع الادوات التالية على الفورم

1) Timer توقيت ©

-عدل خاصية Enabled الى false

2) ضع زرين على الفورم تم عدل خاصية Caption

- الاول ضعها Paly

- التاني ضعها Stop

3) ضع شكل Shape على الفورم تم قم بتعديل التالي

- غير اسمه name الي Ball

- غير الخاصية Shape الى stCircle لياخد شكل الدائرة

-من خاصية Brunsh تم خاصية Color غير لونه الى اللون الدي تريد .

-باستخدام الماوس صغر في حجمه .

الان نحن جاهزين لندخل مرحلة البرمجة , استراحة قصيرة مع الاعلان تم نعود بعدها . :mad:

اول خطوة برمجية هي

1- تعريف متغيران خارجييان هما Horizontal,Vertical

وهما لتحديد الحركة الافقية و العمودية للكرة , وسوف اضع جزء من الكود لكي تعرف مكان التعريف بالضبط .

 

var
  Form1: TForm1;
  Horizontal,Vertical: integer;


implementation

{$R *.DFM}

انه قبل جزء التمتيل implementation وبعد تعريف متغير الفورم

Form1: TForm1;

هدا المكان دائما يستخدم لتعريف المتغيرات الخارجية .

2-الخطو ة التانية هي اعطاء المتغيران قيمتهما الابتدائية , ودلك بالضغط المتتالي على الفورم = يعني في الحدت oncreate =

اكتب الحطوات التالية بين امري Begin و End

Horizontal := 20;

Vertical := -5;

3- الخطوة التالتة هي برمجة زر Play وهو زر بدء اللعبة .

بعد الضغط مرتين بالماوس على زر Play , اكتب الحطوات التالية بين امري Begin و End

 Timer1.Enabled:=true;

وهي خطوة تفيد بداء تنفيد التوقيت .

4- الخطوت الرابعة هي هي برمجة زر ايقاف اللعبة Stop

بعد الضغط مرتين بالماوس على زر Play , اكتب الخطوات التالية بين امري Begin و End

  Timer1.Enabled:=false;

5- الخطو الاخيرة و المهمة جدا هي تحريك الكرة و معرفة الحدود التي يجب ان ترتد عندها الكرة .وهدا كله يتم داخل التوقيت Timer

بالضغط مرتين على Timer

اكتب الخطوات التالية بين امري Begin و End

 

    if (Ball.Top < 0) or (Ball.Top + Ball.Height > form1.Height) then
      Vertical := Vertical * -1;


    If (Ball.Left <0 ) or  (Ball.left + Ball.Width > form1.Width ) then
      Horizontal := Horizontal * -1;


    Ball.Top := Ball.Top + Vertical;       //Move the ball

    Ball.Left := Ball.Left + Horizontal;   //

اول امر هو امر مقارنة , حيت نتبين من وصول الكرة الى الهامش السفلي للفورم Ball.Top < 0 او وصولها الى الهامش العلوي لها

Ball.Top + Ball.Height > form1.Height

وادا حدت دلك يتم تغيير اتجاه حركة الكرة العمودية في الاتجاه المعاكس

Vertical := Vertical * -1;

المقارنة التانية , نتبين بها من وصول الكرة الى الهوامش الجانبية

الايسر Ball.Left <0

و الايمن Ball.left + Ball.Width > form1.Width

وادا حدت دلك يتم تغيير اتجاه حركة الكرة الافقية في الاتجاه المعاكس

Horizontal := Horizontal * -1;

الخطوتين الاخيرتين يتم فيهما تحريك الكرة في الاتجاه المناسب

Ball.Top := Ball.Top + Vertical;

Ball.Left := Ball.Left + Horizontal;

و اخيرا بعد ان تتم مرحلة البرمجة , نفد وشوف النتيجة .

تلا حظ ان حركة الكرة بطيئة جدا , لتجعلها سريعة قم بتعديل

خاصية Interval في التوقيت Timer وصغر في قيمتها الى 50

وشوف النتيجة .

وشكرا

madi

#2

الدرس التاني :

بعد ان اكملن الدرس الاول , لنبدا المرحلة التانية من اللعبة , حيت سنضيف الى اللعبية مضرب , ولان المضارب غالية التمن سوف نستخدم Shape لعمل المضرب .

game2

1-افتح المشروع السابق ( اللعبة السابق ) ,

2-ضع shape على الفورم ملاصقا للجانب الايسر تماما ,تم قم

-تعديل الخاصية Shape

Shape:= stRectangle

-سمه Paddle

-صغر في حجمه قليلا و خاصة من حيت Width السمك ,

3-الان سوف نحتاج الى تحريك المضرب اى اعلى والى اسفل عند الضغط على مفتاحي اعلو واسفل في لوحة المفاتيح , لعمل دلك ادهب الى الحدت OnKeyDown و ضع الاوامر التالية ,

 
  If (Key = VK_DOWN) then     //Down Arrow
  begin
    paddle.Top := paddle.top + 20;
  end
  else if (Key = VK_UP) then   //Up Arrow
  begin
    paddle.Top := paddle.Top - 20;
  end

معنى هدا عندما يقوم أي شخص بالضغط على أي مفتاح فى لوحة المفاتيح سوف ينفد هدا الحدت ويكون المفتاح المضغوط موجود في المتغير Key , لدلك نستخدمه للمقارنة , حيت نقارن ادا كان المفتاح المضغوك هو مفتاح اسفل

If (Key = VK_DOWN) then

في هده الحالة نحرك المضرب الى اسفل

paddle.Top := paddle.top + 20;

الان نقد البرنامج وجرب ان تضغط مفتاح اعلى واسفل , مادا تلاحظ ,,,,

تجد ان المضرب لا يتحرك و انما كلما ضغطنا مفتاحي اعلى و اسفل فانه يتم الانتقال بين زر Play و زر Stop الموجودين على الفورم , و السبب في دلك هي خاصية Tab الخاصة بالفورم , وهده الخاصية تسمح لك بالانتقال بين العناصر الموجودة على الفورم باستخدام مفتاح Tab او باستخدام مفاتيح الاتجاه الاربعة , و لكي نوقف هده الحاصية يمكن اتباع الطريقة التالية ,

ادهب الى زر Paly الموجود على الفورم , قم بتعديل الخاصية TabStop وضعها False

كرر نفس العمل للزر Stop ,

هده الخاصية Tabstop تسمح للمستخدم الوصول او عدم الوصول الى هدا الكائن باستخدام مفتاح Tab ,

الان نفد البرنامج .

وشكرا

مــــMADIــــدي

#3

سأضع الكود كاملا ,

انت فقط تحتاج الى ,

- PnlTable وهو Panel , قم بتعديل الخاصية Align تساوي top , تم ضع عليه كل من الكرة و المضربين فقط ,

- Paddle1 المضرب الأول ونوعه Shape

- Paddle2 المضرب الثاني ونوعه Shape

- tmrGame توقيت

- Ball الكرة نوعها Shape

- cmdPlay وهو زر التشغيل

- lblP1Score يحسب نقاط اللعب الأول و نوعه Lable

- lblP2Score يحسب نقاط اللعب الثاني وهو Lable

- lblTime لإظهار الوقت ونوعه Lable

استخدم مفاتيح الاتجاه لتحريك المضرب الاول , والمفاتيح A و Q لتحريك المضرب التاني ,

[l]



unit Unit1;



interface



uses

  Windows, Messages, SysUtils,  Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls, StdCtrls;



type

  TForm1 = class(TForm)

    pnlTable: TPanel;

    Paddle1: TLabel;

    tmrGame: TTimer;

    Paddle2: TLabel;

    Ball: TShape;

    cmdPlay: TButton;

    lblP1Score: TLabel;

    lblP2Score: TLabel;

    lblTime: TLabel;

    procedure cmdPlayClick(Sender: TObject);

    procedure tmrGameTimer(Sender: TObject);

    procedure FormKeyDown(Sender: TObject; var Key: Word;

      Shift: TShiftState);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;



  { Game Variables }

  Horizontal: ShortInt;

  Vertical: ShortInt;



  P1Score: Integer;

  P2Score: Integer;



  SecsPlayed: Longword;

  FractionSec: ShortInt;

implementation



{$R *.dfm}



procedure TForm1.cmdPlayClick(Sender: TObject);

begin

  { Begin Playing the Game }

  cmdPlay.Enabled := False;



  { The horizontal speed of the ball along with the vertical rise }

  Horizontal := 20;

  Vertical := -5;



  { Enable the timer which runs the game }

  tmrGame.Enabled := True;

end;



procedure TForm1.tmrGameTimer(Sender: TObject);

begin

  { Main actions of the program }



  FractionSec := FractionSec + 1;    //Counts to 20 in one second



  If (FractionSec = 20 ) then    //Loops 20 times in a second

  begin

    FractionSec := 0;

    SecsPlayed := SecsPlayed + 1;

    lblTime.Caption := IntToStr(SecsPlayed);

  end;



  { Detect when the ball leaves the screen }

  if (Ball.Left <= -17) then       //Calculate scores

  begin

    { Player 2 Scores }



    { Pause to wait }

    tmrGame.Enabled := False;

    cmdPlay.Enabled := True;



    { Add Score }

    P2Score := P2Score + 1;

    lblP2Score.Caption := IntToStr(P2Score);

    MessageBox(0, 'Player 2 Scores!', 'Score', MB_OK);



    { Reset the variables }

    Ball.Left := 388;

    Ball.Top := 172;

  end

  else if (Ball.Left >= pnlTable.Width) then

  begin

    { Player 1 Scores }



    { Pause to wait }

    tmrGame.Enabled := False;

    cmdPlay.Enabled := True;



    { Add Score }

    P2Score := P2Score + 1;

    lblP1Score.Caption := IntToStr(P2Score);

    MessageBox(0, 'Player 1 Scores!', 'Score', MB_OK);



    { Reset the variables and pause }

    Ball.Left := 388;

    Ball.Top := 172;

  end

  else

  begin

    { Bounce off of walls }

    if (Ball.Top <= 0) or (Ball.Top + Ball.Height >= pnlTable.Height) then

      Vertical := Vertical * -1;



    { Check for collision with paddles and reset tradjectory in opposite direction}

    If (Ball.Left <= 26) and (Ball.Top >= Paddle1.Top) and (Ball.Top <= Paddle1.Top + Paddle1.Height) then //Bounce off of player 1

      Horizontal := Horizontal * -1;



    If (Ball.Left >= 662) and (Ball.Top >= Paddle2.Top) and (Ball.Top <= Paddle2.Top + Paddle2.Height) then //Bounce off of player 2

      Horizontal := Horizontal * -1;



    Ball.Top := Ball.Top + Vertical;       //Move the ball

    Ball.Left := Ball.Left + Horizontal;   //

  end;

end;



procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

begin

  { Register the Keys Pressed by the users }

  If (Key = VK_DOWN) then     //Down Arrow

  begin

    paddle2.Top := paddle2.top + 20;

  end

  else if (Key = VK_UP) then   //Up Arrow

  begin

    paddle2.Top := paddle2.Top - 20;

  end



  else if (Key = 65) then      //A Key

  begin

    paddle1.Top := paddle1.Top + 20;

  end

  else if (Key = 81) then      //Q key

    paddle1.Top := paddle1.Top - 20;

end;



end.



[/l]

وشكرا

مــــMADIــــدي

هذا الموضوع مغلق.

مواضيع مشابهة