Java 桌球小游戏

一、创建项目

  1. 创建一个 demo0 项目。

  2. 在项目根目录中创建 image 文件夹,并把下面两张图片拷贝到 image 目录中。

    1. 图 1

    2. 图 2

  3. 在 src 中创建 BallGame 类。

  4. 目录结构如下:

二、出现窗口

  1. 代码:

    // 导入包
    import java.awt.*;
    import javax.swing.*;
    
    // 定义 BallGame 类并继承 javax.swing.* 中的窗口类
    public class BallGame extends JFrame {
    
        // 加载窗口
        void launchFrame()
        {
            setSize(300,300);		// 窗口大小
            setLocation(50,50);		// 窗口位置
            setVisible(true);		// 控制窗口的显隐
        }
    
        // 入口
        public static void main(String[] args)
        {
            BallGame game = new BallGame();
            game.launchFrame();
        }
    
    }
    
  2. 运行结果:

三、加载图片

  1. 代码:

    // 导入包
    import java.awt.*;
    import javax.swing.*;
    
    // 定义 BallGame 类并继承 javax.swing.* 中的窗口类
    public class BallGame extends JFrame {
    
        // 引入图片
        Image ball = Toolkit.getDefaultToolkit().getImage("image/ball.png");
        Image desk = Toolkit.getDefaultToolkit().getImage("image/desk.jpg");
    
        // 画窗口
        public void paint(Graphics g)
        {
            System.out.println("画了一次窗口");
            g.drawImage(desk,0,0,null);         // 先画桌面,桌面在底层
            g.drawImage(ball,100,100,null);     // 后画球,球在桌面上
        }
    
        // 加载窗口
        void launchFrame()
        {
            setSize(856,500);        // 窗口大小
            setLocation(50,50);             // 窗口位置
            setVisible(true);                     // 控制窗口的显隐
        }
    
        // 入口
        public static void main(String[] args)
        {
            BallGame game = new BallGame();
            game.launchFrame();
        }
    
    }
    
  2. 运行结果:

  3. 注意,有的时候窗口里的图片加载不出来,如下图:

    遇到这种情况可以先将画出的窗口最小化,然后再从任务栏中把窗口打开,这样图片就加载出来了。

