弹球 (10 分)

这篇博客记录了一位博主在Java课程中完成的一个弹球游戏的编程实践。游戏使用Java GUI创建了一个窗口,包含一个开始和结束按钮。点击开始按钮会发射一个弹球,球在碰到边界时会自动反弹,移动固定次数后停止。若多次点击开始,将同时发射多个弹球。游戏使用了多线程来实现弹球的独立运动,每个弹球都有自己的移动逻辑。点击结束按钮则关闭程序。博主在期末考试前夕分享此代码作为复习资料。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述
前言:博主这学期上的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(x<rect.getMinX())
        {
            x = (int)rect.getMinX()+diameter;
            dx = -dx;
        }
        if(x+diameter>rect.getMaxX())
        {
            x = (int)rect.getMaxX()-diameter;
            dx = -dx;
        }
        if(y<rect.getMinY())
        {
            y = (int)rect.getMinY();
            dy = -dy;
        }
        if(y+diameter>rect.getMaxY())
        {
            y = (int)rect.getMaxY() - diameter;
            dy = -dy;
        }
    }
    Ellipse2D DrawBall()
    {
        return new Ellipse2D.Float(x,y,diameter,diameter);
    }
    //根据当前坐标返回一个球的对象

}
// 弹球的窗口
class BallPanel extends JPanel
{
    private ArrayList<Ball> 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("弹球程序");
        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();
    }
}

以下是一个简单的Python弹球游戏的代码示例,仅供参考: ```python import pygame from pygame.locals import * import random # 初始化Pygame pygame.init() # 定义游戏窗口大小 WINDOW_WIDTH = 640 WINDOW_HEIGHT = 480 # 定义弹珠和挡板的大小和颜色 BALL_RADIUS = 10 BALL_COLOR = (255, 255, 255) PADDLE_WIDTH = 80 PADDLE_HEIGHT = 10 PADDLE_COLOR = (255, 255, 255) # 定义砖块的大小和颜色 BRICK_WIDTH = 60 BRICK_HEIGHT = 20 BRICK_COLOR = (255, 255, 255) # 定义游戏背景颜色 BG_COLOR = (0, 0, 0) # 设置游戏窗口 window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption('弹珠小游戏') # 定义全局变量 score = 0 lives = 3 # 定义弹珠和挡板的初始位置和速度 ball_x = WINDOW_WIDTH // 2 ball_y = WINDOW_HEIGHT // 2 ball_dx = 5 ball_dy = 5 paddle_x = (WINDOW_WIDTH - PADDLE_WIDTH) // 2 paddle_y = WINDOW_HEIGHT - PADDLE_HEIGHT # 定义砖块的位置和数量 brick_rows = 5 brick_cols = 8 bricks = [] for row in range(brick_rows): brick_row = [] for col in range(brick_cols): brick_row.append(1) bricks.append(brick_row) # 定义字体 font = pygame.font.SysFont('Arial', 16) # 定义游戏循环 while True: # 处理事件 for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEMOTION: paddle_x = event.pos[0] # 绘制游戏界面 window.fill(BG_COLOR) pygame.draw.circle(window, BALL_COLOR, (ball_x, ball_y), BALL_RADIUS) pygame.draw.rect(window, PADDLE_COLOR, (paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT)) for row in range(brick_rows): for col in range(brick_cols): if bricks[row][col] == 1: brick_x = col * BRICK_WIDTH brick_y = row * BRICK_HEIGHT pygame.draw.rect(window, BRICK_COLOR, (brick_x, brick_y, BRICK_WIDTH, BRICK_HEIGHT)) # 更新弹珠位置 ball_x += ball_dx ball_y += ball_dy # 碰撞检测 if ball_x <= BALL_RADIUS or ball_x >= WINDOW_WIDTH - BALL_RADIUS: ball_dx = -ball_dx if ball_y <= BALL_RADIUS: ball_dy = -ball_dy elif ball_y >= WINDOW_HEIGHT - BALL_RADIUS - PADDLE_HEIGHT: if ball_x >= paddle_x and ball_x <= paddle_x + PADDLE_WIDTH: ball_dy = -ball_dy score += 10 else: lives -= 1 if lives == 0: pygame.quit() sys.exit() ball_x = WINDOW_WIDTH // 2 ball_y = WINDOW_HEIGHT // 2 ball_dx = random.choice([-5, 5]) ball_dy = 5 # 砖块碰撞检测 row = ball_y // BRICK_HEIGHT col = ball_x // BRICK_WIDTH if row < brick_rows and col < brick_cols and bricks[row][col] == 1: bricks[row][col] = 0 ball_dy = -ball_dy score += 50 # 显示得和生命值 score_text = font.render('得:' + str(score), True, (255, 255, 255)) lives_text = font.render('生命:' + str(lives), True, (255, 255, 255)) window.blit(score_text, (10, 10)) window.blit(lives_text, (WINDOW_WIDTH - lives_text.get_width() - 10, 10)) # 更新窗口 pygame.display.update() # 控制游戏帧率 pygame.time.Clock().tick(60) ``` 以上是一个简单的Python弹球游戏的代码示例,仅供参考。实际开发中,还需进一步完善和优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Agreenhan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值