You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java乒乓球游戏开发:球与Paddle碰撞反弹及得分逻辑实现问题

我来帮你搞定这个乒乓球游戏的碰撞检测和得分逻辑问题,咱们一步步调整代码,让它符合你的需求:

1. 修正球拍与球的碰撞检测逻辑

你原来的代码只判断了球的x坐标和球拍的x坐标,这会导致球还没碰到球拍的竖直区域就反弹了。咱们需要同时判断x轴和y轴的重叠范围,才算是真正的有效碰撞:

对于左边球拍(rect1)的碰撞判断:

// 检查球与左边球拍在x、y轴上是否都有重叠区域
boolean hitLeftPaddle = (rect3.a + 30 > rect1.a) &&  // 球的右边缘 > 球拍左边缘
                        (rect3.a < rect1.a + 30) &&  // 球的左边缘 < 球拍右边缘
                        (rect3.b + 30 > rect1.b) &&  // 球的下边缘 > 球拍上边缘
                        (rect3.b < rect1.b + 200);   // 球的上边缘 < 球拍下边缘

if (hitLeftPaddle) {
    ballright = true;
    bounce++;
}

对于右边球拍(rect2)的碰撞判断:

boolean hitRightPaddle = (rect3.a + 30 > rect2.a) &&
                         (rect3.a < rect2.a + 30) &&
                         (rect3.b + 30 > rect2.b) &&
                         (rect3.b < rect2.b + 200);

if (hitRightPaddle) {
    ballright = false;
    bounce++;
}
2. 添加得分逻辑与边界处理

首先在你的类里定义两个得分变量,用来记录两边玩家的分数:

private int player1Score = 0; // 左边玩家得分
private int player2Score = 0; // 右边玩家得分

然后替换你原来的边缘反弹逻辑,改成未碰到球拍到达边缘时计分,并重置球的位置

// 球到达左边缘(左边玩家没接到),右边玩家得分
if (rect3.a < 0) {
    player2Score++;
    resetBall(); // 重置球到屏幕中心
}

// 球到达右边缘(右边玩家没接到),左边玩家得分
if (rect3.a + 30 > 1080) {
    player1Score++;
    resetBall();
}

再实现resetBall()方法,把球放回屏幕中心,还可以给个随机初始方向增加趣味性:

private void resetBall() {
    rect3.a = 1080 / 2 - 15; // 球宽30,减15让x坐标居中
    rect3.b = 760 / 2 - 15;  // 球高30,减15让y坐标居中
    // 随机初始方向,避免每次重置后球的方向都一样
    ballright = Math.random() > 0.5;
}
3. 在paint方法中绘制得分

最后在paint方法里添加得分的绘制,让玩家能实时看到分数:

public void paint(Graphics g){ 
    super.paint(g); 
    Graphics2D g2d=(Graphics2D) g; 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, 1080, 760); 
    
    // 绘制得分
    g2d.setColor(Color.WHITE);
    g2d.setFont(new Font("Arial", Font.BOLD, 40));
    g2d.drawString(String.valueOf(player1Score), 200, 100);
    g2d.drawString(String.valueOf(player2Score), 880, 100);
    
    g2d.setColor(Color.WHITE); 
    g2d.fillRect(rect3.a, rect3.b, 30, 30); 
    g2d.fillRect(rect1.a, rect1.b, 30, 200); 
    g2d.fillRect(rect2.a, rect2.b, 30, 200); // 注意你原来写的rect3.b-50会让球拍跟着球动,改成rect2.b才能独立控制
    g2d.fillRect(520, 0, 10, 760); 
}
小提醒

你原来的代码里右边球拍的y坐标写的是rect3.b-50,这会导致球拍跟着球移动,应该改成固定的rect2.b,让右边球拍可以独立操作,不然游戏根本没法玩哦~

内容的提问来源于stack exchange,提问作者JumboJet24

火山引擎 最新活动