From be7d3e2cd1070ae35094ae70707cc12860650a0c Mon Sep 17 00:00:00 2001 From: Xevion Date: Sat, 12 Dec 2020 02:11:54 -0600 Subject: [PATCH] improved Snake2, singlefile no classes simplified & functional --- other/Snake/src/Snake2.java | 154 ++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/other/Snake/src/Snake2.java b/other/Snake/src/Snake2.java index 4622c4c..7f88e94 100644 --- a/other/Snake/src/Snake2.java +++ b/other/Snake/src/Snake2.java @@ -1,3 +1,157 @@ +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Scanner; + +import static java.lang.System.out; + +class Coordinate +{ + public int x; + public int y; + + public Coordinate() + { + this(0, 0); + } + + public Coordinate(int x, int y) + { + this.x = x; + this.y = y; + } + + public Coordinate plus(Coordinate other) + { + return new Coordinate(this.x + other.x, this.y + other.y); + } + + public boolean equals(Coordinate other) + { + return this.x == other.x && this.y == other.y; + } + + @Override + public String toString() + { + return String.format("(%s, %s)", this.x, this.y); + } +} + + public class Snake2 { + private static final Coordinate UP = new Coordinate(0, -1); + private static final Coordinate DOWN = new Coordinate(0, 1); + private static final Coordinate LEFT = new Coordinate(-1, 0); + private static final Coordinate RIGHT = new Coordinate(1, 0); + + public static void main(String[] args) throws FileNotFoundException + { + // Read in board input + char[][] board = new char[15][15]; + Scanner input = new Scanner(new File("./src/snake2.dat")); + for (int y = 0; y < 15; y++) { + String line = input.nextLine(); + for (int x = 0; x < 15; x++) + // If the line was cut short, fill with spaces + if (line.length() >= x + 1) + board[y][x] = line.charAt(x); + else + board[y][x] = ' '; + } + + input.nextLine(); + // Use all inputs and simulate Snake + while (input.hasNextLine()) { + // copy the original board + char[][] copyBoard = new char[15][15]; + for (int y = 0; y < 15; y++) + copyBoard[y] = board[y].clone(); + simulate(copyBoard, input.nextLine()); + } + } + + public static void simulate(char[][] board, String commands) + { + Coordinate snakeHead = null; + // Scan for the snake from top to bottom, right to left + for (int y = 14; y >= 0; y--) { + for (int x = 14; x >= 0; x--) { + if (board[y][x] == 'X') { + snakeHead = new Coordinate(x, y); + board[y][x] = ' '; + break; + } + } + if (snakeHead != null) + break; + } + + // Initialize simulation variables + ArrayList snake = new ArrayList(); + Coordinate previousMove = RIGHT; // moves to the RIGHT by default + Coordinate currentMove = null; + boolean gameover = false; + int pellets = 0; + + // Add initial snake positions + assert snakeHead != null; + snake.add(snakeHead); // Snake head is always the right most, and starts 3 nodes long + snake.add(snakeHead.plus(new Coordinate(-1, 0))); + snake.add(snakeHead.plus(new Coordinate(-2, 0))); + + // Parse each character command into a coordinate movement + for (char command : commands.toCharArray()) { + switch (command) { + case 'L': + currentMove = LEFT; + break; + case 'R': + currentMove = RIGHT; + break; + case 'U': + currentMove = UP; + break; + case 'D': + currentMove = DOWN; + break; + case 'O': + currentMove = previousMove; + break; + } + previousMove = currentMove; + Coordinate newPosition = snake.get(0).plus(currentMove); + + // Test if new move is outside boundaries or if the snake contains the new position + if (newPosition.x < 0 || newPosition.y < 0 || newPosition.x >= 15 || newPosition.y >= 15 || snake.contains(newPosition)) { + gameover = true; + break; + } + + // 'Move' the snake by adding new position, popping tail once + snake.add(0, newPosition); + + // Check if pellet can be eaten, if not, pop off tail + if (board[newPosition.y][newPosition.x] == 'F') { + pellets++; + board[newPosition.y][newPosition.x] = ' '; + } else { + snake.remove(snake.size() - 1); + } + } + + // Print game's end status + if (gameover) + out.println("GAME OVER"); + else + out.println(String.format("%d pellets", pellets)); + + // Print game board + for (Coordinate node : snake) { + board[node.y][node.x] = 'X'; + } + for (char[] line : board) + out.println(line); + } }