Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Essentially in this exercise the world contains a snake (or worm) as shown in th

ID: 3606489 • Letter: E

Question

Essentially in this exercise the world contains a snake (or worm) as shown in the picture below. The head is marked in blue, the rest of the body is in red. The snake moves in the direction of the head in one of four directions: north, east, south and west. As the snake moves you can change its direction of movement in real time by pressing the right key. The following table summarizes that information: pressing this key (or keys) will set the direction of movement to 8 (or up-arrow) 6 (or right-arrow) 2 (or down-arrow) 4 (or left-arrow) north east south west will cause the snake to stop Here now are some snapshots: This is the starting position for my game. Snake is not moving.

Explanation / Answer

Hello ,

As per the your instruction Implemeted the snake game as follows  

DriverClass : Snake.java( need to be execute )

package com.praveen.chegg;

import java.awt.EventQueue;

import javax.swing.JFrame;

public class Snake extends JFrame {

public Snake() {

add(new Board());

setResizable(false);

pack();

setTitle("Snake");

setLocationRelativeTo(null);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

JFrame ex = new Snake();

ex.setVisible(true);

}

});

}

}

BusinessClass : Board.java (complete logic implemeted here)

package com.praveen.chegg;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.FontMetrics;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

import javax.swing.JPanel;

import javax.swing.Timer;

public class Board extends JPanel implements ActionListener {

private final int B_WIDTH = 300;

private final int B_HEIGHT = 300;

private final int DOT_SIZE = 10;

private final int ALL_DOTS = 900;

private final int RAND_POS = 29;

private final int DELAY = 300;

private final int x[] = new int[ALL_DOTS];

private final int y[] = new int[ALL_DOTS];

private int dots;

private int apple_x;

private int apple_y;

private boolean leftDirection = false;

private boolean rightDirection = true;

private boolean upDirection = false;

private boolean downDirection = false;

private boolean inGame = true;

private Timer timer;

private Image ball;

private Image apple;

private Image head;

public Board() {

addKeyListener(new TAdapter());

setBackground(Color.LIGHT_GRAY);

setFocusable(true);

setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));

loadImages();

initGame();

}

private void loadImages() {

ImageIcon iid = new ImageIcon("dot.png");

ball = iid.getImage();

ImageIcon iia = new ImageIcon("apple.png");

apple = iia.getImage();

ImageIcon iih = new ImageIcon("head.png");

head = iih.getImage();

}

private void initGame() {

dots = 3;

for (int z = 0; z < dots; z++) {

x[z] = 50 - z * 10;

y[z] = 50;

}

locateApple();

timer = new Timer(DELAY, this);

timer.start();

}

@Override

public void paintComponent(Graphics g) {

super.paintComponent(g);

doDrawing(g);

}

private void doDrawing(Graphics g) {

if (inGame) {

g.drawImage(apple, apple_x, apple_y, this);

for (int z = 0; z < dots; z++) {

if (z == 0) {

g.drawImage(head, x[z], y[z], this);

} else {

g.drawImage(ball, x[z], y[z], this);

}

}

Toolkit.getDefaultToolkit().sync();

} else {

gameOver(g);

}

}

private void gameOver(Graphics g) {

String msg = "Game Over";

Font small = new Font("Helvetica", Font.BOLD, 14);

FontMetrics metr = getFontMetrics(small);

g.setColor(Color.white);

g.setFont(small);

g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2, B_HEIGHT / 2);

}

private void checkApple() {

if ((x[0] == apple_x) && (y[0] == apple_y)) {

dots++;

locateApple();

}

}

private void move() {

for (int z = dots; z > 0; z--) {

x[z] = x[(z - 1)];

y[z] = y[(z - 1)];

}

if (leftDirection) {

x[0] -= DOT_SIZE;

}

if (rightDirection) {

x[0] += DOT_SIZE;

}

if (upDirection) {

y[0] -= DOT_SIZE;

}

if (downDirection) {

y[0] += DOT_SIZE;

}

}

private void checkCollision() {

for (int z = dots; z > 0; z--) {

if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) {

inGame = false;

}

}

if (y[0] >= B_HEIGHT) {

inGame = false;

}

if (y[0] < 0) {

inGame = false;

}

if (x[0] >= B_WIDTH) {

inGame = false;

}

if (x[0] < 0) {

inGame = false;

}

if(!inGame) {

timer.stop();

}

}

private void locateApple() {

int r = (int) (Math.random() * RAND_POS);

apple_x = ((r * DOT_SIZE));

r = (int) (Math.random() * RAND_POS);

apple_y = ((r * DOT_SIZE));

}

@Override

public void actionPerformed(ActionEvent e) {

if (inGame) {

checkApple();

checkCollision();

move();

}

repaint();

}

private class TAdapter extends KeyAdapter {

@Override

public void keyPressed(KeyEvent e) {

int key = e.getKeyCode();

if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) {

leftDirection = true;

upDirection = false;

downDirection = false;

}

if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) {

rightDirection = true;

upDirection = false;

downDirection = false;

}

if ((key == KeyEvent.VK_UP) && (!downDirection)) {

upDirection = true;

rightDirection = false;

leftDirection = false;

}

if ((key == KeyEvent.VK_DOWN) && (!upDirection)) {

downDirection = true;

rightDirection = false;

leftDirection = false;

}

}

}

}

Additional implemented

1) eating extra dot ,

2) If touching to boundaries , game over scenario

Note: Please take care dot , apple .png files

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote