منتدى مصر التقني
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

[Swing]مشروع برمجة لعبة الكرة النارية Breakout game

اذهب الى الأسفل

[Swing]مشروع برمجة لعبة الكرة النارية Breakout game Empty [Swing]مشروع برمجة لعبة الكرة النارية Breakout game

مُساهمة من طرف NEXT الأحد فبراير 23, 2020 7:16 pm

أهلا بكم 

العبة Breakout هي لعبة قديمة تم تطويرها في الأصل بواسطة شركة Atari Inc. وقد تم إنشاء اللعبة في عام 1976...في هذه اللعبة ، يقوم اللاعب بتحريك مضرب على الشاشة ويسترجع كرة أو كرات. الهدف هو تدمير الطوب في الجزء العلوي من النافذة.

[Swing]مشروع برمجة لعبة الكرة النارية Breakout game Breakout

سنقوم فى هذا المقال ببرمجة هذا اللعبة وذلك من خلال سبع فئات وهم على النحو التالى :


  1.  Commons.java 
  2.  Sprite.java 
  3.  Ball.java 
  4.  Paddle.java 
  5.  Brick.java 
  6.  Board.java 
  7.  Breakout.java 



1_كتابة محتوي الفئة Commons.java

يحتوي ملف Commons.java على بعض الثوابت الشائعة. يخزن ثوابت العرض والطول أبعاد اللوحة. عندما تمر الكرة على BOTTOM_EDGE ، تنتهي اللعبة. N_OF_BRICKS هو عدد الطوب في اللعبة. INIT_PADDLE_X و INIT_PADDLE_Y هما إحداثيات أولية للكائن المجذاف. يعد INIT_BALL_X و INIT_BALL_Y إحداثيات أولية لكائن الكرة. يعد DELAY التأخير الأولي بالمللي ثانية قبل تنفيذ المهمة و PERIOD هو الوقت بالميلي ثانية بين عمليات إعدام المهام المتعاقبة التي تشكل دورات اللعبة ....على النحو التالى :

الكود:

public interface Commons {
 
    public static final int WIDTH = 300;
    public static final int HEIGTH = 400;
    public static final int BOTTOM_EDGE = 390;
    public static final int N_OF_BRICKS = 30;
    public static final int INIT_PADDLE_X = 200;
    public static final int INIT_PADDLE_Y = 360;
    public static final int INIT_BALL_X = 230;
    public static final int INIT_BALL_Y = 355;  
    public static final int DELAY = 1000;
    public static final int PERIOD = 10;
}


2_كتابة محتوي الفئة Sprite

فئة Sprite هي فئة أساسية لجميع الكائنات في اللوحة. نضع هنا جميع الأساليب والمتغيرات الموجودة في كائنات Ball و Brick و Paddle ، مثل أساليب getImage () أو getX ()...على النحو التالى :

الكود:

import java.awt.Image;
import java.awt.Rectangle;

public class Sprite {

    protected int x;
    protected int y;
    protected int i_width;
    protected int i_heigth;
    protected Image image;

    public void setX(int x) {
        this.x = x;
    }

    public int getX() {
        return x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getY() {
        return y;
    }

    public int getWidth() {
        return i_width;
    }

    public int getHeight() {
        return i_heigth;
    }

    Image getImage() {
        return image;
    }

    Rectangle getRect() {
        return new Rectangle(x, y,
                image.getWidth(null), image.getHeight(null));
    }
}


3_كتابة محتوي الفئة Brick

هذه هي فئة الطوب
الكود:

import javax.swing.ImageIcon;

public class Brick extends Sprite {

    private boolean destroyed;

    public Brick(int x, int y) {
    
        this.x = x;
        this.y = y;

        ImageIcon ii = new ImageIcon("brick.png");
        image = ii.getImage();

        i_width = image.getWidth(null);
        i_heigth = image.getHeight(null);

        destroyed = false;
    }

    public boolean isDestroyed() {
    
        return destroyed;
    }

    public void setDestroyed(boolean val) {
    
        destroyed = val;
    }
}


4_كتابة محتوي الفئة Ball

الكود:

import javax.swing.ImageIcon;

public class Ball extends Sprite implements Commons {

    private int xdir;
    private int ydir;

    public Ball() {

        xdir = 1;
        ydir = -1;

        ImageIcon ii = new ImageIcon("ball.png");
        image = ii.getImage();

        i_width = image.getWidth(null);
        i_heigth = image.getHeight(null);

        resetState();
    }

