Add main game files
Signed-off-by: Chris Cromer <chris@cromer.cl>
This commit is contained in:
parent
a18c84046e
commit
0e61872461
108
src/cl/cromer/game/Celda.java
Normal file
108
src/cl/cromer/game/Celda.java
Normal file
@ -0,0 +1,108 @@
|
||||
package cl.cromer.game;
|
||||
|
||||
import java.awt.*;
|
||||
import javax.swing.JComponent;
|
||||
|
||||
public class Celda extends JComponent implements Constantes {
|
||||
/**
|
||||
* The x coordinate of the cell
|
||||
*/
|
||||
private int x;
|
||||
/**
|
||||
* The y coordinate of the cell
|
||||
*/
|
||||
private int y;
|
||||
/**
|
||||
* The type of cell
|
||||
*/
|
||||
private Type type = Type.SPACE;
|
||||
|
||||
/**
|
||||
* The possible types of cell that this could be
|
||||
*/
|
||||
protected enum Type {
|
||||
SPACE,
|
||||
PLAYER,
|
||||
END,
|
||||
ENEMY,
|
||||
OBSTACLE,
|
||||
PRIZE
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the cell with its coordinates
|
||||
* @param x The x coordinate
|
||||
* @param y The y coordinate
|
||||
*/
|
||||
public Celda(int x, int y) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the type of cell that this will be
|
||||
* @param type The type
|
||||
*/
|
||||
public void setType(Type type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current type of this cell
|
||||
* @return Returns the type of cell
|
||||
*/
|
||||
private Type getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override the paintComponent method of JComponent to pain the cell based on type
|
||||
* @param g The graphics object to paint
|
||||
*/
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
// Draw the borders
|
||||
g.setColor(Color.black);
|
||||
g.drawRect(x, y, CELL_PIXELS, CELL_PIXELS);
|
||||
|
||||
g.setFont(new Font("monospaced", Font.BOLD, 10));
|
||||
|
||||
// Fill in the cell
|
||||
switch (getType()) {
|
||||
case SPACE:
|
||||
g.setColor(Color.orange);
|
||||
g.fillRect(x + 1, y + 1, CELL_PIXELS - 1, CELL_PIXELS - 1);
|
||||
break;
|
||||
case PLAYER:
|
||||
g.setColor(Color.green);
|
||||
g.fillRect(x + 1, y + 1, CELL_PIXELS - 1, CELL_PIXELS - 1);
|
||||
g.setColor(Color.black);
|
||||
g.drawString(String.valueOf(PLAYER), x + (CELL_PIXELS / 2), y + (CELL_PIXELS / 2));
|
||||
break;
|
||||
case END:
|
||||
g.setColor(Color.pink);
|
||||
g.fillRect(x + 1, y + 1, CELL_PIXELS - 1, CELL_PIXELS - 1);
|
||||
g.setColor(Color.black);
|
||||
g.drawString(String.valueOf(END), x + (CELL_PIXELS / 2), y + (CELL_PIXELS / 2));
|
||||
break;
|
||||
case PRIZE:
|
||||
g.setColor(Color.red);
|
||||
g.fillRect(x + 1, y + 1, CELL_PIXELS - 1, CELL_PIXELS - 1);
|
||||
g.setColor(Color.black);
|
||||
g.drawString(String.valueOf(PRIZE), x + (CELL_PIXELS / 2), y + (CELL_PIXELS / 2));
|
||||
break;
|
||||
case ENEMY:
|
||||
g.setColor(Color.blue);
|
||||
g.fillRect(x + 1, y + 1, CELL_PIXELS - 1, CELL_PIXELS - 1);
|
||||
g.setColor(Color.black);
|
||||
g.drawString(String.valueOf(ENEMY), x + (CELL_PIXELS / 2), y + (CELL_PIXELS / 2));
|
||||
break;
|
||||
case OBSTACLE:
|
||||
g.setColor(Color.black);
|
||||
g.fillRect(x + 1, y + 1, CELL_PIXELS - 1, CELL_PIXELS - 1);
|
||||
g.setColor(Color.white);
|
||||
g.drawString(String.valueOf(OBSTACLE), x + (CELL_PIXELS / 2), y + (CELL_PIXELS / 2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
66
src/cl/cromer/game/Constantes.java
Normal file
66
src/cl/cromer/game/Constantes.java
Normal file
@ -0,0 +1,66 @@
|
||||
package cl.cromer.game;
|
||||
|
||||
/**
|
||||
* Constants used in the game
|
||||
*/
|
||||
public interface Constantes {
|
||||
/**
|
||||
* The size in pixels of the cells
|
||||
*/
|
||||
int CELL_PIXELS = 32;
|
||||
/**
|
||||
* The number of cells to draw horizontally
|
||||
*/
|
||||
int HORIZONTAL_CELLS = 40;
|
||||
/**
|
||||
* The number of cells to draw vertically
|
||||
*/
|
||||
int VERTICAL_CELLS = 20;
|
||||
/**
|
||||
* The window border width
|
||||
*/
|
||||
int WINDOW_BORDER_WIDTH = 30;
|
||||
/**
|
||||
* The window border height
|
||||
*/
|
||||
int WINDOW_BORDER_HEIGHT = 50;
|
||||
|
||||
/**
|
||||
* The scene width
|
||||
*/
|
||||
int SCENE_WIDTH = (CELL_PIXELS * HORIZONTAL_CELLS) + WINDOW_BORDER_WIDTH;
|
||||
/**
|
||||
* The scene height
|
||||
*/
|
||||
int SCENE_HEIGHT = (CELL_PIXELS * VERTICAL_CELLS) + WINDOW_BORDER_HEIGHT;
|
||||
|
||||
/**
|
||||
* The letter that represents the player
|
||||
*/
|
||||
char PLAYER = 'P';
|
||||
/**
|
||||
* The letter that represents the end
|
||||
*/
|
||||
char END = 'F';
|
||||
/**
|
||||
* The letter that represents the prize
|
||||
*/
|
||||
char PRIZE = 'G';
|
||||
/**
|
||||
* The letter that represents the enemy
|
||||
*/
|
||||
char ENEMY = 'E';
|
||||
/**
|
||||
* The letter that represents the obstacle
|
||||
*/
|
||||
char OBSTACLE = 'O';
|
||||
|
||||
/**
|
||||
* The amount of prizes to draw
|
||||
*/
|
||||
int PRIZES = 5;
|
||||
/**
|
||||
* The amount of enemies to draw
|
||||
*/
|
||||
int ENEMIES = 3;
|
||||
}
|
86
src/cl/cromer/game/Escenario.java
Normal file
86
src/cl/cromer/game/Escenario.java
Normal file
@ -0,0 +1,86 @@
|
||||
package cl.cromer.game;
|
||||
|
||||
import java.awt.Graphics;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Random;
|
||||
import javax.swing.JComponent;
|
||||
|
||||
/**
|
||||
* The scene used for the game
|
||||
*/
|
||||
public class Escenario extends JComponent implements Constantes {
|
||||
|
||||
private Celda[][] celdas;
|
||||
|
||||
/**
|
||||
* Initialize the scene
|
||||
*/
|
||||
public Escenario() {
|
||||
Random random = new Random();
|
||||
|
||||
final int cells = (HORIZONTAL_CELLS * VERTICAL_CELLS);
|
||||
final int obstacles = (int) Math.floor((double) cells * 0.1);
|
||||
|
||||
int random_value;
|
||||
ArrayList<RandomPositionList> arrayList = new ArrayList<>();
|
||||
for (int i = 0; i < ENEMIES; i++) {
|
||||
random_value = random.nextInt(cells - 1) + 1;
|
||||
while (arrayList.contains(new RandomPositionList(random_value, Celda.Type.ENEMY))) {
|
||||
random_value = random.nextInt(cells - 1) + 1;
|
||||
}
|
||||
arrayList.add(new RandomPositionList(random_value, Celda.Type.ENEMY));
|
||||
}
|
||||
for (int i = 0; i < PRIZES; i++) {
|
||||
random_value = random.nextInt(cells - 1) + 1;
|
||||
while (arrayList.contains(new RandomPositionList(random_value, Celda.Type.PRIZE))) {
|
||||
random_value = random.nextInt(cells - 1) + 1;
|
||||
}
|
||||
arrayList.add(new RandomPositionList(random_value, Celda.Type.PRIZE));
|
||||
}
|
||||
for (int i = 0; i < obstacles; i++) {
|
||||
random_value = random.nextInt(cells - 1) + 1;
|
||||
while (arrayList.contains(new RandomPositionList(random_value, Celda.Type.OBSTACLE))) {
|
||||
random_value = random.nextInt(cells - 1) + 1;
|
||||
}
|
||||
arrayList.add(new RandomPositionList(random_value, Celda.Type.OBSTACLE));
|
||||
}
|
||||
random_value = random.nextInt(cells - 1) + 1;
|
||||
while (arrayList.contains(new RandomPositionList(random_value, Celda.Type.END))) {
|
||||
random_value = random.nextInt(cells - 1) + 1;
|
||||
}
|
||||
arrayList.add(new RandomPositionList(random_value, Celda.Type.END));
|
||||
|
||||
celdas = new Celda[HORIZONTAL_CELLS][VERTICAL_CELLS];
|
||||
int cell_count = 0;
|
||||
for (int i = 0; i < HORIZONTAL_CELLS; i++) {
|
||||
for (int j = 0; j < VERTICAL_CELLS; j++) {
|
||||
celdas[i][j] = new Celda(i * CELL_PIXELS + 10, j * CELL_PIXELS + 10);
|
||||
if (i == 0 && j == 0) {
|
||||
celdas[i][j].setType(Celda.Type.PLAYER);
|
||||
}
|
||||
else {
|
||||
for (RandomPositionList randomList : arrayList) {
|
||||
if (cell_count == randomList.getPosition()) {
|
||||
celdas[i][j].setType(randomList.getType());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
cell_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Override the painComponent method of JComponent to paint the scene
|
||||
* @param g The graphics object to paint
|
||||
*/
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
for (int i = 0; i < HORIZONTAL_CELLS; i++) {
|
||||
for (int j = 0; j < VERTICAL_CELLS; j++) {
|
||||
celdas[i][j].paintComponent(g);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
28
src/cl/cromer/game/Lienzo.java
Normal file
28
src/cl/cromer/game/Lienzo.java
Normal file
@ -0,0 +1,28 @@
|
||||
package cl.cromer.game;
|
||||
|
||||
import java.awt.Canvas;
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics;
|
||||
|
||||
public class Lienzo extends Canvas implements Constantes {
|
||||
|
||||
private Escenario escenario;
|
||||
|
||||
/**
|
||||
* Initialize the canvas
|
||||
*/
|
||||
public Lienzo() {
|
||||
escenario = new Escenario();
|
||||
this.setBackground(Color.orange);
|
||||
this.setSize(SCENE_WIDTH, SCENE_HEIGHT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Override the paint method of Canvas to paint all the scene components
|
||||
* @param g The graphics object to paint
|
||||
*/
|
||||
@Override
|
||||
public void paint(Graphics g) {
|
||||
escenario.paintComponent(g);
|
||||
}
|
||||
}
|
19
src/cl/cromer/game/Main.java
Normal file
19
src/cl/cromer/game/Main.java
Normal file
@ -0,0 +1,19 @@
|
||||
package cl.cromer.game;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
|
||||
/**
|
||||
* The main class of the game
|
||||
*/
|
||||
public class Main {
|
||||
/**
|
||||
* Open the main window
|
||||
* @param args The arguments passed to the application
|
||||
*/
|
||||
public static void main (String[]args) {
|
||||
VentanaPrincipal ventanaPrincipal = new VentanaPrincipal();
|
||||
ventanaPrincipal.setVisible(true);
|
||||
ventanaPrincipal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
}
|
||||
|
||||
}
|
58
src/cl/cromer/game/RandomPositionList.java
Normal file
58
src/cl/cromer/game/RandomPositionList.java
Normal file
@ -0,0 +1,58 @@
|
||||
package cl.cromer.game;
|
||||
|
||||
/**
|
||||
* This class is used to save locations of random cells for enemies, obstacles, and prizes
|
||||
*/
|
||||
public class RandomPositionList {
|
||||
/**
|
||||
* The position
|
||||
*/
|
||||
private int position;
|
||||
/**
|
||||
* The type
|
||||
*/
|
||||
private Celda.Type type;
|
||||
|
||||
/**
|
||||
* Initialize the position and type of the list
|
||||
* @param position The position
|
||||
* @param type The type
|
||||
*/
|
||||
public RandomPositionList(int position, Celda.Type type) {
|
||||
this.position = position;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the position that the object should be drawn
|
||||
* @return The position
|
||||
*/
|
||||
public int getPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the type of object that will be stored at the cell position
|
||||
* @return Returns the cell type
|
||||
*/
|
||||
public Celda.Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override the equals method so that we only compare the position and not the type
|
||||
* @param o The object to compare
|
||||
* @return Returns true if they are the same
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
RandomPositionList that = (RandomPositionList) o;
|
||||
return position == that.position;
|
||||
}
|
||||
}
|
21
src/cl/cromer/game/VentanaPrincipal.java
Normal file
21
src/cl/cromer/game/VentanaPrincipal.java
Normal file
@ -0,0 +1,21 @@
|
||||
package cl.cromer.game;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import java.awt.Dimension;
|
||||
|
||||
/**
|
||||
* The main window of the game
|
||||
*/
|
||||
public class VentanaPrincipal extends JFrame implements Constantes {
|
||||
/**
|
||||
* Initialize the main window
|
||||
*/
|
||||
public VentanaPrincipal() {
|
||||
Lienzo lienzo = new Lienzo();
|
||||
Dimension screenSize = super.getToolkit().getScreenSize();
|
||||
this.getContentPane().add(lienzo);
|
||||
this.setSize(screenSize.width, screenSize.height);
|
||||
this.setExtendedState(this.getExtendedState() | JFrame.MAXIMIZED_BOTH);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user