四、小球运动

  1. 代码:

    // 导入包
    import java.awt.*;
    import javax.swing.*;
    
    // 定义 BallGame 类并继承 javax.swing.* 中的窗口类
    public class BallGame extends JFrame {
    
        // 引入图片
        Image ball = Toolkit.getDefaultToolkit().getImage("image/ball.png");
        Image desk = Toolkit.getDefaultToolkit().getImage("image/desk.jpg");
    
        // 定义小球的坐标
        double x = 100;
        double y = 250;
    
        // 定义小球方向
        boolean right = true;
    
        // 画窗口
        public void paint(Graphics g)
        {
            System.out.println(x);
            g.drawImage(desk,0,0,null);         		// 先画桌面,桌面在底层
            g.drawImage(ball,(int)x,(int)y,null);     	// 后画球,球在桌面上
    
            if(right) x += 15; else x -= 15;
            if(x > 780) right = false;
            if(x < 36) right = true;
    
        }
    
        // 加载窗口
        void launchFrame()
        {
            setSize(856,500);        // 窗口大小
            setLocation(50,50);		// 窗口位置
            setVisible(true);		// 控制窗口的显隐
    
            while(true)
            {
                repaint();
                try {
                    Thread.sleep(40);       // 40ms
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        // 入口
        public static void main(String[] args)
        {
            BallGame game = new BallGame();
            game.launchFrame();
        }
    
    }
    
  2. 运行结果:

五、任意角度

  1. 代码:

    // 导入包
    import java.awt.*;
    import javax.swing.*;
    
    // 定义 BallGame 类并继承 javax.swing.* 中的窗口类
    public class BallGame extends JFrame {
    
        // 引入图片
        Image ball = Toolkit.getDefaultToolkit().getImage("image/ball.png");
        Image desk = Toolkit.getDefaultToolkit().getImage("image/desk.jpg");
    
        // 定义小球的坐标
        double x = 80;
        double y = 250;
        double maxX = 791;
        double maxY = 430;
        double minX = 35;
        double minY = 65;
        // 定义弧度 60°角
        double degree = 3.14 / 3;
    
        /*
        * 经过测试计算洞口坐标:[x,y]
        * 上左:[35,65]    x 最小值和 y 的最小值
        * 上中:[413,65]
        * 上右:[791,65]
        *
        * 下左:[35,430]
        * 下中:[413,430]
        * 下右:[791,430]  x 最大值和 y 的最大值
        */
    
        // 画窗口
        public void paint(Graphics g)
        {
            g.drawImage(desk,0,0,null);         // 先画桌面,桌面在底层
            g.drawImage(ball,(int)x,(int)y,null);     // 后画球,球在桌面上
    
            x += 10 * Math.cos(degree);
            y += 10 * Math.sin(degree);
            if(y > maxY || y < minY) degree = -degree;
            if(x > maxX || x < minX) degree = 3.14 - degree;
    
        }
    
        // 加载窗口
        void launchFrame()
        {
            setSize(856,500);        // 窗口大小
            setLocation(50,50);             // 窗口位置
            setVisible(true);                     // 控制窗口的显隐
    
            while(true)
            {
                repaint();
                try {
                    Thread.sleep(40);       // 40ms
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        // 入口
        public static void main(String[] args)
        {
            BallGame game = new BallGame();
            game.launchFrame();
        }
    
    }
    
  2. 运行结果:

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Java桌球小游戏中,要进行球体碰撞检测并合理分配速度,可以通过以下步骤实现: 1. 碰撞检测:首先需要判断两个球体是否相交,如果相交,则说明发生了碰撞。 2. 合理分配速度:对于每个球体,碰撞后需要重新分配速度,使得碰撞后两个球体的速度满足动量守恒定律和能量守恒定律。具体可以按照以下步骤进行: (1) 计算碰撞前两个球体的动量和能量。 (2) 根据动量守恒定律和能量守恒定律,计算碰撞后两个球体的速度。 (3) 分别将速度分配给每个球体。 下面是一个简单的示例代码: ```java // 判断两个球体是否相交 public boolean checkCollision(Ball ball1, Ball ball2) { double distance = Math.sqrt(Math.pow(ball1.getX() - ball2.getX(), 2) + Math.pow(ball1.getY() - ball2.getY(), 2)); if (distance <= ball1.getRadius() + ball2.getRadius()) { return true; // 碰撞发生 } return false; // 碰撞未发生 } // 碰撞后重新分配速度 public void collide(Ball ball1, Ball ball2) { // 计算碰撞前两个球体的动量和能量 double m1 = ball1.getMass(); double m2 = ball2.getMass(); double v1x = ball1.getSpeedX(); double v1y = ball1.getSpeedY(); double v2x = ball2.getSpeedX(); double v2y = ball2.getSpeedY(); double p1x = m1 * v1x; double p1y = m1 * v1y; double p2x = m2 * v2x; double p2y = m2 * v2y; double e1 = 0.5 * m1 * (v1x * v1x + v1y * v1y); double e2 = 0.5 * m2 * (v2x * v2x + v2y * v2y); double p1 = Math.sqrt(p1x * p1x + p1y * p1y); double p2 = Math.sqrt(p2x * p2x + p2y * p2y); double e = e1 + e2; // 根据动量守恒定律和能量守恒定律,计算碰撞后两个球体的速度 double v1x_new = (p1x + p2x - m2 * (v1x - v2x)) / (m1 + m2); double v1y_new = (p1y + p2y - m2 * (v1y - v2y)) / (m1 + m2); double v2x_new = (p1x + p2x - m1 * (v2x - v1x)) / (m1 + m2); double v2y_new = (p1y + p2y - m1 * (v2y - v1y)) / (m1 + m2); // 分别将速度分配给每个球体 ball1.setSpeedX(v1x_new); ball1.setSpeedY(v1y_new); ball2.setSpeedX(v2x_new); ball2.setSpeedY(v2y_new); } ``` 在以上代码中,我们首先判断两个球体是否相交,如果相交,则进行碰撞检测。然后,我们根据动量守恒定律和能量守恒定律,计算碰撞后两个球体的速度,并将速度分配给每个球体。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iGma_e

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值