    public void move() {
    
        x += xdir;
        y += ydir;

        if (x == 0) {
            setXDir(1);
        }

        if (x == WIDTH - i_width) {
            setXDir(-1);
        }

        if (y == 0) {
            setYDir(1);
        }
    }

    private void resetState() {
    
        x = INIT_BALL_X;
        y = INIT_BALL_Y;
    }

    public void setXDir(int x) {
        xdir = x;
    }

    public void setYDir(int y) {
        ydir = y;
    }

    public int getYDir() {
        return ydir;
    }
}
// الشفرة اعلاه لانشاء الكرة.

public void move() {
 
    x += xdir;
    y += ydir;

    if (x == 0) {
        setXDir(1);
    }

    if (x == WIDTH - i_width) {
        setXDir(-1);
    }

    if (y == 0) {
        setYDir(1);
    }
}
//الشفرة اعلاه طريقة لتحريك الكرة
//إذا اصطدمت الكرة بالحدود ، يتم تغيير الاتجاهات وفقًا لذلك

public void setXDir(int x) {
    xdir = x;
}

public void setYDir(int y) {
    ydir = y;
}
//يتم الاتصال هاتان الطريقتان عندما تضرب الكرة المضرب أو الجدار الطوبي


5_كتابة محتوي الفئة Paddle

هذه هي فئة المضرب. يتم تغليف الكائن Paddle في لعبة Breakout. يتم التحكم في مجداف مع مفاتيح الأسهم اليسار واليمين. بالضغط على مفتاح السهم ، قمنا بتعيين متغير الاتجاه. بتحرير مفتاح السهم ، قمنا بتعيين متغير dx على صفر. بهذه الطريقة توقف المضرب عن الحركة.

الكود:
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;

public class Paddle extends Sprite implements Commons {

    private int dx;

    public Paddle() {

        ImageIcon ii = new ImageIcon("paddle.png");
        image = ii.getImage();

        i_width = image.getWidth(null);
        i_heigth = image.getHeight(null);

        resetState();
    }

    public void move() {

        x += dx;

        if (x <= 0) {
            x = 0;
        }

        if (x >= WIDTH - i_width) {
            x = WIDTH - i_width;
        }
    }
//يتحرك المضرب في الاتجاه الأفقي فقط ، لذلك نقوم فقط بتحديث الإحداثي x. إذا كانت الشروط تضمن أن المضرب لا يجتاز حواف النافذة.
    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            dx = -1;
        }

        if (key == KeyEvent.VK_RIGHT) {
            dx = 1;
        }
    }

    public void keyReleased(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            dx = 0;
        }

        if (key == KeyEvent.VK_RIGHT) {
            dx = 0;
        }
    }

    private void resetState() {

        x = INIT_PADDLE_X;
        y = INIT_PADDLE_Y;
    }
}

6_كتابة محتوي الفئة Board

الكود:
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JPanel;

public class Board extends JPanel implements Commons {

    private Timer timer;
    private String message = "Game Over";
    private Ball ball;
    private Paddle paddle;
    private Brick bricks[];
    private boolean ingame = true;

    public Board() {

        initBoard();
    }

    private void initBoard() {

        addKeyListener(new TAdapter());
        setFocusable(true);

        bricks = new Brick[N_OF_BRICKS];
        setDoubleBuffered(true);
        timer = new Timer();
        timer.scheduleAtFixedRate(new ScheduleTask(), DELAY, PERIOD);
    }

    @Override
    public void addNotify() {

        super.addNotify();
        gameInit();
    }

    private void gameInit() {

        ball = new Ball();
        paddle = new Paddle();

        int k = 0;
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 6; j++) {
                bricks[k] = new Brick(j * 40 + 30, i * 10 + 50);
                k++;
            }
        }
    }
//في طريقة gameInit () نقوم بإنشاء كرة ومضرب وثلاثين حجر.

