Ошибка в книге? [требует правки]

424
07 октября 2017, 18:43

Делаю игру пинг-понг на Java по книге Якова Файна. Код состоит из двух классов и интерфейса (интерфейс игры, движок игры и константы). Игра запускается но единственное что в ней можно делать это управлять ракеткой игрока, обнулять счет игры и при нажатии на кнопку S мячик перерисовывается на ракетку игрока. Мячик не выполняет своей основной функции, его не можно подать, он не перемещается по столу, его можно только перерисовать на ракетку игрока о чем было сказано раньше. Помогите пожалуйста разобраться что не так:

1. Класс PingPongTable

package screens;
    import javax.swing.JPanel;
    import javax.swing.JFrame;
    import javax.swing.BoxLayout;
    import javax.swing.JLabel;
    import javax.swing.WindowConstants;
    import java.awt.Dimension;
    import java.awt.Container;
    import java.awt.Graphics;
    import java.awt.Color;
        import engine.PingPongEngine;

        public class PingPongTable extends  JPanel implements GameConstants
        {
            JLabel label;
            public int computerRacket_Y = COMPUTER_RACKET_Y_START;
            private int kidRacket_Y = KID_RACKET_Y_START;
            private int ballX = BALL_START_X;
            private int ballY = BALL_START_Y;
            Dimension preferredSize = new Dimension(TABLE_WIDTH, TABLE_HEIGHT);
            public Dimension getPreferredSize() 
            {
                return preferredSize;
            }
            PingPongTable()
            {
                PingPongEngine gameEngine = new PingPongEngine(this);
                addKeyListener(gameEngine);
                addMouseMotionListener(gameEngine);
            }
            void addPaneltoFrame(Container container) 
            {
                container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
                container.add(this);
                label = new JLabel("Press N for a new game, S to serve or Q to quit");
                container.add(label);
            }
            public void paintComponent(Graphics g) 
            {
                super.paintComponent(g);
                g.setColor(Color.GREEN);
                g.fillRect(0,0,TABLE_WIDTH,TABLE_HEIGHT);
                g.setColor(Color.yellow);
                g.fillRect(KID_RACKET_X, kidRacket_Y, RACKET_WIDTH, RACKET_LENGTH);
                g.setColor(Color.blue);
                g.fillRect(COMPUTER_RACKET_X, computerRacket_Y, RACKET_WIDTH, RACKET_LENGTH);
                g.setColor(Color.red);
                g.fillOval(ballX, ballY, 10, 10);
                g.setColor(Color.white);
                g.drawRect(10, 10, 300, 200);
                g.drawLine(160, 10, 160, 210);
                requestFocus();
            }
            public void setKidRacket_Y(int yCoordinate) 
            {
                this.kidRacket_Y = yCoordinate;
                repaint();
            }
            public int getKidRacket_Y() 
            {
                return kidRacket_Y;
            }
            public void setComputerRacket_Y(int yCoordinate) 
            {
                this.computerRacket_Y = yCoordinate;
                repaint();
            }
            public void setMessageText(String text) 
            {
                label.setText(text);
                repaint();
            }
            public void setBallPosition(int xPos, int yPos) 
            {
                ballX = xPos;
                ballY = yPos;
                repaint(); 
            }
            public static void main(String[] args) 
            {
                JFrame f = new JFrame("Ping Pong Green Table");
                f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                PingPongTable table = new PingPongTable();
                table.addPaneltoFrame(f.getContentPane());
                f.setBounds(0, 0, TABLE_WIDTH+5, TABLE_HEIGHT+40);
                f.setVisible(true);
            }
        }

2. Интерфейс GameConstants

     package screens;
            public interface GameConstants
                {
                    public final int TABLE_WIDTH = 320;
                    public final int TABLE_HEIGHT = 220;
                    public final int KID_RACKET_Y_START = 100;
                    public final int KID_RACKET_X = 300;
                    public final int TABLE_TOP = 12;
                    public final int TABLE_BOTTOM = 180;
                    public final int RACKET_INCREMENT = 2;
                    public final int COMPUTER_RACKET_X = 15;
                    public final int COMPUTER_RACKET_Y_START = 100;
                    public final int BALL_START_X = TABLE_WIDTH/2;
                    public final int BALL_START_Y = TABLE_HEIGHT/2;
                    public final int BALL_INCREMENT = 4;
                    public final int BALL_MIN_X = 1 + BALL_INCREMENT;
                    public final int BALL_MIN_Y = 1 + BALL_INCREMENT;
                    public final int BALL_MAX_X = TABLE_WIDTH - BALL_INCREMENT;
                    public final int BALL_MAX_Y = TABLE_HEIGHT - BALL_INCREMENT;
                    public final int RACKET_LENGTH = 30;
                    public final int RACKET_WIDTH = 5;
                    public final int SLEEP_TIME = 10;
                    public final int WINNING_SCORE = 21;
                }

