d球 (10 分)

d球 (10 分),第1张

d球 (10 分)

编写程序,该程序通过一个发射按钮可以发射一个d球,该球遇到边界时会自动d回,在移动固定次数后,该球停止运动。要求每次点击发射按钮都会发射一个d球,如果点击多次,则多个d球同时运动。该程序通过另一个结束可以结束程序的运行。参考界面如图所示。


前言:博主这学期上的Java课,在PTA上老师布置了这个题,当时被折磨了很久所以打算写个博客记录下,同时复习一下,明天JAVA直接期末考试了!!!!!

本题主要是JAVA GUI的加上多线程的应用,所以个人认为难度挺大,本文也是参考了其他代码的基础上自己写得。

直接上代码分析:

package PTA;
// 记得自己把package包改了!
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

// 定义球的类,包括球的坐标,球沿着x与y的运动方向以及运动速度(速度可以自己设定),以及球的大小(自己设定)。

class Ball
{
    private final int speedx = 30;
    private final int speedy = 30;
    // 球的移动速度 以象素为单位
    private final int diameter = 16;
    // 球的半径
    private int x;
    private int y;
    // 球的坐标,初始是(400,100)
    private int dx = -1;
    private int dy = 1;
    // 球移动的方向

    Ball(int x,int y)
    {
        this.x = x;
        this.y = y;
    }
// 球的移动函数,rect指代当前的窗口,如果到达边界则方向改变
// 这个函数在本文中很重要
    void move(Rectangle2D rect)
    {
        //rect 为窗体的size
        x += dx * speedx;
        y += dy * speedy;
        if(xrect.getMaxX())
        {
            x = (int)rect.getMaxX()-diameter;
            dx = -dx;
        }
        if(yrect.getMaxY())
        {
            y = (int)rect.getMaxY() - diameter;
            dy = -dy;
        }
    }
    Ellipse2D DrawBall()
    {
        return new Ellipse2D.Float(x,y,diameter,diameter);
    }
    //根据当前坐标返回一个球的对象

}
// d球的窗口
class BallPanel extends JPanel
{
    private ArrayList Balls = new ArrayList<>();

    void add(Ball ball)
    {
        Balls.add(ball);
    }


    @Override
    public void setPreferredSize(Dimension preferredSize) {
        super.setPreferredSize(preferredSize);
        preferredSize.width = 400;
        preferredSize.height = 450;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g.drawLine(0,412,386,412);
        for(Ball balls: Balls)
            g2.fill(balls.DrawBall());
    }
}
// 主窗口
class BallWindow extends Jframe
{
    private final BallPanel ballPanel = new BallPanel();
    BallWindow()
    {
        this.add(ballPanel,BorderLayout.CENTER);
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(500,50));
        JButton btn1 = new JButton("开始");
        JButton btn2 = new JButton("结束");
        btn1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                AddBall();
            }
        });
        panel.add(btn1);
        btn2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        panel.add(btn2);

        this.setTitle("d球程序");
        this.add(panel,BorderLayout.SOUTH);
        this.setSize(400,500);
        this.setVisible(true);
        this.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
        this.setCenter();
    }
    void setCenter()
    {
        Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (screensize.width-400)/2;
        int y = (screensize.height-500)/2;
        this.setLocation(x,y);
    }
    // 每点击一次按钮,记得添加一个球,即创建一个新的进程
    // 通过将球插入到Arraylist中 保存多个球的位置
    void AddBall()
    {
        Ball ball = new Ball(400,100);
        ballPanel.add(ball);
        //System.out.println("i am added");
        class BallRun implements Runnable
        {
            @Override
            public void run() {
                try {
                    while(true)
                    {
                        ball.move(ballPanel.getBounds());
                        ballPanel.repaint();
                        Thread.sleep(100);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        BallRun ballRun = new BallRun();
        Thread t = new Thread(ballRun);
        t.start();
    }

}


public class JumpBall {
    public static void main(String[] args) {
        BallWindow ballWindow = new BallWindow();
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5573262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存