首页 > 解决方案 > Java 拉绳在代码的早期部分工作正常以计算点数,但在显示游戏结束时不起作用

问题描述

我正在用 Java 编写一个蛇游戏,代码几乎完成了,预计最后一个部分我有一个拉绳问题,在代码的后面部分不起作用,但在前面的部分可以正常工作。

我使用拉绳来实现一个计数点的计数器,但是当蛇与自身发生碰撞但文本根本没有显示时,我在 if 语句中执行相同操作。当然,它在向上移动代码时有效。

public class Game   {
    public static  void main(String[] args) {
        JFrame b = new JFrame("Snake");
        b.setBounds(300,60,905,705);
        b.setBackground(Color.DARK_GRAY);
        b.setResizable(false);
        Snake snake = new Snake();
        b.setVisible(true);
        b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        b.add(snake);
    }
}
public class Snake extends JPanel implements KeyListener, ActionListener {
    private static final long serialVersionUID = 1 L;
    private int[] snakeXlength = new int[750];
    private int[] snakeYlength = new int[750];
    private int[] foodXpos ={20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600,620,640};
    private int[] foodYpos = {20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600}; 

    private boolean right = true;
    private boolean left = false;
    private boolean up = false;
    private boolean down = false;
    private boolean over = false;
    private Random random = new Random();
    private int xPos = random.nextInt(32);
    private int yPos = random.nextInt(30);
    private Timer timer;
    private int snakeDelay = 100;
    private int points = 0;
    private int moves = 0;
    private int lengtOfSnake = 3;

    public Snake() {
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        timer = new Timer(snakeDelay, this);
        timer.start();
    }

    public void paint(Graphics g) {
        // super.paintComponent(g);
        g.setColor(Color.DARK_GRAY);
        g.fillRect(0, 0, 900, 900);
        g.setColor(Color.WHITE);
        g.drawRect(20, 20, 864, 624);
        g.setColor(Color.BLACK);
        g.fillRect(21, 21, 863, 623);
        g.setColor(Color.WHITE);
        g.setFont(new Font("arial", Font.PLAIN, 14));
        g.drawString("Score: " + points, 400, 15);

        // ******* this counts the score ****
        if (moves == 0) {
            snakeXlength[2] = 60;
            snakeXlength[1] = 80;
            snakeXlength[0] = 100;
            snakeYlength[2] = 100;
            snakeYlength[1] = 100;
            snakeYlength[0] = 100;
        }
        for (int a = 0; a < lengtOfSnake; a++) {
            if (a == 0 && right) {
                g.setColor(Color.RED);
                g.fillRect(snakeXlength[a], snakeYlength[a], 20, 20);
            }
            if (a == 0 && left) {
                g.setColor(Color.RED);
                g.fillRect(snakeXlength[a], snakeYlength[a], 20, 20);
            }
            if (a == 0 && down) {
                g.setColor(Color.RED);
                g.fillRect(snakeXlength[a], snakeYlength[a], 20, 20);
            }
            if (a == 0 && up) {
                g.setColor(Color.RED);
                g.fillRect(snakeXlength[a], snakeYlength[a], 20, 20);
            }
            if (a != 0) {
                g.setColor(Color.GREEN);
                g.fillOval(snakeXlength[a], snakeYlength[a], 17, 17);
            }
        }

        if ((foodXpos[xPos] == snakeXlength[0]) && (foodYpos[yPos] == snakeYlength[0])) {
            points++;
            lengtOfSnake++;
            xPos = random.nextInt(32);
            yPos = random.nextInt(30);
        }

        g.setColor(Color.ORANGE);
        g.fillRect(foodXpos[xPos], foodYpos[yPos], 20, 20);
        g.dispose();

        for (int b = 1; b < lengtOfSnake; b++) {
            if (snakeXlength[b] == snakeXlength[0] && snakeYlength[0] == snakeYlength[b]) {
                right = false;
                left = false;
                up = false;
                down = false;
                over = true;
                g.setColor(Color.WHITE);
                g.setFont(new Font("game over", Font.BOLD, 20));
                g.drawString("Game over", 300, 300);
                g.drawString("press space bar to restart.", 300, 350);
                thiss is meant to show off game over text.
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            points = 0;
            moves = 0;
            lengtOfSnake = 3;
            over = false;
            repaint();
            xPos = random.nextInt(32);
            yPos = random.nextInt(30);
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT && over != true) {
            moves++;
            right = true;
            if (left != true) {
                right = true;
            } else {
                right = false;
                left = true;
            }
            down = false;
            up = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT && over != true) {
            moves++;
            left = true;
            if (right != true) {
                left = true;
            } else {
                left = false;
                right = true;
            }
            down = false;
            up = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_UP && over != true) {
            moves++;
            up = true;
            if (down != true) {
                up = true;
            } else {
                up = false;
                down = true;
            }
            left = false;
            right = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN && over != true) {
            moves++;
            down = true;
            if (up != true) {
                down = true;
            } else {
                up = true;
                down = false;
            }
            left = false;
            right = false;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        timer.start();
        if (right) {
            for (int r = lengtOfSnake - 1; r >= 0; r--) {
                snakeYlength[r + 1] = snakeYlength[r];
            }
            for (int r = lengtOfSnake; r >= 0; r--) {
                if (r == 0) {
                    snakeXlength[r] = snakeXlength[r] + 20;
                } else {
                    snakeXlength[r] = snakeXlength[r - 1];
                }
                if (snakeXlength[r] > 860) {
                    snakeXlength[r] = 20;
                }
            }
            repaint();
        }
        if (left) {
            for (int r = lengtOfSnake - 1; r >= 0; r--) {
                snakeYlength[r + 1] = snakeYlength[r];
            }
            for (int r = lengtOfSnake; r >= 0; r--) {
                if (r == 0) {
                    snakeXlength[r] = snakeXlength[r] - 20;
                } else {
                    snakeXlength[r] = snakeXlength[r - 1];
                }
                if (snakeXlength[r] < 20) {
                    snakeXlength[r] = 860;
                }
            }
            repaint();
        }
        if (up) {
            for (int r = lengtOfSnake - 1; r >= 0; r--) {
                snakeXlength[r + 1] = snakeXlength[r];
            }
            for (int r = lengtOfSnake; r >= 0; r--) {
                if (r == 0) {
                    snakeYlength[r] = snakeYlength[r] - 20;
                } else {
                    snakeYlength[r] = snakeYlength[r - 1];
                }
                if (snakeYlength[r] < 20) {
                    snakeYlength[r] = 620;
                }
            }
            repaint();
        }
        if (down) {
            for (int r = lengtOfSnake - 1; r >= 0; r--) {
                snakeXlength[r + 1] = snakeXlength[r];
            }
            for (int r = lengtOfSnake; r >= 0; r--) {
                if (r == 0) {
                    snakeYlength[r] = snakeYlength[r] + 20;
                } else {
                    snakeYlength[r] = snakeYlength[r - 1];
                }
                if (snakeYlength[r] > 620) {
                    snakeYlength[r] = 20;
                }
            }
            repaint();
        }
    }

}

标签: javaswinguser-interface

解决方案


推荐阅读