Ich versuche, das klassische Schlangenspiel zu machen, das den Apfel isst, aber ich habe Probleme mit den Bewegungen. Die Schlange kann sich diagonal bewegen. Zum Beispiel, wenn die Schlange sich nach rechts bewegt und ich die Pfeiltaste nach oben klicke, wird sie diagonal verlaufen, nicht gerade nach oben y-Koordinate. Wie kann ich dieses Problem beheben? Vielen Dank.Wie erstellt man die Bewegung in Snake Game?
Game.java
public class Game extends Canvas implements Runnable, KeyListener {
public static int width = 300;
public static int height = width/16 * 9;
public static int scale = 3;
private Thread thread;
private JFrame frame;
private Snake snake;
private boolean running = false;
public Game(){
Dimension size = new Dimension(width * scale, height * scale);
setPreferredSize(size);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
addKeyListener(this);
frame = new JFrame();
snake = new Snake(200, 200);
}
public synchronized void start(){
running = true;
thread = new Thread(this, "Display");
thread.start();
}
public synchronized void stop(){
running = false;
try{
thread.join();
}catch (InterruptedException e){
e.printStackTrace();
}
}
@Override
public void run(){
while (running){
update();
render();
}
}
public void update(){
}
public void render(){
BufferStrategy bs = getBufferStrategy();
if(bs == null){
createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
snake.draw(g);
g.dispose();
bs.show();
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_W) {
snake.setYD(-1);
}
if(key == KeyEvent.VK_S){
snake.setYD(1);
}
if(key == KeyEvent.VK_A){
snake.setXD(-1);
}
if(key == KeyEvent.VK_D){
snake.setXD(1);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public static void main (String[] args){
Game game = new Game();
game.frame.setResizable(false);
game.frame.setTitle("Snake");
game.frame.add(game);
game.frame.pack();
game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.frame.setLocationRelativeTo(null);
game.frame.setVisible(true);
game.start();
}
}
Entity.java
public abstract class Entity {
protected int x, y;
public Entity(int x, int y){
this.x = x;
this.y = y;
}
public void draw(Graphics g){
}
public int getX() {return x;}
public int getY() {return y;}
}
Snake.java
public class Snake extends Entity {
private int xDirection, yDirection;
public Snake(int x, int y) {
super(x, y);
}
public void draw(Graphics g){
move();
g.setColor(Color.blue);
g.fillRect(x, y, 15, 15);
}
public void move(){
x += xDirection;
y += yDirection;
}
public void setXD(int value){
xDirection = value;
}
public void setYD(int value){
yDirection = value;
}
Sie müssen einige "Exklusivität" Logik implementieren, die nur eine Richtung einziehen erlaubt – UnholySheep