3. Класс PingPongEngine

    package engine;
    import java.awt.event.MouseEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseMotionListener;
    import screens.*;
    public class PingPongEngine implements  Runnable, KeyListener, MouseMotionListener, GameConstants
    {
        private PingPongTable table;
        private int kidRacket_Y = KID_RACKET_Y_START;
        private int computerRacket_Y = COMPUTER_RACKET_Y_START;
        private int kidScore;
        private int computerScore;
        private int ballX;
        private int ballY;
        private boolean movingLeft = true;
        private boolean ballServed = false;
        public int verticalSlide;
        public PingPongEngine(PingPongTable greenTable) 
        {
            table = greenTable;
            Thread worker = new Thread(this);
            worker.start();
        }
        public void mouseDragged(MouseEvent e) {}
        public void mouseMoved(MouseEvent e) {
        int mouse_Y = e.getY();
        if (mouse_Y < kidRacket_Y && kidRacket_Y > TABLE_TOP)
        {
            kidRacket_Y -= RACKET_INCREMENT;
        }
        else if (kidRacket_Y < TABLE_BOTTOM) 
        {
            kidRacket_Y += RACKET_INCREMENT;
        }
            table.setKidRacket_Y(kidRacket_Y);
        }
        public void keyPressed(KeyEvent e) 
        {
            char key = e.getKeyChar();
            if('n'==key || 'N'==key) 
            {
                startNewGame();
            }
            else if('q'==key || 'Q'==key)
            {
                endGame();
            }
            else if('s'==key || 'S'==key)
            {
                kidServe();
            }
        }
        public void keyReleased(KeyEvent e) {}
        public void keyTyped(KeyEvent e) {}
        public void startNewGame() 
        {
            computerScore = 0;
            kidScore = 0;
            table.setMessageText("Score Computer: 0  Kid Score: 0");
            kidServe();
        }
        public void endGame() 
        {
            System.exit(0);
        }
        public void run() 
        {
            boolean canBounce = false;
            while(true) 
            {
                if(ballServed) 
                {
                    if(movingLeft && ballX > BALL_MIN_X) 
                    {
                        canBounce = (ballY >= computerRacket_Y && ballY < (computerRacket_Y + RACKET_LENGTH)?true: false);
                        ballX -= BALL_INCREMENT;
                        ballY -= verticalSlide;
                        table.setBallPosition(ballX, ballY);
                        if(ballX <= COMPUTER_RACKET_X && canBounce) 
                        {
                            movingLeft = false;
                        }
                    }
                if(!movingLeft && ballX <= BALL_MAX_X) 
                {
                    canBounce = (ballY >= kidRacket_Y && ballY < (kidRacket_Y + RACKET_LENGTH)?true: false);
                    ballX += BALL_INCREMENT;
                    table.setBallPosition(ballX, ballY);
                    if(ballX > KID_RACKET_X && canBounce) 
                    {
                        movingLeft = true;
                    }
                }
                if(computerRacket_Y < ballY && computerRacket_Y < TABLE_BOTTOM) 
                {
                    computerRacket_Y += RACKET_INCREMENT;
                }
                else if(computerRacket_Y > TABLE_TOP) 
                {
                    computerRacket_Y -= RACKET_INCREMENT;
                }
                table.setComputerRacket_Y(computerRacket_Y);
                try 
                {
                    Thread.sleep(SLEEP_TIME);
                }
                catch(InterruptedException e) 
                {
                    e.printStackTrace();
                }
                if(isBallOnTheTable()) 
                {
                    if(ballX > BALL_MAX_X) 
                    {
                        computerScore++;
                        displayScore();
                    }
                    else if(ballX < BALL_MIN_X) 
                    {
                        kidScore++;
                        displayScore();
                    }
                }
                }
                }
        }
        private void kidServe() 
        {
            ballServed = true;
            ballX = KID_RACKET_X - 1;
            ballY = kidRacket_Y;
            if(ballY > TABLE_HEIGHT/2) 
            {
                verticalSlide = -1;
            }
            else 
            {
                verticalSlide = 1;
            }
            table.setBallPosition(ballX, ballY);
            table.setKidRacket_Y(kidRacket_Y);
        }
        private void displayScore() 
        {
            ballServed = false;
            if(computerScore == WINNING_SCORE) 
            {
                table.setMessageText("Computer won! "+computerScore + ":" + kidScore);
            }
            else if(kidScore == WINNING_SCORE) 
            {
                table.setMessageText("You won! "+kidScore + ":" + computerScore);
            }
            else 
            {
                table.setMessageText("Computer: "+computerScore + " Your Score: "+ kidScore);
            }
        }
        private boolean isBallOnTheTable() 
        {
            if(ballY >= BALL_MIN_Y && ballY <= BALL_MAX_Y) 
            {
                return true;
            }
            else {return false;}
        }
    }
READ ALSO
Не работает несложный алгоритм

Не работает несложный алгоритм

Уважаемые товарищи, у меня просто ужас, а не ситуацияНе могу понять битый час в чём проблема, больше напоминает проблемы с софтом и/или компьютером

263
Как выполнять код Java в редакторе Atom?

Как выполнять код Java в редакторе Atom?

Скачал package "Script" для Atom, но при запуске Java кода в консоли выдает это: https://prntsc/gtyl2i Подскажите, как исправить?

298
Java - Как перенести значения от 1 до 8 с массива A в массив С через массив B?

Java - Как перенести значения от 1 до 8 с массива A в массив С через массив B?

Как правильно перенести значения от 1 до 8 с массива A в массив С через массив B? Переносить по одному значению так, чтобы минимальное значение...

168