private void processInput() { for (KeyEvent event : game.getInput().getKeyPressedEvents()) { switch (event.getKeyCode()) { case KeyEvent.VK_UP: snake.setDirection(Direction.UP); break; case KeyEvent.VK_RIGHT: snake.setDirection(Direction.RIGHT); break; case KeyEvent.VK_DOWN: snake.setDirection(Direction.DOWN); break; case KeyEvent.VK_LEFT: snake.setDirection(Direction.LEFT); break; case KeyEvent.VK_F5: save(); break; case KeyEvent.VK_F6: load(); break; case KeyEvent.VK_SPACE: if (paused) paused = false; else paused = true; break; } } }
// метод, который проверяет, пуста ли клетка для отрисовки яблока private boolean isCellEmpty(int x, int y) { for (BodyPart bodyPart : snake.getBody()) { if (bodyPart.getX() == x && bodyPart.getY() == y) { return false; } } return true; }
// змейка будет двигаться как только нужная задержка была достигнута // обрабатывает внесенные изменения и обновляет игровое поле @Override public void update(long nanosPassed) { processInput(); if (!paused) { if (isGameOver()) { game.setScene(new GameOverScence(game, panel, delay)); return; } if (snakeMoveDelay.updateAndCheck(nanosPassed)) { stepsCount++; mlSeconds += 200; String seconds = Clock.getTime(mlSeconds); panel.setData(seconds, stepsCount, appleCount); snake.move(); // удлинение змейки, при поедании яблока BodyPart head = snake.head(); if (head.getX() < 1) { head.setX(WORLD_WIDTH); } if (head.getX() > WORLD_WIDTH) { head.setX(1); } if (head.getY() < 1) { head.setY(WORLD_HEIGHT); } if (head.getY() > WORLD_HEIGHT) { head.setY(1); } if (head.getX() == apple.getX() && head.getY() == apple.getY()) { List<BodyPart> body = snake.getBody(); BodyPart lastPart = body.get(body.size() - 1); body.add(new BodyPart(lastPart.getX(), lastPart.getY())); ++appleCount; if (isGameOver()) { game.setScene(new GameOverScence(game, panel, delay)); } else { placeApple(); } } } } }
private void drawSnake(Graphics2D g) { g.setColor(panel.getColor()); for (BodyPart bodyPart : snake.getBody()) { g.fillRect( bodyPart.getX() * CELL_SIZE - CELL_SIZE, game.getScreenSize().height - (bodyPart.getY() * CELL_SIZE), CELL_SIZE, CELL_SIZE); } }
// метод, проверяющий не закончилась ли игра (победой или проигрышем - не важно) private boolean isGameOver() { if (snake.head().getX() == 0 || snake.head().getX() == WORLD_WIDTH || snake.head().getY() == 0 || snake.head().getY() == WORLD_HEIGHT) return true; for (BodyPart bodyPart : snake.getBody()) { if (bodyPart != snake.head() && snake.head().getX() == bodyPart.getX() && snake.head().getY() == bodyPart.getY()) { return true; } } return false; }