//اعتمادًا على متغير ingame ، إما أن نرسم كل الكائنات في طريقة drawObjects () أو ننهي اللعبة باستخدام طريقة gameFinished ().
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);

        if (ingame) {
        
            drawObjects(g2d);
        } else {

            gameFinished(g2d);
        }

        Toolkit.getDefaultToolkit().sync();
    }
 
    private void drawObjects(Graphics2D g2d) {
    
        g2d.drawImage(ball.getImage(), ball.getX(), ball.getY(),
                ball.getWidth(), ball.getHeight(), this);
        g2d.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(),
                paddle.getWidth(), paddle.getHeight(), this);

        for (int i = 0; i < N_OF_BRICKS; i++) {
            if (!bricks[i].isDestroyed()) {
                g2d.drawImage(bricks[i].getImage(), bricks[i].getX(),
                        bricks[i].getY(), bricks[i].getWidth(),
                        bricks[i].getHeight(), this);
            }
        }
    }
 
    private void gameFinished(Graphics2D g2d) {

        Font font = new Font("Verdana", Font.BOLD, 18);
        FontMetrics metr = this.getFontMetrics(font);

        g2d.setColor(Color.BLACK);
        g2d.setFont(font);
        g2d.drawString(message,
                (Commons.WIDTH - metr.stringWidth(message)) / 2,
                Commons.WIDTH / 2);
    }

    private class TAdapter extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e) {
            paddle.keyReleased(e);
        }

        @Override
        public void keyPressed(KeyEvent e) {
            paddle.keyPressed(e);
        }
    }

    private class ScheduleTask extends TimerTask {

        @Override
        public void run() {

            ball.move();
            paddle.move();
            checkCollision();
            repaint();
        }
    }

    private void stopGame() {

        ingame = false;
        timer.cancel();
    }

    private void checkCollision() {

        if (ball.getRect().getMaxY() > Commons.BOTTOM_EDGE) {
            stopGame();
        }

        for (int i = 0, j = 0; i < N_OF_BRICKS; i++) {
        
            if (bricks[i].isDestroyed()) {
                j++;
            }
        
            if (j == N_OF_BRICKS) {
                message = "Victory";
                stopGame();
            }
        }

        if ((ball.getRect()).intersects(paddle.getRect())) {

            int paddleLPos = (int) paddle.getRect().getMinX();
            int ballLPos = (int) ball.getRect().getMinX();

            int first = paddleLPos + 8;
            int second = paddleLPos + 16;
            int third = paddleLPos + 24;
            int fourth = paddleLPos + 32;

            if (ballLPos < first) {
                ball.setXDir(-1);
                ball.setYDir(-1);
            }

            if (ballLPos >= first && ballLPos < second) {
                ball.setXDir(-1);
                ball.setYDir(-1 * ball.getYDir());
            }

            if (ballLPos >= second && ballLPos < third) {
                ball.setXDir(0);
                ball.setYDir(-1);
            }

            if (ballLPos >= third && ballLPos < fourth) {
                ball.setXDir(1);
                ball.setYDir(-1 * ball.getYDir());
            }

            if (ballLPos > fourth) {
                ball.setXDir(1);
                ball.setYDir(-1);
            }
        }

        for (int i = 0; i < N_OF_BRICKS; i++) {
        
            if ((ball.getRect()).intersects(bricks[i].getRect())) {

                int ballLeft = (int) ball.getRect().getMinX();
                int ballHeight = (int) ball.getRect().getHeight();
                int ballWidth = (int) ball.getRect().getWidth();
                int ballTop = (int) ball.getRect().getMinY();

                Point pointRight = new Point(ballLeft + ballWidth + 1, ballTop);
                Point pointLeft = new Point(ballLeft - 1, ballTop);
                Point pointTop = new Point(ballLeft, ballTop - 1);
                Point pointBottom = new Point(ballLeft, ballTop + ballHeight + 1);

                if (!bricks[i].isDestroyed()) {
                    if (bricks[i].getRect().contains(pointRight)) {
                        ball.setXDir(-1);
                    } else if (bricks[i].getRect().contains(pointLeft)) {
                        ball.setXDir(1);
                    }

                    if (bricks[i].getRect().contains(pointTop)) {
                        ball.setYDir(1);
                    } else if (bricks[i].getRect().contains(pointBottom)) {
                        ball.setYDir(-1);
                    }

                    bricks[i].setDestroyed(true);
                }
            }
        }
    }
}


7_كتابة محتوي الفئة الاخير Breakout

الكود:
import java.awt.EventQueue;
import javax.swing.JFrame;

public class Breakout extends JFrame {

    public Breakout() {
    
        initUI();
    }
 
    private void initUI() {
    
        add(new Board());
        setTitle("Breakout");
    
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(Commons.WIDTH, Commons.HEIGTH);
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
    }

    public static void main(String[] args) {
    
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {              
                Breakout game = new Breakout();
                game.setVisible(true);              
            }
        });
    }
}

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
[Swing]مشروع برمجة لعبة الكرة النارية Breakout game Do.php?imgf=154090993464951
NEXT
NEXT
الادارة
الادارة

تاريخ التسجيل : 18/02/2011
المساهمات : 446
النقاط : 200660
التقيم : 28
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

ََ

مواضيع ذات صلة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى