桌球小游戏

  • Post author:
  • Post category:其他




1 项目需求:

桌球在球桌中按照一定线路和角度移动,遇到边框会自动弹回。

在这里插入图片描述

要求:即使看不太懂,也要照着敲如下游戏代码,至少 5 遍。要求所有字符和源文件一致。 能够经过调试实现代码的正常运行即可。 下面我们将分以下四个步骤来实现桌球游戏:

第一步:创建项目和窗口。

第二步:加载两个图片。

第三步:实现动画,小球沿着水平方向移动并做边界检测。

第四步:实现小球沿着任意角度飞行(会用到初中学习的三角函数,如果忘记了就 想想你们的体育老师吧)。

1.选择Projects,点击New Projects.如图所示:

在这里插入图片描述

2…选择Java,点击Next。如图所示:
在这里插入图片描述

3.选择默认的模板,点击Next。如图所示:
在这里插入图片描述

4.填写项目名称以及包名。点击Finish。如图所示:

在这里插入图片描述

5.在项目名ballgame上单击右键,在菜单中依次选择 new–>Directory, 创建一个名称是 images 的文件夹,并复制两张图片到该目录下。如图所示:
在这里插入图片描述

6.桌球游戏代码—绘制窗口的代码如下:

package com.txw;

import javax.swing.*;
/**
 * 桌球游戏
 * @author Adair
 * @qq:1578533828@qq.com
 */
@SuppressWarnings("all")   //  注解警告信息
public class BallGame extends JFrame {
    // 窗口加载
    void launchFrame() {
        setSize(800,800);
        setLocation(400,400);
        setVisible(true);
    }

    // main 方法是程序执行的入口
    public static void main(String[] args) {
        BallGame ballGame = new BallGame();
        ballGame.launchFrame();
    }
}

如图所示:
在这里插入图片描述

执行结果如图所示:

在这里插入图片描述

7.加载两个图片:我们要在 BallGame 类中添加小球和桌面的路径,并指定小球出现在窗 口的的初始位置。然后添加 paint 方法,加载小球和桌面。

代码如下:

package com.txw;

import javax.swing.*;
import java.awt.*;
/**
 * 桌球游戏
 * @author Adair
 * @qq:1578533828@qq.com
 */
@SuppressWarnings("all")   //  注解警告信息
public class BallGame extends JFrame {
    // 添加小球和桌面图片的路径
    Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
    Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.png");

    // 指定小球的初始位置
    double x=100; // 小球的横坐标
    double y=100; // 小球的纵坐标

    // 画窗口的方法:加载小球与桌面
    public void paint(Graphics graphics){
        System.out.println("窗口被画了一次!");
        graphics.drawImage(desk,0,0,null);
        graphics.drawImage(ball, (int)x, (int)y, null);
    }
    // 窗口加载
    void launchFrame() {
        setSize(300,300);
        setLocation(400,400);
        setVisible(true);
    }

    // main 方法是程序执行的入口
    public static void main(String[] args) {
        BallGame ballGame = new BallGame();
        ballGame.launchFrame();
    }
}

如图所示:
在这里插入图片描述

执行结果如图所示:
在这里插入图片描述

注意:由于懒加载问题,有可能出现第一次加载图片无效的情况;请最大化窗口再打开即可。稍后 大家完成第三步后,就完全不存在这个问题了。

8.实现动画,小球沿着水平方向移动并做边界检测。 要实现动画的关键是改变小球的坐 标,并且要不停的重画窗口来更新小球的坐标;边界检测则是判断小球的坐标是否超出桌面 的范围,如果超出则要改变小球原来的运动方向。

代码如下:

package com.txw;

import javax.swing.*;
import java.awt.*;
/**
 * 桌球游戏
 * @author Adair
 * @qq:1578533828@qq.com
 */
@SuppressWarnings("all")   //  注解警告信息
public class BallGame extends JFrame {
    // 添加小球和桌面图片的路径
    Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
    Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.png");

    // 指定小球的初始位置
    double x = 100; // 小球的横坐标
    double y = 100; // 小球的纵坐标
    boolean right = true;   // 判断小球移动的方向

    // 画窗口的方法:加载小球与桌面
    public void paint(Graphics graphics){
        System.out.println("窗口被画了一次!");
        graphics.drawImage(desk,0,0,null);
        graphics.drawImage(ball, (int)x, (int)y, null);

        // 改变小球的坐标
        if (right){
            x = x + 10;
        }else {
            x = x - 10;
        }

        // 边界检测
        // 856 是窗口宽度,40 是桌子边框的宽度,30 是小球的直径
        if (x > 856 -40 -30){
            right = false;
        }
        if (x < 40){
            right = true;
        }
    }
    // 窗口加载
    void launchFrame() {
        setTitle("桌球游戏");
        setSize(300,300);
        setLocation(400,400);
        setVisible(true);

        // 重画窗口,每秒画25次
        while (true){
            repaint();   // 调用repaint方法,窗口即可重画
            try {
                Thread.sleep(40);  // 40ms, 1秒=1000毫秒. 大约一秒画25次窗口
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    // main 方法是程序执行的入口
    public static void main(String[] args) {
        BallGame ballGame = new BallGame();
        ballGame.launchFrame();
    }
}

如图所示:
在这里插入图片描述

执行结果如图所示:

在这里插入图片描述

9.实现小球沿着任意角度飞行:此时小球的运动方向不能再单纯的使用 right 来表示,需 要一个表示角度的变量 degree,小球坐标的改变也要依据这个角度。

代码如下:

package com.txw;

import javax.swing.*;
import java.awt.*;
/**
 * 桌球游戏
 * @author Adair
 * @qq:1578533828@qq.com
 */
@SuppressWarnings("all")   //  注解警告信息
public class BallGame extends JFrame {
    // 添加小球和桌面图片的路径
    Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
    Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.png");

    // 指定小球的初始位置
    double x = 100; // 小球的横坐标
    double y = 100; // 小球的纵坐标
    double degree = 3.14 / 3;   // 弧度:小球的运动角度,此处就是60度

    // 画窗口的方法:加载小球与桌面
    public void paint(Graphics graphics){
        System.out.println("窗口被画了一次!");
        graphics.drawImage(desk,0,0,null);
        graphics.drawImage(ball, (int)x, (int)y, null);

        // 根据角度degree改变小球坐标
        x = x + 10 * Math.cos(degree);
        y = y + 10 * Math.sin(degree);

        // 边界检测:碰到上下边界
        // 500 是窗口高度;40是桌子边框,30是球直径;最后一个40是标题栏的高度
        if (y > 500 - 40 - 30 || y < 40 + 40){
            degree = - degree;
        }
        //边界检测:碰到左右边界 //856是窗口宽度,40是桌子边框的宽度,30是小球的直径
        if(x < 40 || x > 856 - 40 - 30){
            degree = 3.14 - degree;
        }
    }
    // 窗口加载
    void launchFrame() {
        setTitle("桌球游戏");
        setSize(300,300);
        setLocation(400,400);
        setVisible(true);

        // 重画窗口,每秒画25次
        while (true){
            repaint();   // 调用repaint方法,窗口即可重画
            try {
                Thread.sleep(40);  // 40ms, 1秒=1000毫秒. 大约一秒画25次窗口
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    // main 方法是程序执行的入口
    public static void main(String[] args) {
        BallGame ballGame = new BallGame();
        ballGame.launchFrame();
    }
}

如图所示:
在这里插入图片描述

执行结果如图所示:
在这里插入图片描述



版权声明:本文为weixin_40055163原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。