diff --git a/Maze Generation/GridApp.java b/Maze Generation/GridApp.java new file mode 100644 index 0000000000000000000000000000000000000000..ec15385b960893c98293cb0ae920390bc1715434 --- /dev/null +++ b/Maze Generation/GridApp.java @@ -0,0 +1,34 @@ +package grid; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +public class GridApp extends JFrame { + + + + public static void main(String[] args) { + + + // Skapa ett JFrame-fönster + JFrame frame = new JFrame("MazeRunner"); + frame.setIconImage(null); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(700, 700); + frame.setUndecorated(true); + frame.setResizable(false); + frame.setLocationRelativeTo(null); + + + Runner runner = new Runner(); + frame.add(runner); + + + frame.setVisible(true); + + } +} diff --git a/Maze Generation/MazeGenerator.java b/Maze Generation/MazeGenerator.java new file mode 100644 index 0000000000000000000000000000000000000000..da7010caeca20cf83ec045b5fc580ac6c1cf9761 --- /dev/null +++ b/Maze Generation/MazeGenerator.java @@ -0,0 +1,71 @@ +package grid; + +import java.util.Random; + +public class MazeGenerator { + private int width, height; + public int[][] maze; + private Random random; + + // Directions for moving in the maze + private static final int[][] DIRECTIONS = { + {0, 2}, {2, 0}, {0, -2}, {-2, 0} // Right, Down, Left, Up + }; + + public MazeGenerator(int width, int height) { + this.width = width; + this.height = height; + this.maze = new int[height][width]; + this.random = new Random(); + + generateMaze(1, 1); // Start generating from (1, 1) + } + + public void generateMaze(int x, int y) { + + maze[y][x] = 1; + + + // Randomly shuffle directions + for (int i = 0; i < DIRECTIONS.length; i++) { + int j = random.nextInt(DIRECTIONS.length); + int[] temp = DIRECTIONS[i]; + DIRECTIONS[i] = DIRECTIONS[j]; + DIRECTIONS[j] = temp; + } + + for (int[] direction : DIRECTIONS) { + int newX = x + direction[0]; + int newY = y + direction[1]; + + // Check if the new cell is within bounds and not visited + if (newX > 0 && newX < width && newY > 0 && newY < height && maze[newY][newX] == 0) { + maze[y + direction[1] / 2][x + direction[0] / 2] = 1; // Remove wall + generateMaze(newX, newY); // Recursively generate maze from the new cell + } + } + } + + + + + + + /* public void printMaze() { + for (int[] row : maze) { + for (int cell : row) { + System.out.print(cell == 1 ? " " : "#"); // Print space for path and # for walls + + } + System.out.println(); + } + } + + public static void main(String[] args) { + + + + MazeGenerator mazeGenerator = new MazeGenerator(21, 21); + mazeGenerator.printMaze(); + }*/ +} \ No newline at end of file diff --git a/Maze Generation/Runner.java b/Maze Generation/Runner.java new file mode 100644 index 0000000000000000000000000000000000000000..72899fedfaa8cce449872193c0da6b6fa3271acb --- /dev/null +++ b/Maze Generation/Runner.java @@ -0,0 +1,228 @@ +package grid; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.Random; + +import javax.swing.JPanel; +import javax.swing.Timer; +import java.util.concurrent.ThreadLocalRandom; + + + +public class Runner extends JPanel implements ActionListener, KeyListener{ + + private Timer timer; + private Color c = Color.DARK_GRAY; + + int rader = 71; + int kolumner = rader; + + int grid_x; + int grid_y; + int size = 10; + + int x = 0; + int y = 0; + + int[][] grid = new int[rader][kolumner]; + int[][] man = new int[rader][kolumner]; + + MazeGenerator maze = new MazeGenerator(rader, kolumner); + + + public Runner() { + // Skapa en timer som triggar var 10:e millisekund (100 fps) + timer = new Timer(10, this); + timer.start(); // Starta timern + + // Lägg till KeyListener + setFocusable(true); + addKeyListener(this); + + + } + + + + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + + + for (int i = 0; i < rader; i++) { + for (int j = 0; j < kolumner; j++) { + // Calculate x and y coordinates for each cell + grid_x = i * size; + grid_y = j * size; + + + grid[i][j] = maze.maze[i][j]; + + man[rader/2][kolumner/2] = 3; + + if (grid[i][j] == 1) { + g.setColor(Color.gray); + g.fillRect(grid_x, grid_y, size, size); + g.setColor(c); + } + + if (man[i][j] == 2) { + g.setColor(Color.cyan); + g.fillRect(grid_x, grid_y, size, size); + g.setColor(c); + + } + if (man[i][j] == 3) { + g.setColor(Color.magenta); + g.fillRect(grid_x, grid_y, size, size); + g.setColor(c); + + + } + + + + g.drawRect(grid_x, grid_y, size, size); + } + + } + + } + + + + + + // Detta anropas varje gång timern triggar en uppdatering + @Override + public void actionPerformed(ActionEvent e) { + + man[x][y] = 2; + + + // Be om att panelen ritas om + repaint(); + } + + + + + ////////////////////////////////////////////////////// + // // + // MAPPING INPUTS // + // // + ////////////////////////////////////////////////////// + + @Override + public void keyPressed(KeyEvent e) { + + switch (e.getKeyCode()) { + + case KeyEvent.VK_ESCAPE: + System.exit(0); + + break; + case KeyEvent.VK_W: + if(y > 0) { + + if (grid[x][y-1] == 0) { + + y -= 1; + man[x][y+1] = 3; + + } + } + // Flytta uppåt + break; + case KeyEvent.VK_S: + if(y < kolumner -1) { + + if (grid[x][y+1] == 0) { + + y += 1; + man[x][y-1] = 3; + } + + } + // Flytta nedåt + break; + + + case KeyEvent.VK_A: + if(x >= 1) { + + + if (grid[x-1][y] == 0) { + + x -= 1; + man[x+1][y] = 3; + } + + + + } + // Flytta vänster + break; + + + case KeyEvent.VK_D: + if(x < rader - 1) { + + if (grid[x+1][y] == 0) { + + + x += 1; + man[x-1][y] = 3; + + } + } + + // Flytta höger + break; + + case KeyEvent.VK_R: + + + + for (int i = 0; i < rader ; i++) { + for (int j = 0; j < kolumner ; j++) { + man[i][j] = 0; + } + } + + + x = ThreadLocalRandom.current().nextInt(rader/3, rader- rader/3); + y = ThreadLocalRandom.current().nextInt(kolumner/3, kolumner-kolumner/3); + + while (grid[x][y] == 1) { + x = ThreadLocalRandom.current().nextInt(rader/3, rader- rader/3); + y = ThreadLocalRandom.current().nextInt(kolumner/3, kolumner-kolumner/3); + } + + + + + break; + + + + } + } + + + @Override + public void keyReleased(KeyEvent e) { + // Inget behov av att hantera detta i detta exempel + } + + @Override + public void keyTyped(KeyEvent e) { + // Inget behov av att hantera detta i detta exempel + } + +}