簡體   English   中英

有人可以幫我動一下蛇嗎

[英]Can someone help me make my snake move

我一直在做我的第一個項目:蛇游戲。 我看了一個視頻,然后我拍了。 但是它不起作用,當我運行它時,我的蛇不會動。 有人可以幫我如何使它工作。

package game;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import javax.swing.JPanel;

public class GamePanel extends JPanel implements Runnable, KeyListener {

    public static final int WIDTH = 400;
    public static final int HEIGHT = 400;

    //Render
    private Graphics2D g2d;
    private BufferedImage image;

    //Game Loop
    private Thread thread;
    private boolean running;
    private long targetTime;

    //Game Stuff
    private final int SIZE = 10;
    private Entity head, apple;
    private ArrayList<Entity> snake;
    private int score;
    private int level;
    private boolean gameover;

    //Movement
    private int dx,dy;
    //key input
    private boolean up,down,right,left,start;

    public GamePanel() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setFocusable(true);
        requestFocus();
        addKeyListener(this);
    }
    @Override
    public void addNotify() {
        super.addNotify();
        thread = new Thread(this);
        thread.start();
    }
    private void setFPS(int fps) {
        targetTime = 1000 / fps;
    }
    // Toetsenbord input --> beweging van de snake
    @Override
    public void keyPressed(KeyEvent e) {
        int k = e.getKeyCode();

        if (k == KeyEvent.VK_UP) up = true;
        if (k == KeyEvent.VK_DOWN) down = true;
        if (k == KeyEvent.VK_LEFT) left = true;
        if (k == KeyEvent.VK_RIGHT) right = true;
        if (k == KeyEvent.VK_ENTER) start = true;

    }

    @Override
    public void keyReleased(KeyEvent e) {
        int k = e.getKeyCode();

        if (k == KeyEvent.VK_UP) up = false;
        if (k == KeyEvent.VK_DOWN) down = false;
        if (k == KeyEvent.VK_LEFT) left = false;
        if (k == KeyEvent.VK_RIGHT) right = false;
        if (k == KeyEvent.VK_ENTER) start = false;

    }

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

    }
    //Snelheid van de snake
    @Override
    public void run() {
        if (running) return;
        init();
        long startTime;
        long elapsed;
        long wait;
        while (running) {
            startTime = System.nanoTime();
            update();
            requestRender();

            elapsed = System.nanoTime() - startTime;
            wait = targetTime - elapsed / 1000000;
            if (wait>0) {
                try{
                    Thread.sleep(wait);
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void init() {
        image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
        g2d = image.createGraphics();
        running = true;
        setUplevel();
    }
    //Hoe het level eruit ziet
    private void setUplevel() {
        snake = new ArrayList<Entity>();
        head = new Entity(SIZE);
        head.setPosition(WIDTH / 2,  HEIGHT / 2);
        snake.add(head);
        for (int i = 1;i < 3; i++) {
            Entity e = new Entity(SIZE);
            e.setPosition(head.getX() + (i * SIZE),  head.getY());
            snake.add(e);
        }
        apple = new Entity(SIZE);
        score = 0;
        gameover = false;
        level = 1;
        dx = dy = 0;
        setFPS(level*10);
    }
    //Waar het fruit komt
    public void setApple() {
        int x = (int)(Math.random() * (WIDTH - SIZE));
        int y = (int)(Math.random() * (HEIGHT - SIZE));
        x = x - (x%SIZE);
        y = y - (y%SIZE);
        apple.setPosition(x,y);
    }
    private void requestRender() {
        render(g2d);
        Graphics g = getGraphics();
        g.drawImage(image, 0,0,null);
        g.dispose();
    }
    //Hoe dat ding beweegt
    private void update() {
        if (gameover) {
            if (start) {
                setUplevel();
            }
            return;
        }

        if (up && dy == 0) {
            dy = -SIZE;
            dx = 0;
        }
        if (down && dy == 0) {
            dy = SIZE;
            dx = 0;
        }
        if (left && dx == 0) {
            dy = 0;
            dx = -SIZE;
        }
        if (right && dx == 0 && dy != 0) {
            dy = 0;
            dx = -SIZE; 
        }
        if (dx !=0 || dy != 0) {

            for (int i = snake.size() - 1; i>0; i--) {
                snake.get(i).setPosition(snake.get(i - 1).getX(), snake.get(i - 1).getY());
            }
            head.move(dx, dy);
        }

        for (Entity e : snake) {
            if (e.isCollision(head)) {
                gameover = true;
                break;
            }
        }
        //Punten erbij en langer worden als de snake fruit eet
        if (apple.isCollision(head)) {
            score++;
            setApple();

            Entity e = new Entity(SIZE);
            e.setPosition(-100, -100);
            snake.add(e);
            if (score % 10 == 0) {
                level++;
                if (level > 10) level = 10;
                setFPS(level*10);
            }
        }
        if (head.getX() < 0) head.setX(WIDTH);
        if (head.getY() < 0) head.setY(HEIGHT);
        if (head.getX() > 0) head.setX(0);
        if (head.getY() > 0) head.setY(0);
    }

    public void render(Graphics2D g2d) {
        g2d.clearRect(0, 0, WIDTH, HEIGHT);
        g2d.setColor(Color.GREEN);
        for (Entity e : snake) {
            e.render(g2d);
        }
        g2d.setColor(Color.red);
        apple.render(g2d);
        //Tekst voor en na je doodgaat
        g2d.setColor(Color.WHITE);
        g2d.drawString("Score :" + score + "Level : " + level, 10, 10);
    }
}

實體類

package snake;

import java.awt.Graphics2D;
import java.awt.Rectangle;

public class Entity {
    private int x,y,size;

    public Entity(int size) {
        this.size = size;
    }
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
    public void setX(int x) {
        this.x = x;
    }
    public void setY(int y) {
        this.y = y;
    }
    public void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void move(int dx, int dy) {
        x += dx;
        y += dy;
    }
    public Rectangle getBound() {
        return new Rectangle(x, y, size, size);
    }
    public boolean isCollision(Entity o) {
        if(o == this) return false;
        return getBound().intersects(o.getBound());
    }
    public void render(Graphics2D g2d) {
        g2d.fillRect(x + 1, y + 1, size - 2, size - 2);
    }
}

我知道這是您關於堆棧溢出的第一個問題,非常歡迎。 即使這通常不是這里想要的問題類型,我想指出您代碼中的一個小錯誤,該錯誤會導致蛇卡在0,0平方中。 當您檢查與牆的碰撞時:

if (head.getX() > 0) head.setX(0);
if (head.getY() > 0) head.setY(0);

它應該是:

if (head.getX() > WIDTH) head.setX(0);
if (head.getY() > HEIGHT) head.setY(0);

我之所以回答這個問題,僅僅是因為我知道成為開發世界新手的痛苦。 希望您會繼續使用該代碼,並從中獲得許多樂趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM