gpt4 book ai didi

java - Pong 得分未更新

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:40 25 4
gpt4 key购买 nike

我很困惑为什么我的记分板没有在屏幕上更新。分数正在增加(我用调试器检查过,球也正在居中)。但记分牌根本不更新,它不断显示“0:0”

乒乓球类

package com.dheraxysgames.pong;

import java.awt.Dimension;

import javax.swing.JFrame;

public class Pong extends JFrame{

private static final long serialVersionUID = 1L;

//Set Resolution
public static final int width = 300,
height = width / 4 * 3,
scale = 3;

public Pong() {
Dimension size = new Dimension(width * scale, height * scale);
setSize(size);
setTitle("PONG");
setResizable(false);
setVisible(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(new GamePanel());
}

public static int getWindowWidth(){
return width * scale;
}

public static int getWindowHeight(){
return height * scale;
}

public static void main(String[] args) {
new Pong();
}

}

GamePanel类

package com.dheraxysgames.pong;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class GamePanel extends JPanel implements ActionListener, KeyListener {

private static final long serialVersionUID = 1L;

Ball ball = new Ball();
Player player = new Player();
AI ai = new AI(this);

public GamePanel(){
Timer time = new Timer(50, this);
time.start();

this.addKeyListener(this);
this.setFocusable(true);
}

private void update(){
player.update();
ai.update();
ball.update();

ball.checkCollision(player);
ball.checkCollision(ai);
}

public void paintComponent(Graphics g){
super.paintComponent(g);

g.setColor(Color.BLACK);
g.fillRect(0, 0, Pong.getWindowWidth(), Pong.getWindowHeight());

g.setColor(Color.WHITE);
Font font = new Font("IMMORTAL", Font.BOLD, 50);
g.setFont(font);
g.drawString(player.score + " : " + ai.score, Pong.getWindowWidth() / 2 - 60, 50);

player.paint(g);
ai.paint(g);
ball.paint(g);
}

public Ball getBall(){
return ball;
}

public void actionPerformed(ActionEvent e) {
update();
repaint();
}

//Keyboard
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) player.setYVelocity(-10);
if (e.getKeyCode() == KeyEvent.VK_DOWN) player.setYVelocity(10);
}

public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) player.setYVelocity(0);
if (e.getKeyCode() == KeyEvent.VK_DOWN) player.setYVelocity(0);
}

public void keyTyped(KeyEvent e) {

}

}

玩家等级

package com.dheraxysgames.pong;

import java.awt.Color;
import java.awt.Graphics;

public class Player {

public int score = 0;

private static int width = 50,
height = 150;

private int x = 800, y = (Pong.getWindowHeight() / 2) - (height / 2),
yV = 0;

public Player() {

}

public void update(){
y += yV;
}

public void paint(Graphics g){
g.setColor(Color.GREEN);
g.fillRect(x, y, width, height);
}

public int getX(){
return x;
}

public int getY(){
return y;
}

public int getWidth(){
return width;
}

public int getHeight(){
return height;
}

public void setYVelocity(int speed){
yV = speed;
}

}

人工智能类(class)

package com.dheraxysgames.pong;

import java.awt.Color;
import java.awt.Graphics;

public class AI {

public int score = 0;

private static int width = 50,
height = 150;

private GamePanel field;

private int x = 50, y = (Pong.getWindowHeight() / 2) - (height / 2),
yV = 0;

public AI(GamePanel game) {
this.field = game;
}

public AI(){

}

public void update(){
if(field.getBall().getY() < this.y) yV = -8;
if(field.getBall().getY() > this.y) yV = 8;
y += yV;
}

public void paint(Graphics g){
g.setColor(Color.GREEN);
g.fillRect(x, y, width, height);
}

public int getX(){
return x;
}

public int getY(){
return y;
}

public int getWidth(){
return width;
}

public int getHeight(){
return height;
}

public void setYVelocity(int speed){
yV = speed;
}

}

球类

package com.dheraxysgames.pong;

import java.awt.Color;
import java.awt.Graphics;

public class Ball {

private int x = Pong.getWindowWidth() / 2, y = Pong.getWindowHeight() / 2,
xV = 10, yV = 10;

private static int size = 40;

Player player = new Player();
AI ai = new AI();

public void update() {
x += xV;
y += yV;

if (x < 0){
reverseXDirection();
player.score++;
x = Pong.getWindowWidth() / 2;
y = Pong.getWindowHeight() / 2;
}
if (x > Pong.getWindowWidth() - size){
reverseXDirection();
ai.score++;
x = Pong.getWindowWidth() / 2;
y = Pong.getWindowHeight() / 2;
}
if (y < 0 || y > Pong.getWindowHeight() - size - 38) reverseYDirection();
}

public void paint(Graphics g){
g.setColor(Color.GREEN);
g.fillOval(x, y, size, size);
}

private void reverseXDirection(){
xV = -xV;
}

private void reverseYDirection(){
yV = -yV;
}

public void checkCollision(Player p) {
if (this.x + size > p.getX() && this.x + size < p.getX() + p.getWidth()){
if (this.y + size > p.getY() && this.y + size < p.getY() + p.getHeight()){
reverseXDirection();
}
}
}

public void checkCollision(AI ai) {
if (this.x > ai.getX() && this.x < ai.getX() + ai.getWidth()){
if (this.y > ai.getY() && this.y < ai.getY() + ai.getHeight()){
reverseXDirection();
}
}
}

public int getX(){
return x;
}

public int getY(){
return y;
}

}

最佳答案

在您的 Ball 类中,您要更新的分数与在 GamePanel 类中检查的分数不同。

注意你在两个类中如何调用

Player player = new Player();
AI ai = new AI();

Ball 中的玩家和 ai 是与 GamePanel 中的玩家和 ai 不同的实例。

您需要从 GamePanel 类获取玩家和 ai,并将它们传递给 Ball 类。最简单的方法可能是给 Ball 一个像这样的构造函数

Player player;
AI ai;
public Ball(Player player, AI ai) {
this.player = player;
this.ai = ai;
}

并在您的 GamePanel 类中进行更改:

Ball ball = new Ball();
Player player = new Player();
AI ai = new AI(this);

对此:

Player player = new Player();
AI ai = new AI(this);
Ball ball = new Ball(player, ai);

自从我使用 java 以来已经有一段时间了,所以我可能忘记了一种更简单的方法来做到这一点,但这应该可以解决问题。

关于java - Pong 得分未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39630239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com