Space Invaders
The classic game Space Invaders, without GUI.
This commit is contained in:
		
							
								
								
									
										79
									
								
								SpaceInvaders/src/tp/p2/Level.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								SpaceInvaders/src/tp/p2/Level.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
package tp.p2;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano; DNI: 02723009Q
 | 
			
		||||
 * @clase TP1, GRUPO D.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public enum Level {
 | 
			
		||||
	EASY(4, 2, 0.2, 3, 0.5, 1), 
 | 
			
		||||
	HARD(8, 4, 0.3, 2, 0.2, 2),
 | 
			
		||||
	INSANE(12, 4, 0.5, 1, 0.1, 3);
 | 
			
		||||
 | 
			
		||||
	private int numRegularAliens;
 | 
			
		||||
	private int numDestroyerAliens;
 | 
			
		||||
	private int numCyclesToMoveOneCell;
 | 
			
		||||
	private double ovniFrequency;
 | 
			
		||||
	private double shootFrequency;
 | 
			
		||||
	private int numRowsOfRegularAliens;
 | 
			
		||||
	private double turnExplodeFrequency = 0.05; // actualmente no depende del nivel
 | 
			
		||||
 | 
			
		||||
	private Level(
 | 
			
		||||
			int numRegularAliens, 
 | 
			
		||||
			int numDestroyerAliens, 
 | 
			
		||||
			double shootFrequency, 
 | 
			
		||||
			int numCyclesToMoveOneCell, 
 | 
			
		||||
			double ovniFrequency, 
 | 
			
		||||
			int numRowsOfRegularAliens)
 | 
			
		||||
	{
 | 
			
		||||
		this.numRegularAliens = numRegularAliens;
 | 
			
		||||
		this.numDestroyerAliens = numDestroyerAliens;
 | 
			
		||||
		this.shootFrequency = shootFrequency;
 | 
			
		||||
		this.numCyclesToMoveOneCell = numCyclesToMoveOneCell;
 | 
			
		||||
		this.ovniFrequency = ovniFrequency;
 | 
			
		||||
		this.numRowsOfRegularAliens = numRowsOfRegularAliens;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	public int getNumRegularAliens() {
 | 
			
		||||
		return numRegularAliens;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getNumDestroyerAliens() {
 | 
			
		||||
		return numDestroyerAliens;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getShootFrequency() {
 | 
			
		||||
		return shootFrequency;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getNumCyclesToMoveOneCell() {
 | 
			
		||||
		return numCyclesToMoveOneCell;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getOvniFrequency() { 
 | 
			
		||||
		return ovniFrequency;
 | 
			
		||||
	}
 | 
			
		||||
	public int getNumRowsOfRegularAliens() {
 | 
			
		||||
		return numRowsOfRegularAliens;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getNumRegularAliensPerRow() {
 | 
			
		||||
		return numRegularAliens / numRowsOfRegularAliens;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getNumDestroyerAliensPerRow() {
 | 
			
		||||
		return getNumDestroyerAliens();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Level parse(String cadenaEntrada) {
 | 
			
		||||
		for (Level level : Level.values())
 | 
			
		||||
			if (level.name().equalsIgnoreCase(cadenaEntrada))
 | 
			
		||||
				return level;
 | 
			
		||||
	    return EASY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getTurnExplodeFrequency(){
 | 
			
		||||
		return turnExplodeFrequency;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										71
									
								
								SpaceInvaders/src/tp/p2/Main.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								SpaceInvaders/src/tp/p2/Main.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
package tp.p2;
 | 
			
		||||
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
import java.util.Scanner;
 | 
			
		||||
import java.lang.NumberFormatException;
 | 
			
		||||
import tp.p2.Level;
 | 
			
		||||
import tp.p2.controller.Controller;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano; DNI: 02723009Q
 | 
			
		||||
 * @clase TP1, GRUPO D.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Main {
 | 
			
		||||
	
 | 
			
		||||
	public static void main(String[] args) {
 | 
			
		||||
		Game game;
 | 
			
		||||
		Level level = null;
 | 
			
		||||
		Scanner in = null;
 | 
			
		||||
		int seed = 0;
 | 
			
		||||
		Random rnd = null;
 | 
			
		||||
		
 | 
			
		||||
		//Selecci<63>n de nivel:
 | 
			
		||||
		if(args.length >= 1) {
 | 
			
		||||
			level = Level.parse(args[0]);
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			level = Level.EASY;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//Selecci<63>n de semilla:
 | 
			
		||||
		if(args.length == 2) {
 | 
			
		||||
			try {
 | 
			
		||||
				seed = Integer.parseInt(args[1]);
 | 
			
		||||
			}
 | 
			
		||||
			catch (NumberFormatException ex){
 | 
			
		||||
				System.err.format(ex.getMessage() + " %n %n");
 | 
			
		||||
			}
 | 
			
		||||
			finally {
 | 
			
		||||
				rnd = new Random(seed);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			rnd = new Random(System.currentTimeMillis());
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		game = new Game(level, rnd);
 | 
			
		||||
		Controller controlador = new Controller(game, in); 
 | 
			
		||||
		controlador.run(game);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
//Selecci<63>n de nivel:
 | 
			
		||||
		if(args[0].contentEquals("EASY")) {
 | 
			
		||||
			nivel = Level.EASY;
 | 
			
		||||
		} else if(args[0].contentEquals("HARD")){
 | 
			
		||||
			nivel = Level.HARD;
 | 
			
		||||
		} else if(args[0].contentEquals("INSANE")) {
 | 
			
		||||
			nivel = Level.INSANE;
 | 
			
		||||
		}else {
 | 
			
		||||
			nivel = Level.EASY;
 | 
			
		||||
		}
 | 
			
		||||
*/
 | 
			
		||||
@@ -0,0 +1,40 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class BuySuperMissileCommand extends Command {
 | 
			
		||||
 | 
			
		||||
	public BuySuperMissileCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException {
 | 
			
		||||
		boolean exe = true;
 | 
			
		||||
		
 | 
			
		||||
		if(!game.buySuperMissile()) {
 | 
			
		||||
			System.err.println("Error, you can't buy a Super Missile right now.");
 | 
			
		||||
			exe = false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return exe;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("buy") || commandWords[0].equals("b")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/Command.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/Command.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandParseException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class Command {
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	protected final String name;
 | 
			
		||||
	protected final String shortcut;
 | 
			
		||||
	private final String details;
 | 
			
		||||
	private final String help;
 | 
			
		||||
	protected static final String incorrectNumArgsMsg = "Incorrect number of arguments";
 | 
			
		||||
	protected static final String incorrectArgsMSg = "Incorrect argument format";
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public Command(String name, String shortcut, String details, String help) {
 | 
			
		||||
		this.name = name;
 | 
			
		||||
		this.shortcut = shortcut;
 | 
			
		||||
		this.details = details;
 | 
			
		||||
		this.help = help;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public abstract boolean execute(Game game) throws CommandExecuteException;
 | 
			
		||||
	public abstract Command parse(String[] commandWords) throws CommandParseException;
 | 
			
		||||
	
 | 
			
		||||
	protected boolean matchCommandName(String name) {
 | 
			
		||||
		return this.shortcut.equalsIgnoreCase(name) || this.name.equalsIgnoreCase(name);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String helpText() {
 | 
			
		||||
		return this.details + ": " + this.help + "\n";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,63 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandParseException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class CommandGenerator {
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private static final int MAXCOMMANDS = 14;
 | 
			
		||||
	private static Command[] avaliableCommands = {
 | 
			
		||||
		new MoveCommand("move", "m", "Move <left|right><1|2>", "Moves UCM-Ship to the indicated direction."),
 | 
			
		||||
		new ShotCommand("shoot", "s", "Shoot", "UCM-Ship launches a missile."),
 | 
			
		||||
		new ShockwaveCommand("shockwave", "w", "ShockWave", "UCM-Ship releases a shock wave."),
 | 
			
		||||
		new ListCommand("list", "l", "List", "Prints the list of available ships."),
 | 
			
		||||
		new ResetCommand("reset", "r", "Reset", "Starts a new game."),
 | 
			
		||||
		new HelpCommand("help", "h", "Help", "Prints this help message."),
 | 
			
		||||
		new ExitCommand("exit", "e", "Exit", "Terminates the program."),
 | 
			
		||||
		new UpdateCommand("none", "", "[none]", "Skips one cycle."),
 | 
			
		||||
		new BuySuperMissileCommand("buy", "b", "Buy", "Buy a Super Missile."),
 | 
			
		||||
		new StringifyCommand("stringify", "sf", "Stringify", "Serialize the board."),
 | 
			
		||||
		new ListPrintersCommand("listPrinters", "lp", "ListPrinters", "Prints the list of available printers."),
 | 
			
		||||
		new SuperShootCommand("supermissile", "sm", "SuperMissile", "UCM-Ship launches a super-missile."),
 | 
			
		||||
		new SaveCommand("save", "g", "Save", "Save the game on a file."),
 | 
			
		||||
		new LoadCommand("load", "c", "Load", "Load the game of a file.")
 | 
			
		||||
	};
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	
 | 
			
		||||
	//Invoca al m<>todo "parse" de cada subclase de Command.
 | 
			
		||||
	public static Command parseCommand(String[] commandWords) throws CommandParseException {
 | 
			
		||||
		boolean encontrado = false;
 | 
			
		||||
		int i = 0;
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		while(!encontrado && i < MAXCOMMANDS) {
 | 
			
		||||
			if(avaliableCommands[i].parse(commandWords) != null) {
 | 
			
		||||
				cmd = avaliableCommands[i];
 | 
			
		||||
				encontrado = true;
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				i++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(cmd == null) { throw new CommandParseException(Command.incorrectArgsMSg); }
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//Invoca al m<>todo helpText() de cada subclase de Command.
 | 
			
		||||
	//Este m<>todo es invocado por el m<>todo "execute" de la clase HelpCommand.
 | 
			
		||||
	public static String commandHelp(){
 | 
			
		||||
		String help = "";
 | 
			
		||||
		
 | 
			
		||||
		for (int i = 0; i < avaliableCommands.length; i++) {
 | 
			
		||||
			help += avaliableCommands[i].helpText();
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return help;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										33
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/ExitCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/ExitCommand.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class ExitCommand extends Command {
 | 
			
		||||
 | 
			
		||||
	public ExitCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
		// TODO Auto-generated constructor stub
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) {
 | 
			
		||||
		game.exit();
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("exit") || commandWords[0].equals("e")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/HelpCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/HelpCommand.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class HelpCommand extends Command {
 | 
			
		||||
 | 
			
		||||
	public HelpCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
		// TODO Auto-generated constructor stub
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException {
 | 
			
		||||
		String help = CommandGenerator.commandHelp();
 | 
			
		||||
		
 | 
			
		||||
		if(help != "") {
 | 
			
		||||
			System.out.println(help);
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			throw new CommandExecuteException("No description available.");
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("help") || commandWords[0].equals("h")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/ListCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/ListCommand.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class ListCommand extends Command {
 | 
			
		||||
 | 
			
		||||
	public ListCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
		// TODO Auto-generated constructor stub
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) {
 | 
			
		||||
		System.out.println(
 | 
			
		||||
				"[R]egular ship: Points: 5 - Harm: 0 - Shield: 2 \n" +
 | 
			
		||||
				"[D]estroyer ship: Points: 10 - Harm: 1 - Shield: 1 \n" +
 | 
			
		||||
				"[E]xplosive destroyer ship: Points: 10 - Harm: 1 - Shield: 1 \n" +		
 | 
			
		||||
				"[O]vni: Points: 25 - Harm: 0 - Shield: 1 \n" +
 | 
			
		||||
				"^__^: Harm: 1 - Shield: 3\n");
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("list") || commandWords[0].equals("l")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.PrinterTypes;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class ListPrintersCommand extends Command {
 | 
			
		||||
 | 
			
		||||
	public ListPrintersCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
		// TODO Auto-generated constructor stub
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException {
 | 
			
		||||
		System.out.println(PrinterTypes.printerHelp(game));
 | 
			
		||||
		if(PrinterTypes.printerHelp(game) == "") {
 | 
			
		||||
			throw new CommandExecuteException("No printers avaliable.");
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("listPrinters") || commandWords[0].equals("lp")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										99
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/LoadCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/LoadCommand.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileNotFoundException;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.io.UnsupportedEncodingException;
 | 
			
		||||
import java.util.Scanner;
 | 
			
		||||
import tp.p2.Level;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandParseException;
 | 
			
		||||
import tp.p2.controller.Exceptions.FileContentsException;
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.GameObjects.AlienShip;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class LoadCommand extends Command {
 | 
			
		||||
	private Scanner in;
 | 
			
		||||
 | 
			
		||||
	public LoadCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
		this.in = new Scanner(System.in);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException {
 | 
			
		||||
		BufferedReader inStream = null;
 | 
			
		||||
		FileContentsVerifier verifier = new FileContentsVerifier();
 | 
			
		||||
		String gameString = "";
 | 
			
		||||
		int restCycles = 0;
 | 
			
		||||
		
 | 
			
		||||
		System.out.println("File name > ");
 | 
			
		||||
		String fileName = in.nextLine() + ".dat";
 | 
			
		||||
		
 | 
			
		||||
		try {
 | 
			
		||||
			inStream = new BufferedReader(
 | 
			
		||||
						new InputStreamReader(
 | 
			
		||||
							new FileInputStream(fileName), "UTF-8"));
 | 
			
		||||
			try {
 | 
			
		||||
				//Read from the archive until we find the game line:
 | 
			
		||||
				do {
 | 
			
		||||
					gameString = inStream.readLine().trim();
 | 
			
		||||
				} while(!verifier.verifyGameString(gameString));
 | 
			
		||||
				String[] words = gameString.split(FileContentsVerifier.separator1);
 | 
			
		||||
				restCycles = Integer.parseInt(words[1]);
 | 
			
		||||
				
 | 
			
		||||
				//Read the level:
 | 
			
		||||
				String levelString = inStream.readLine().trim();
 | 
			
		||||
				verifier.verifyLevelString(levelString);
 | 
			
		||||
				Level level = Level.parse(levelString);
 | 
			
		||||
				
 | 
			
		||||
				//Load the game information:
 | 
			
		||||
				game.load(inStream);
 | 
			
		||||
				AlienShip.setNumAliens(level.getNumRegularAliens()+level.getNumDestroyerAliens());
 | 
			
		||||
				game = new Game(level, restCycles);
 | 
			
		||||
				System.out.println("Game successfully loaded from file " + fileName + "\n");
 | 
			
		||||
			}
 | 
			
		||||
			catch (FileContentsException e) {
 | 
			
		||||
				e.printStackTrace();
 | 
			
		||||
			} 
 | 
			
		||||
			catch (IOException e) {
 | 
			
		||||
				e.printStackTrace();
 | 
			
		||||
			}
 | 
			
		||||
			finally { 
 | 
			
		||||
				try {
 | 
			
		||||
					inStream.close();
 | 
			
		||||
				} 
 | 
			
		||||
				catch (IOException e) {
 | 
			
		||||
					e.printStackTrace();
 | 
			
		||||
				}  
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		catch (FileNotFoundException e) {	
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
		}
 | 
			
		||||
		catch (UnsupportedEncodingException e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) throws CommandParseException {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("load") || commandWords[0].equals("c")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										59
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/MoveCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/MoveCommand.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandParseException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class MoveCommand extends Command{
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private String moveDir;
 | 
			
		||||
	private int nCasillas;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public MoveCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException{
 | 
			
		||||
		boolean exe = false;
 | 
			
		||||
	
 | 
			
		||||
		if(game.move(this.moveDir, this.nCasillas)) {
 | 
			
		||||
			exe = true;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return exe;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Command parse(String[] commandWords) throws CommandParseException { 
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords.length > 3) {
 | 
			
		||||
			throw new CommandParseException(Command.incorrectNumArgsMsg);
 | 
			
		||||
		}
 | 
			
		||||
		if(commandWords[0].equals("move") || commandWords[0].equals("m")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
			if(commandWords[1].equals("left") || commandWords[1].equals("right")) {
 | 
			
		||||
				this.moveDir = commandWords[1];
 | 
			
		||||
				if(Integer.parseInt(commandWords[2]) > 0 && Integer.parseInt(commandWords[2]) <= 2) {
 | 
			
		||||
					this.nCasillas = Integer.parseInt(commandWords[2]);
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					throw new CommandParseException("The number of cells is not correct.");
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				throw new CommandParseException("Error reading the direction.");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,33 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class ResetCommand extends Command {
 | 
			
		||||
 | 
			
		||||
	public ResetCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
		// TODO Auto-generated constructor stub
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) {
 | 
			
		||||
		game.reset();
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("reset") || commandWords[0].equals("r")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/SaveCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/SaveCommand.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedWriter;
 | 
			
		||||
import java.io.FileWriter;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Scanner;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandParseException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.GamePrinter;
 | 
			
		||||
import tp.p2.game.Stringifier;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class SaveCommand extends Command {
 | 
			
		||||
	
 | 
			
		||||
	private Scanner in;
 | 
			
		||||
	
 | 
			
		||||
	public SaveCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
		this.in = new Scanner(System.in);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException {
 | 
			
		||||
		GamePrinter printer = new Stringifier();
 | 
			
		||||
		
 | 
			
		||||
		System.out.println("File name > ");
 | 
			
		||||
		String fileName = in.nextLine() + ".dat";
 | 
			
		||||
		
 | 
			
		||||
		BufferedWriter outChars = null;         
 | 
			
		||||
		
 | 
			
		||||
		try {
 | 
			
		||||
			outChars = new BufferedWriter(new FileWriter(fileName));
 | 
			
		||||
			outChars.write(printer.toString(game));
 | 
			
		||||
			outChars.close();
 | 
			
		||||
		} 
 | 
			
		||||
		catch (IOException e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
		} 
 | 
			
		||||
		finally {
 | 
			
		||||
			if(outChars == null) { throw new CommandExecuteException("No se pudo guardar el juego."); }
 | 
			
		||||
			else { System.out.println("Game successfully saved in file " + fileName + ". Use the 'load' command to reload it.\n"); }
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) throws CommandParseException {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("save") || commandWords[0].equals("g")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class ShockwaveCommand extends Command {
 | 
			
		||||
	//Atributos:
 | 
			
		||||
 | 
			
		||||
	public ShockwaveCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException {
 | 
			
		||||
		boolean exe = true;
 | 
			
		||||
		
 | 
			
		||||
		if(!game.shockWave()) {
 | 
			
		||||
			exe = false;
 | 
			
		||||
			throw new CommandExecuteException("El ShockWave no est<73> disponible.");
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return exe;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("shockwave") || commandWords[0].equals("w")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										41
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/ShotCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								SpaceInvaders/src/tp/p2/controller/Commands/ShotCommand.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class ShotCommand extends Command {
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public ShotCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException {
 | 
			
		||||
		boolean exe = true;
 | 
			
		||||
	
 | 
			
		||||
		if(!game.shootLaser()) {
 | 
			
		||||
			exe = false;
 | 
			
		||||
			throw new CommandExecuteException("You can't launch two missiles at once.");
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return exe;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("shot") || commandWords[0].equals("s")) {
 | 
			
		||||
			//cmd = new ShotCommand(commandWords[0], "m", "Realiza un disparo", null);
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,47 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Commands.Command;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.GamePrinter;
 | 
			
		||||
import tp.p2.game.Stringifier;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class StringifyCommand extends Command{
 | 
			
		||||
 | 
			
		||||
	public StringifyCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
		// TODO Auto-generated constructor stub
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException {
 | 
			
		||||
		GamePrinter printer = new Stringifier();
 | 
			
		||||
		
 | 
			
		||||
		if(printer != null) {
 | 
			
		||||
			System.out.println(printer.toString(game));
 | 
			
		||||
		}
 | 
			
		||||
		/*
 | 
			
		||||
		else {
 | 
			
		||||
			throw new CommandExecuteException("The board could not be serializable.");
 | 
			
		||||
		}*/
 | 
			
		||||
		
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if (commandWords[0].equals("stringify") || commandWords[0].equals("sf")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,41 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class SuperShootCommand extends Command {
 | 
			
		||||
 | 
			
		||||
	public SuperShootCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean execute(Game game) throws CommandExecuteException {
 | 
			
		||||
		boolean exe = true;
 | 
			
		||||
	
 | 
			
		||||
		if(!game.shootSuperLaser()) {
 | 
			
		||||
			exe = false;
 | 
			
		||||
			throw new CommandExecuteException("You don't have super-missiles.");
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return exe;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("supermissile") || commandWords[0].equals("sm")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,31 @@
 | 
			
		||||
package tp.p2.controller.Commands;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class UpdateCommand extends Command {
 | 
			
		||||
	public UpdateCommand(String name, String shortcut, String details, String help) {
 | 
			
		||||
		super(name, shortcut, details, help);
 | 
			
		||||
		// TODO Auto-generated constructor stub
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean execute(Game game) {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Command parse(String[] commandWords) {
 | 
			
		||||
		Command cmd = null;
 | 
			
		||||
		
 | 
			
		||||
		if(commandWords[0].equals("none") || commandWords[0].equals("n") || commandWords[0].equals("")) {
 | 
			
		||||
			cmd = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return cmd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										97
									
								
								SpaceInvaders/src/tp/p2/controller/Controller.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								SpaceInvaders/src/tp/p2/controller/Controller.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,97 @@
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
package tp.p2.controller;
 | 
			
		||||
 | 
			
		||||
import java.util.Scanner;
 | 
			
		||||
import tp.p2.controller.Commands.Command;
 | 
			
		||||
import tp.p2.controller.Commands.CommandGenerator;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandParseException;
 | 
			
		||||
import tp.p2.game.BoardPrinter;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.GamePrinter;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Controller {	
 | 
			
		||||
	//Atributos: 
 | 
			
		||||
	Scanner in;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public Controller(Game game, Scanner in) {
 | 
			
		||||
		this.in = new Scanner(System.in);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	
 | 
			
		||||
	//Ejecuta el bucle del juego hasta que termina:
 | 
			
		||||
	public void run(Game game) {
 | 
			
		||||
		GamePrinter printer = new BoardPrinter(Game.MAXFIL, Game.MAXCOL);
 | 
			
		||||
		System.out.println(game + printer.toString(game));
 | 
			
		||||
		
 | 
			
		||||
		do {
 | 
			
		||||
			System.out.println("Command > ");
 | 
			
		||||
			String[] words = in.nextLine().toLowerCase().trim().split("\\s+");
 | 
			
		||||
			
 | 
			
		||||
			try {
 | 
			
		||||
				Command command = CommandGenerator.parseCommand(words);
 | 
			
		||||
				if (command != null) {
 | 
			
		||||
					if (command.execute(game)) {
 | 
			
		||||
						game.update();
 | 
			
		||||
						System.out.println(game + printer.toString(game));
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					System.out.format("Command " + words[0] + " not found. \n");
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			catch (CommandParseException | CommandExecuteException ex) {
 | 
			
		||||
				System.out.format(ex.getMessage() + " %n %n");
 | 
			
		||||
			}
 | 
			
		||||
		} while (!game.isFinished());
 | 
			
		||||
		game.update();
 | 
			
		||||
		System.out.println(game + printer.toString(game));
 | 
			
		||||
		System.out.println(game.getWinnerMessage());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//TPpr2v2:
 | 
			
		||||
/*
 | 
			
		||||
public class Controller {	
 | 
			
		||||
//Atributos: 
 | 
			
		||||
Scanner in;
 | 
			
		||||
 | 
			
		||||
//Constructor:
 | 
			
		||||
public Controller(Game game, Scanner in) {
 | 
			
		||||
	this.in = new Scanner(System.in);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//M<>todos:
 | 
			
		||||
 | 
			
		||||
//Ejecuta el bucle del juego hasta que termina:
 | 
			
		||||
public void run(Game game) {
 | 
			
		||||
	System.out.println(game);
 | 
			
		||||
	do {
 | 
			
		||||
		System.out.println("Command > ");
 | 
			
		||||
		String[] words = in.nextLine().toLowerCase().trim().split("\\s+");
 | 
			
		||||
		
 | 
			
		||||
		Command command = CommandGenerator.parseCommand(words);
 | 
			
		||||
		if (command != null) {
 | 
			
		||||
			if (command.execute(game)) {
 | 
			
		||||
				game.update();
 | 
			
		||||
				System.out.println(game);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			System.out.format("Command " + words[0] + " not found. \n");
 | 
			
		||||
		}
 | 
			
		||||
	} while (!game.isFinished());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
@@ -0,0 +1,21 @@
 | 
			
		||||
package tp.p2.controller.Exceptions;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class CommandExecuteException extends Exception {
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = 1L;
 | 
			
		||||
	
 | 
			
		||||
	private String message;
 | 
			
		||||
	
 | 
			
		||||
	public CommandExecuteException(String string) {
 | 
			
		||||
		this.message = "Failed to run command.\n" 
 | 
			
		||||
				+ "Cause of exception: \n"
 | 
			
		||||
				+ this + ": " + string;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String getMessage() {
 | 
			
		||||
		return this.message;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,22 @@
 | 
			
		||||
package tp.p2.controller.Exceptions;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class CommandParseException extends Exception {
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = 1L;
 | 
			
		||||
	
 | 
			
		||||
	private String message;
 | 
			
		||||
	
 | 
			
		||||
	public CommandParseException(String string) {
 | 
			
		||||
		this.message = "Command can<61>t be parse.\n"
 | 
			
		||||
					+ "Cause of exception: \n"
 | 
			
		||||
					+ this + ": " + string;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String getMessage() {
 | 
			
		||||
		return this.message;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
package tp.p2.controller.Exceptions;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class FileContentsException extends Exception {
 | 
			
		||||
	public static final String wrongPrefixMsg = "unknown game attribute: ";
 | 
			
		||||
	public static final String lineTooLongMsg = "too many words on line commencing: ";
 | 
			
		||||
	public static final String lineTooShortMsg = "missing data on line commencing: ";
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = 1L;
 | 
			
		||||
	
 | 
			
		||||
	private String string;
 | 
			
		||||
	
 | 
			
		||||
	public FileContentsException(String string) {
 | 
			
		||||
		this.string = "Contend not found.\n"
 | 
			
		||||
				+ "Cause of exception: \n"
 | 
			
		||||
				+ this + ": " + string;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return this.string;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										76
									
								
								SpaceInvaders/src/tp/p2/game/BoardPrinter.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								SpaceInvaders/src/tp/p2/game/BoardPrinter.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
			
		||||
package tp.p2.game;
 | 
			
		||||
 | 
			
		||||
import tp.p2.util.MyStringUtils;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class BoardPrinter implements GamePrinter {
 | 
			
		||||
	private int numRows; 
 | 
			
		||||
	private int numCols;
 | 
			
		||||
	private String[][] board;
 | 
			
		||||
	private final String space = " ";
 | 
			
		||||
	
 | 
			
		||||
	public BoardPrinter(int maxfil, int maxcol) {
 | 
			
		||||
		this.numRows = maxfil;
 | 
			
		||||
		this.numCols = maxcol;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString(Game game) {
 | 
			
		||||
		encodeGame(game);
 | 
			
		||||
		
 | 
			
		||||
		int cellSize = 7;
 | 
			
		||||
		int marginSize = 2;
 | 
			
		||||
		String vDelimiter = "|";
 | 
			
		||||
		String hDelimiter = "-";
 | 
			
		||||
		
 | 
			
		||||
		String rowDelimiter = MyStringUtils.repeat(hDelimiter, (numCols * (cellSize + 1)) - 1); 
 | 
			
		||||
		String margin = MyStringUtils.repeat(space, marginSize);
 | 
			
		||||
		String lineDelimiter = String.format("%n%s%s%n", margin + space, rowDelimiter);
 | 
			
		||||
		
 | 
			
		||||
		StringBuilder str = new StringBuilder();
 | 
			
		||||
		
 | 
			
		||||
		str.append(lineDelimiter);
 | 
			
		||||
		
 | 
			
		||||
		for(int i=0; i<numRows; i++) {
 | 
			
		||||
			str.append(margin).append(vDelimiter);
 | 
			
		||||
			for (int j=0; j<numCols; j++) {
 | 
			
		||||
				str.append(MyStringUtils.centre(board[i][j], cellSize)).append(vDelimiter);
 | 
			
		||||
			}
 | 
			
		||||
			str.append(lineDelimiter);
 | 
			
		||||
		}
 | 
			
		||||
		return str.toString();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private void encodeGame(Game game) {
 | 
			
		||||
		this.board = new String[numRows][numCols];
 | 
			
		||||
		for(int i = 0; i < numRows; i++) {
 | 
			
		||||
			for(int j = 0; j < numCols; j++) {
 | 
			
		||||
				board[i][j] =  game.board.toString(i, j);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public GamePrinter parse(String name) {
 | 
			
		||||
		GamePrinter tablero = null;
 | 
			
		||||
		
 | 
			
		||||
		if(name.equals("boardprinter") || name.equals("board")) {
 | 
			
		||||
			tablero = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return tablero;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String helpText() {
 | 
			
		||||
		return "prints the game formatted as a board of dimension: " + Game.MAXFIL + "," + Game.MAXCOL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setGame(Game game) {
 | 
			
		||||
		//
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										224
									
								
								SpaceInvaders/src/tp/p2/game/FileContentsVerifier.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								SpaceInvaders/src/tp/p2/game/FileContentsVerifier.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,224 @@
 | 
			
		||||
package tp.p2.game;
 | 
			
		||||
 | 
			
		||||
import tp.p2.Level;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class FileContentsVerifier{
 | 
			
		||||
	
 | 
			
		||||
	public static final String separator1 = ";";
 | 
			
		||||
	public static final String separator2 = ",";
 | 
			
		||||
	public static final String labelRefSeparator = " - ";
 | 
			
		||||
 | 
			
		||||
	private String foundInFileString = "";
 | 
			
		||||
	
 | 
			
		||||
	private void appendToFoundInFileString(String linePrefix) {
 | 
			
		||||
		foundInFileString += linePrefix;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Don't catch NumberFormatException.
 | 
			
		||||
	public boolean verifyCycleString(String cycleString) {
 | 
			
		||||
		String[] words = cycleString.split(separator1);
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		if (words.length != 2
 | 
			
		||||
				|| !verifyCurrentCycle(Integer.parseInt(words[1])))
 | 
			
		||||
			return false;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean verifyLevelString(String levelString) {
 | 
			
		||||
		String[] words = levelString.split(separator1);
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		if (words.length != 2
 | 
			
		||||
				|| !verifyLevel(Level.parse(words[1])))
 | 
			
		||||
			return false;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// Don't catch NumberFormatException.
 | 
			
		||||
	public boolean verifyOvniString(String lineFromFile, Game game, int armour) {
 | 
			
		||||
		String[] words = lineFromFile.split(separator1);
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		if (words.length != 3) return false;
 | 
			
		||||
		String[] coords = words[1].split(separator2);
 | 
			
		||||
		if ( !verifyCoords(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), game)
 | 
			
		||||
				|| !verifyLives(Integer.parseInt(words[2]), armour) ) 
 | 
			
		||||
			return false;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Don't catch NumberFormatException.
 | 
			
		||||
	public boolean verifyPlayerString(String lineFromFile, Game game, int armour) {
 | 
			
		||||
		String[] words = lineFromFile.split(separator1);
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		if (words.length != 6) return false;
 | 
			
		||||
 | 
			
		||||
		String[] coords = words[1].split(separator2);
 | 
			
		||||
		
 | 
			
		||||
		if ( !verifyCoords(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), game)
 | 
			
		||||
				|| !verifyLives(Integer.parseInt(words[2]), armour)
 | 
			
		||||
				|| !verifyPoints(Integer.parseInt(words[3]))
 | 
			
		||||
				|| !verifyBool(words[4]) )
 | 
			
		||||
			return false;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// Don't catch NumberFormatException.
 | 
			
		||||
	/*
 | 
			
		||||
	public boolean verifyAlienShipString(String lineFromFile, Game game, int armour) {
 | 
			
		||||
		String[] words = lineFromFile.split(separator1);
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		if (words.length != 5) return false;
 | 
			
		||||
 | 
			
		||||
		String[] coords = words[1].split(separator2);
 | 
			
		||||
		
 | 
			
		||||
		if ( !verifyCoords(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), game)
 | 
			
		||||
				|| !verifyLives(Integer.parseInt(words[2]), armour)
 | 
			
		||||
				|| !verifyCycleToNextAlienMove(Integer.parseInt(words[3]), game.getLevel())
 | 
			
		||||
				|| !verifyDir(words[4]) ) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	*/
 | 
			
		||||
	
 | 
			
		||||
	//DestroyerAlien
 | 
			
		||||
	public boolean verifyDestroyerShipString(String lineFromFile, Game game, int armour) {
 | 
			
		||||
		String[] words = lineFromFile.split(separator1);
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		if (words.length != 5) return false;
 | 
			
		||||
		
 | 
			
		||||
		if(!words[0].equals("D")) return false;
 | 
			
		||||
		
 | 
			
		||||
		String[] coords = words[1].split(separator2);
 | 
			
		||||
		
 | 
			
		||||
		if ( !verifyCoords(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), game)
 | 
			
		||||
				|| !verifyLives(Integer.parseInt(words[2]), armour)
 | 
			
		||||
				|| !verifyCycleToNextAlienMove(Integer.parseInt(words[3]), game.getLevel())
 | 
			
		||||
				|| !verifyDir(words[4]) ) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//RegularAlien
 | 
			
		||||
	public boolean verifyRegularShipString(String lineFromFile, Game game, int armour) {
 | 
			
		||||
		String[] words = lineFromFile.split(separator1);
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		if (words.length != 5) return false;
 | 
			
		||||
		
 | 
			
		||||
		if(!words[0].equals("R")) return false;
 | 
			
		||||
		
 | 
			
		||||
		String[] coords = words[1].split(separator2);
 | 
			
		||||
		
 | 
			
		||||
		if ( !verifyCoords(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), game)
 | 
			
		||||
				|| !verifyLives(Integer.parseInt(words[2]), armour)
 | 
			
		||||
				|| !verifyCycleToNextAlienMove(Integer.parseInt(words[3]), game.getLevel())
 | 
			
		||||
				|| !verifyDir(words[4]) ) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//ExplosiveAlien
 | 
			
		||||
	public boolean verifyExplosiveShipString(String lineFromFile, Game game, int armour) {
 | 
			
		||||
		String[] words = lineFromFile.split(separator1);
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		if (words.length != 5) return false;
 | 
			
		||||
		
 | 
			
		||||
		if(!words[0].equals("E")) return false;
 | 
			
		||||
		
 | 
			
		||||
		String[] coords = words[1].split(separator2);
 | 
			
		||||
		
 | 
			
		||||
		if ( !verifyCoords(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), game)
 | 
			
		||||
				|| !verifyLives(Integer.parseInt(words[2]), armour)
 | 
			
		||||
				|| !verifyCycleToNextAlienMove(Integer.parseInt(words[3]), game.getLevel())
 | 
			
		||||
				|| !verifyDir(words[4]) ) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// Don't catch NumberFormatException.
 | 
			
		||||
	public boolean verifyWeaponString(String lineFromFile, Game game) {
 | 
			
		||||
		String[] words = lineFromFile.split(separator1);
 | 
			
		||||
		if (words.length != 2) return false;
 | 
			
		||||
		
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		String[] coords = words[1].split(separator2);
 | 
			
		||||
 | 
			
		||||
		if ( !verifyCoords(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), game) )
 | 
			
		||||
			return false;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean verifyRefString(String lineFromFile) {
 | 
			
		||||
		String[] words = lineFromFile.split(labelRefSeparator);
 | 
			
		||||
		if (words.length != 2 || !verifyLabel(words[1])) return false;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static boolean verifyLabel(String label) {
 | 
			
		||||
		return Integer.parseInt(label) > 0;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static boolean verifyCoords(int x, int y, Game game) {
 | 
			
		||||
		return game.isOnBoard(x, y);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static boolean verifyCurrentCycle(int currentCycle) {
 | 
			
		||||
		return currentCycle >= 0;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static boolean verifyLevel(Level level) {
 | 
			
		||||
		return level != null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static boolean verifyDir(String dir) {
 | 
			
		||||
		return dir != null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static boolean verifyLives(int live, int armour) {
 | 
			
		||||
		return 0 < live && live <= armour;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static boolean verifyPoints(int points) {
 | 
			
		||||
		return points >= 0;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static boolean verifyCycleToNextAlienMove(int cycle, Level level) {
 | 
			
		||||
		return 0 <= cycle && cycle <= level.getNumCyclesToMoveOneCell();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// parseBoolean converts any string different from "true" to false.
 | 
			
		||||
	public static boolean verifyBool(String boolString) {
 | 
			
		||||
		return boolString.equals("true") || boolString.equals("false");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean isMissileOnLoadedBoard() {
 | 
			
		||||
		return foundInFileString.toUpperCase().contains("M");
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// Use a regular expression to verify the string of concatenated prefixes found
 | 
			
		||||
	public boolean verifyLines() {
 | 
			
		||||
		// TO DO: compare foundInFileString with a regular expression
 | 
			
		||||
		return true; 
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// text explaining allowed concatenated prefixes
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		// TO DO
 | 
			
		||||
		return "";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean verifyGameString(String gameString) {
 | 
			
		||||
		String[] words = gameString.split(";");
 | 
			
		||||
		appendToFoundInFileString(words[0]);
 | 
			
		||||
		if (words.length != 2)
 | 
			
		||||
			return false;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										265
									
								
								SpaceInvaders/src/tp/p2/game/Game.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										265
									
								
								SpaceInvaders/src/tp/p2/game/Game.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,265 @@
 | 
			
		||||
package tp.p2.game;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
import tp.p2.Level;
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.controller.Exceptions.FileContentsException;
 | 
			
		||||
import tp.p2.game.GameObjects.BoardInitializer;
 | 
			
		||||
import tp.p2.game.GameObjects.GameObject;
 | 
			
		||||
import tp.p2.game.GameObjects.Ovni;
 | 
			
		||||
import tp.p2.game.GameObjects.AlienShip;
 | 
			
		||||
import tp.p2.game.GameObjects.Shockwave;
 | 
			
		||||
import tp.p2.game.GameObjects.SuperMissile;
 | 
			
		||||
import tp.p2.game.GameObjects.UCMMissile;
 | 
			
		||||
import tp.p2.game.GameObjects.UCMShip;
 | 
			
		||||
import tp.p2.game.GameObjects.Interfaces.IPlayerController;
 | 
			
		||||
import tp.p2.game.GameObjects.Lists.GameObjectBoard;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Game implements IPlayerController{
 | 
			
		||||
	//Constantes:
 | 
			
		||||
	public final static int MAXFIL = 9;
 | 
			
		||||
	public final static int MAXCOL = 8;
 | 
			
		||||
	public final static int DAMAGE = 1;
 | 
			
		||||
	public final static int COSTSUPERMISSILE = 20;
 | 
			
		||||
	
 | 
			
		||||
	//Atributos
 | 
			
		||||
	private int currentCycle;
 | 
			
		||||
	private Random rand;
 | 
			
		||||
	private Level level;
 | 
			
		||||
	private int restCycles;
 | 
			
		||||
 | 
			
		||||
	GameObjectBoard board;
 | 
			
		||||
 | 
			
		||||
	private UCMShip player;
 | 
			
		||||
	
 | 
			
		||||
	private boolean doExit;
 | 
			
		||||
	private BoardInitializer initializer;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public Game (Level level, Random random){
 | 
			
		||||
		this.rand = random;
 | 
			
		||||
		this.level = level;
 | 
			
		||||
		this.restCycles = this.level.getNumCyclesToMoveOneCell();
 | 
			
		||||
		initializer = new BoardInitializer();
 | 
			
		||||
		initGame();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public Game (Level level, int restCycles){
 | 
			
		||||
		this.rand = new Random(System.currentTimeMillis());
 | 
			
		||||
		this.level = level;
 | 
			
		||||
		this.restCycles = restCycles;
 | 
			
		||||
		this.currentCycle = restCycles;
 | 
			
		||||
		initializer = null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public void initGame () {
 | 
			
		||||
		currentCycle = 0;
 | 
			
		||||
		board = initializer.initialize(this, level);
 | 
			
		||||
		player = new UCMShip(this, MAXFIL - 1, MAXCOL / 2);
 | 
			
		||||
		board.add(player);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Random getRandom() {
 | 
			
		||||
		return rand;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public Level getLevel() {
 | 
			
		||||
		return level;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getCurrentCycle() {
 | 
			
		||||
		return this.currentCycle;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void reset() {
 | 
			
		||||
		initGame();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void addObject(GameObject object) {
 | 
			
		||||
		board.add(object);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String positionToString(int fila, int columna) {
 | 
			
		||||
		return board.toString(fila, columna);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean isFinished() {
 | 
			
		||||
		return playerWin() || aliensWin() || doExit;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean aliensWin() {
 | 
			
		||||
		return !player.isAlive() || AlienShip.haveLanded();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private boolean playerWin () {
 | 
			
		||||
		return AlienShip.allDead();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void update() {
 | 
			
		||||
		board.computerAction();
 | 
			
		||||
		board.update();
 | 
			
		||||
		currentCycle += 1;
 | 
			
		||||
		if(this.restCycles == 0) {
 | 
			
		||||
			this.restCycles = this.level.getNumCyclesToMoveOneCell();
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			restCycles--;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean isOnBoard(int fila, int columna) {
 | 
			
		||||
		return MAXFIL > fila && MAXCOL > columna;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void exit() {
 | 
			
		||||
		doExit = true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String infoToString() {
 | 
			
		||||
		return "Life: " + this.player.getLive() + "\n" 
 | 
			
		||||
				+ "Number of cycles: " + this.currentCycle + "\n"
 | 
			
		||||
				+ "Points: " + this.player.getPoints() + "\n"
 | 
			
		||||
				+ "Remaining aliens: " + AlienShip.numAliens() + "\n" 
 | 
			
		||||
				+ "ShockWave: " + this.player.getShockWave() + "\n"
 | 
			
		||||
				+ "Number of SuperMissiles: " + this.player.getNumSuperMissiles() + "\n";
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		//BoardPrinter gp = new BoardPrinter(MAXFIL, MAXCOL);	
 | 
			
		||||
		//String tablero = this.infoToString() + gp.toString(this);
 | 
			
		||||
		//return tablero;
 | 
			
		||||
		
 | 
			
		||||
		return this.infoToString();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String serialize() {
 | 
			
		||||
		return "--SPACE INVADERS v2.0--\n\n"
 | 
			
		||||
				+ "G;" + this.restCycles + "\n"
 | 
			
		||||
				+ "L;" + this.level + "\n"
 | 
			
		||||
				+ this.board.serialize() + "\n";			
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String getWinnerMessage () {
 | 
			
		||||
		if (playerWin()) return "Player win!";
 | 
			
		||||
		else if (aliensWin()) return "Aliens win!";
 | 
			
		||||
		else if (doExit) return "Player exits the game";
 | 
			
		||||
		else return "This should not happen";
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean move(String dir, int numCells) throws CommandExecuteException{
 | 
			
		||||
		boolean move = false;
 | 
			
		||||
 | 
			
		||||
		if(this.player.move(dir, numCells)) {
 | 
			
		||||
			move = true;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return move;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean shootLaser() {
 | 
			
		||||
		boolean shoot = false;
 | 
			
		||||
		
 | 
			
		||||
		if(this.player.getMisile()) {
 | 
			
		||||
			this.enableMissile();
 | 
			
		||||
			shoot = true;
 | 
			
		||||
		}
 | 
			
		||||
		return shoot;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean shockWave() {
 | 
			
		||||
		boolean sw = false;
 | 
			
		||||
		
 | 
			
		||||
		if(this.player.getShockWave()) {
 | 
			
		||||
			sw = true;
 | 
			
		||||
			this.board.swAttack();
 | 
			
		||||
			this.player.deleteSW();
 | 
			
		||||
			GameObject ovni = new Ovni(this, 0, Game.MAXCOL, 1);
 | 
			
		||||
			this.board.add(ovni);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return sw;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean shootSuperLaser() {
 | 
			
		||||
		boolean shoot = false;
 | 
			
		||||
		
 | 
			
		||||
		if(this.player.getSuperMisile() || this.player.getMisile()) {
 | 
			
		||||
			this.enableSuperMissile();
 | 
			
		||||
			shoot = true;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return shoot;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void receivePoints(int points) {
 | 
			
		||||
		this.player.addPoints(points);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void enableShockWave() {
 | 
			
		||||
		Shockwave sw = new Shockwave(this, this.player.getFila(), this.player.getColumna(), 1);
 | 
			
		||||
		this.player.activeSW(sw);
 | 
			
		||||
		this.board.add(sw);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void enableMissile() {
 | 
			
		||||
		UCMMissile misil = new UCMMissile(this, this.player.getFila(), this.player.getColumna(), 1);
 | 
			
		||||
		this.player.activeMisile(misil);
 | 
			
		||||
		this.board.add(misil);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void enableSuperMissile() {
 | 
			
		||||
		SuperMissile misil = new SuperMissile(this, this.player.getFila(), this.player.getColumna(), 1);
 | 
			
		||||
		this.player.activeSuperMisile(misil);
 | 
			
		||||
		this.board.add(misil);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean buySuperMissile() throws CommandExecuteException {
 | 
			
		||||
		boolean buy = false;
 | 
			
		||||
		
 | 
			
		||||
		if (this.player.getPoints() >= COSTSUPERMISSILE) {
 | 
			
		||||
			this.player.subtractPoints(COSTSUPERMISSILE);
 | 
			
		||||
			this.player.getSuperMissile();
 | 
			
		||||
			buy = true;
 | 
			
		||||
		}
 | 
			
		||||
		if(!buy) {
 | 
			
		||||
			throw new CommandExecuteException("You don't have enough points.");
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return buy;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getRestCycles() {
 | 
			
		||||
		return this.restCycles;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void load(BufferedReader inStream) throws IOException, FileContentsException {
 | 
			
		||||
		this.board.setCurrentObjects(0);
 | 
			
		||||
		String line = inStream.readLine().trim();
 | 
			
		||||
		while (line != null && !line.isEmpty()) {
 | 
			
		||||
			FileContentsVerifier verifier = new FileContentsVerifier();
 | 
			
		||||
			GameObject gameObject = GameObjectGenerator.parse(line, this, verifier);
 | 
			
		||||
			if(gameObject == null) {
 | 
			
		||||
				throw new FileContentsException("invalid file, unrecognised line prefix");
 | 
			
		||||
			}
 | 
			
		||||
			board.add(gameObject);
 | 
			
		||||
			line = inStream.readLine().trim();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										46
									
								
								SpaceInvaders/src/tp/p2/game/GameObjectGenerator.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								SpaceInvaders/src/tp/p2/game/GameObjectGenerator.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
package tp.p2.game;
 | 
			
		||||
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
import tp.p2.Level;
 | 
			
		||||
import tp.p2.controller.Exceptions.FileContentsException;
 | 
			
		||||
import tp.p2.game.GameObjects.Bomb;
 | 
			
		||||
import tp.p2.game.GameObjects.DestroyerAlien;
 | 
			
		||||
import tp.p2.game.GameObjects.GameObject;
 | 
			
		||||
import tp.p2.game.GameObjects.Ovni;
 | 
			
		||||
import tp.p2.game.GameObjects.RegularAlien;
 | 
			
		||||
import tp.p2.game.GameObjects.Shockwave;
 | 
			
		||||
import tp.p2.game.GameObjects.SuperMissile;
 | 
			
		||||
import tp.p2.game.GameObjects.UCMMissile;
 | 
			
		||||
import tp.p2.game.GameObjects.UCMShip;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class GameObjectGenerator {
 | 
			
		||||
    private static Game otherGame = new Game(Level.EASY, new Random(System.currentTimeMillis()));
 | 
			
		||||
    private static GameObject[] availableGameObjects = { 
 | 
			
		||||
	    new UCMShip(otherGame, 0, 0), 
 | 
			
		||||
	    new Ovni(otherGame, 0, 0, 0), 
 | 
			
		||||
	    new RegularAlien(otherGame, 0, 0, 0), 
 | 
			
		||||
	    new DestroyerAlien(otherGame, 0, 0, 0), 
 | 
			
		||||
	    new Shockwave(otherGame, 0, 0, 0), 
 | 
			
		||||
	    new Bomb(otherGame, 0, 0, 0), 
 | 
			
		||||
	    new UCMMissile(otherGame, 0, 0, 0), 
 | 
			
		||||
	    new SuperMissile(otherGame, 0, 0, 0) 
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	public static GameObject parse(String stringFromFile, Game game, FileContentsVerifier verifier) throws FileContentsException { 
 | 
			
		||||
		GameObject gameObject = null; 
 | 
			
		||||
		for (GameObject go: availableGameObjects) { 
 | 
			
		||||
			gameObject = go.parse(stringFromFile, game, verifier); 
 | 
			
		||||
			if (gameObject != null) break; 
 | 
			
		||||
			} 
 | 
			
		||||
		return gameObject; 
 | 
			
		||||
	} 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
							
								
								
									
										130
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/AlienShip.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/AlienShip.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,130 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class AlienShip extends EnemyShip {
 | 
			
		||||
	//Atributos est<73>ticos:
 | 
			
		||||
	protected static boolean down = false; //Variable est<73>tica booleana para indicar si los Aliens tienen que bajar o no.
 | 
			
		||||
	protected static String direction = "left"; //Variable est<73>tica que indica la direcci<63>n en la que se mueve los aliens.
 | 
			
		||||
	protected static boolean isLanded = false;
 | 
			
		||||
	protected static boolean allDead = false;
 | 
			
		||||
	protected static int numAliens = 0; //Variable est<73>tica que indica el n<>mero de Aliens que hay en el tablero actualmente.
 | 
			
		||||
	protected static int contAliens = 0; //Variable est<73>tica que ind<6E>ca (si down == true), cu<63>ntos aliens han bajado.
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public AlienShip(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public static boolean haveLanded() {
 | 
			
		||||
		return isLanded;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static boolean allDead() {
 | 
			
		||||
		return allDead;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static int numAliens() {
 | 
			
		||||
		return numAliens;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static void setNumAliens(int aliens) {
 | 
			
		||||
		numAliens = aliens;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void move() {
 | 
			
		||||
		if(this.game.getRestCycles() == 0) {
 | 
			
		||||
			if(direction == "left") {
 | 
			
		||||
				this.columna--;
 | 
			
		||||
				if(this.columna == 0) {
 | 
			
		||||
					down = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else if(direction == "right") {
 | 
			
		||||
				this.columna++;
 | 
			
		||||
				if(this.columna == Game.MAXCOL-1) {
 | 
			
		||||
					down = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(down && this.game.getRestCycles() == this.level.getNumCyclesToMoveOneCell()) {	
 | 
			
		||||
			this.fila++;
 | 
			
		||||
			if(this.fila == Game.MAXFIL-1) { isLanded = true; }
 | 
			
		||||
			contAliens++;
 | 
			
		||||
			if(contAliens >= numAliens) {
 | 
			
		||||
				contAliens = 0;
 | 
			
		||||
				down = false;
 | 
			
		||||
				if(direction == "left") {
 | 
			
		||||
					direction = "right";
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					direction = "left";
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean receiveMissileAttack(int damage) {
 | 
			
		||||
		this.getDamage(damage);
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean receiveShockWaveAttack(int damage) {
 | 
			
		||||
		this.getDamage(damage);
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean recibeExplodeAttack(int damage) { //Para recibir da<64>o de una nave explosiva.
 | 
			
		||||
		this.getDamage(damage);
 | 
			
		||||
		return true;
 | 
			
		||||
	}	
 | 
			
		||||
	
 | 
			
		||||
	public abstract void computerAction();
 | 
			
		||||
	public abstract void onDelete();
 | 
			
		||||
	public abstract String toString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
public void move() {
 | 
			
		||||
		if(this.game.getCurrentCycle() % this.level.getNumCyclesToMoveOneCell() == 0) {
 | 
			
		||||
			if(direction == "left") {
 | 
			
		||||
				this.columna--;
 | 
			
		||||
				if(this.columna == 0) {
 | 
			
		||||
					down = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else if(direction == "right") {
 | 
			
		||||
				this.columna++;
 | 
			
		||||
				if(this.columna == Game.MAXCOL-1) {
 | 
			
		||||
					down = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(down == true && this.game.getCurrentCycle() % this.level.getNumCyclesToMoveOneCell() != 0) {	
 | 
			
		||||
			this.fila++;
 | 
			
		||||
			if(this.fila == Game.MAXFIL-1) { isLanded = true; }
 | 
			
		||||
			contAliens++;
 | 
			
		||||
			if(contAliens == numAliens) {
 | 
			
		||||
				contAliens = 0;
 | 
			
		||||
				down = false;
 | 
			
		||||
				if(direction == "left") {
 | 
			
		||||
					direction = "right";
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					direction = "left";
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,61 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.Level;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.GameObjects.Lists.GameObjectBoard;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class BoardInitializer {
 | 
			
		||||
	
 | 
			
		||||
	private Level level;
 | 
			
		||||
	private GameObjectBoard board;
 | 
			
		||||
	private Game game;
 | 
			
		||||
	
 | 
			
		||||
	public GameObjectBoard initialize(Game game, Level level) {
 | 
			
		||||
		this.level = level;
 | 
			
		||||
		this.game = game;
 | 
			
		||||
		board = new GameObjectBoard(Game.MAXFIL, Game.MAXCOL);
 | 
			
		||||
		
 | 
			
		||||
		initializeOvni();
 | 
			
		||||
		initializeRegularAliens();
 | 
			
		||||
		initializeDestroyerAliens();
 | 
			
		||||
		return board;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private void initializeOvni () {
 | 
			
		||||
		GameObject ovni = new Ovni(game, 0, Game.MAXCOL, 1);
 | 
			
		||||
		board.add(ovni);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void initializeRegularAliens () {
 | 
			
		||||
		int fila=2, col=3;
 | 
			
		||||
		for (int i = 0; i < this.level.getNumRowsOfRegularAliens(); i++) {
 | 
			
		||||
			for (int j = 0; j < this.level.getNumRegularAliensPerRow(); j++) {
 | 
			
		||||
				GameObject regular = new RegularAlien(this.game, fila, col, 2);
 | 
			
		||||
				board.add(regular);
 | 
			
		||||
				col++;
 | 
			
		||||
			}
 | 
			
		||||
			fila++;
 | 
			
		||||
			col = 3;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private void initializeDestroyerAliens() {
 | 
			
		||||
		int fila, col;
 | 
			
		||||
		switch (level) {
 | 
			
		||||
			case EASY: fila = 3; col = 4; break;
 | 
			
		||||
			case HARD: fila = 4; col = 3; break;
 | 
			
		||||
			default: fila = 5; col = 3; break;
 | 
			
		||||
		}
 | 
			
		||||
		for (int i = 0; i < this.level.getNumDestroyerAliensPerRow(); i++) {
 | 
			
		||||
			GameObject destroyer = new DestroyerAlien(this.game, fila, col, 1);
 | 
			
		||||
			board.add(destroyer);
 | 
			
		||||
			col++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										74
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Bomb.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Bomb.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Bomb extends Weapon{
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private String letra;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public Bomb(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
		this.letra = "oo";
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public Bomb() {
 | 
			
		||||
		super(null, 0, 0, 0);
 | 
			
		||||
		this.letra = "oo";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void weaponAttack(GameObject other) {
 | 
			
		||||
		other.receiveBombAttack(Game.DAMAGE);
 | 
			
		||||
		//this.live--;
 | 
			
		||||
		this.getDamage(Game.DAMAGE);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean recibeMissileAttack(int damage) {
 | 
			
		||||
		//this.live--;
 | 
			
		||||
		this.getDamage(damage);
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void computerAction() {}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onDelete() {
 | 
			
		||||
		if(this.getLive() <= 0 || this.getFila() > Game.MAXFIL-1) { //
 | 
			
		||||
			this.isAlive = false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void move() {
 | 
			
		||||
		this.fila++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return this.letra;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String serializer() {
 | 
			
		||||
		return "B;"
 | 
			
		||||
				+ this.fila + ","
 | 
			
		||||
				+ this.columna + ","
 | 
			
		||||
				+ this.live;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public GameObject parse(String stringFromFile, Game game2, FileContentsVerifier verifier) {
 | 
			
		||||
		String[] words = stringFromFile.split(FileContentsVerifier.separator1);
 | 
			
		||||
		String[] coords = words[1].split(FileContentsVerifier.separator2);
 | 
			
		||||
		return verifier.verifyWeaponString(stringFromFile, game2) ? 
 | 
			
		||||
				new Bomb(game2, Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(words[2])):null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										86
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/DestroyerAlien.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/DestroyerAlien.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.GameObjects.Interfaces.IExecuteRandomActions;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class DestroyerAlien extends AlienShip implements IExecuteRandomActions{
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private Bomb bomb;
 | 
			
		||||
	private String letra;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public DestroyerAlien(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
		this.bomb = null;
 | 
			
		||||
		this.letra = "D";
 | 
			
		||||
		numAliens++;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public DestroyerAlien() {
 | 
			
		||||
		super(null, 0, 0, 1);
 | 
			
		||||
		this.bomb = null;
 | 
			
		||||
		this.letra = "D";
 | 
			
		||||
		numAliens++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public void deleteBomb() {
 | 
			
		||||
		this.bomb = null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean getBomb() {
 | 
			
		||||
		return this.bomb != null ? true : false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void computerAction() {
 | 
			
		||||
		if(this.bomb == null && IExecuteRandomActions.canGenerateRandomBomb(game)) {
 | 
			
		||||
			this.bomb = new Bomb(game, this.fila, this.columna, 1);
 | 
			
		||||
			this.game.addObject(this.bomb);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onDelete() {
 | 
			
		||||
		if(this.bomb != null && !this.bomb.isAlive) {
 | 
			
		||||
			this.deleteBomb();
 | 
			
		||||
		}
 | 
			
		||||
		if(this.live <= 0) {
 | 
			
		||||
			this.isAlive = false;
 | 
			
		||||
			numAliens--;
 | 
			
		||||
			this.game.receivePoints(10);
 | 
			
		||||
			if(numAliens == 0) { allDead = true; }
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return this.letra + "[" + this.live + "]";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String serializer() {
 | 
			
		||||
		return "D;"
 | 
			
		||||
				+ this.fila + ","
 | 
			
		||||
				+ this.columna + ";"
 | 
			
		||||
				+ this.live + ";"
 | 
			
		||||
				//+ this.getBomb() + ";"
 | 
			
		||||
				+ this.game.getRestCycles() + ";"
 | 
			
		||||
				+ this.direction;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public GameObject parse(String stringFromFile, Game game2, FileContentsVerifier verifier) {
 | 
			
		||||
		String[] words = stringFromFile.split(FileContentsVerifier.separator1);
 | 
			
		||||
		String[] coords = words[1].split(FileContentsVerifier.separator2);
 | 
			
		||||
		return verifier.verifyDestroyerShipString(stringFromFile, game2, 2) ? 
 | 
			
		||||
				new DestroyerAlien(game2, Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(words[2])):null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/EnemyShip.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/EnemyShip.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class EnemyShip extends Ship {
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public EnemyShip(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
		// TODO Auto-generated constructor stub
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public abstract void computerAction();
 | 
			
		||||
	public abstract void onDelete();
 | 
			
		||||
	public abstract void move();
 | 
			
		||||
	public abstract String toString();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										73
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/GameObject.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/GameObject.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.Level;
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.GameObjects.Interfaces.IAttack;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class GameObject implements IAttack {
 | 
			
		||||
	//Atributos est<73>ticos:
 | 
			
		||||
	protected int fila, columna;
 | 
			
		||||
	protected int live;
 | 
			
		||||
	protected boolean isAlive;
 | 
			
		||||
	protected Game game;
 | 
			
		||||
	protected Level level;
 | 
			
		||||
	
 | 
			
		||||
	//Constrcutor:
 | 
			
		||||
	public GameObject(Game game, int fila, int col, /*Coordenadas iniciales*/ int live) {
 | 
			
		||||
		this.fila = fila;
 | 
			
		||||
		this.columna = col;
 | 
			
		||||
		this.game = game;
 | 
			
		||||
		this.level = this.game.getLevel();
 | 
			
		||||
		this.live = live;
 | 
			
		||||
		this.isAlive = true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public int getFila() {
 | 
			
		||||
		return this.fila;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getColumna() {
 | 
			
		||||
		return this.columna;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean isAlive() {
 | 
			
		||||
		return this.isAlive;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getLive() {
 | 
			
		||||
		return this.live;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean isOnPosition(int x, int y) {
 | 
			
		||||
		return this.fila == x && this.columna == y;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void getDamage (int damage) {
 | 
			
		||||
		this.live = damage >= this.live ? 0 : this.live - damage;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean isOut() {
 | 
			
		||||
		return !game.isOnBoard(this.fila, this.columna);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void update() {
 | 
			
		||||
		this.move();
 | 
			
		||||
		if(this.isAlive != false) { this.onDelete(); }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public abstract void computerAction();
 | 
			
		||||
	public abstract void onDelete();
 | 
			
		||||
	public abstract void move();
 | 
			
		||||
	public abstract String toString();
 | 
			
		||||
	public abstract String serializer();
 | 
			
		||||
	public abstract GameObject parse(String stringFromFile, Game game2, FileContentsVerifier verifier);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package tp.p2.game.GameObjects.Interfaces;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.GameObjects.GameObject;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public interface IAttack {
 | 
			
		||||
	default boolean performAttack(GameObject other) {return false;};
 | 
			
		||||
 | 
			
		||||
	default boolean receiveMissileAttack(int damage) {return false;};
 | 
			
		||||
	default boolean receiveBombAttack(int damage) {return false;};
 | 
			
		||||
	default boolean receiveShockWaveAttack(int damage) {return false;};
 | 
			
		||||
	default boolean recibeExplodeAttack(int damage) {return false;};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
package tp.p2.game.GameObjects.Interfaces;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public interface IExecuteRandomActions {
 | 
			
		||||
	
 | 
			
		||||
	static boolean canGenerateRandomOvni(Game game){
 | 
			
		||||
		return game.getRandom().nextDouble() < game.getLevel().getOvniFrequency();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	static boolean canGenerateRandomBomb(Game game){
 | 
			
		||||
		return game.getRandom().nextDouble() < game.getLevel().getShootFrequency();	
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package tp.p2.game.GameObjects.Interfaces;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public interface IPlayerController {
 | 
			
		||||
		// PLAYER ACTIONS	
 | 
			
		||||
		public boolean move (String dir, int numCells) throws CommandExecuteException;
 | 
			
		||||
		public boolean shootLaser();
 | 
			
		||||
		public boolean shockWave();
 | 
			
		||||
		public boolean shootSuperLaser();
 | 
			
		||||
		
 | 
			
		||||
		// CALLBACKS
 | 
			
		||||
		public void receivePoints(int points);
 | 
			
		||||
		public void enableShockWave();
 | 
			
		||||
		public void enableMissile();
 | 
			
		||||
		public void enableSuperMissile();
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,129 @@
 | 
			
		||||
package tp.p2.game.GameObjects.Lists;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
//import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.GameObjects.GameObject;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class GameObjectBoard {
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private GameObject[] objects;
 | 
			
		||||
	private int currentObjects;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public GameObjectBoard (int width, int height) {
 | 
			
		||||
		this.objects = new GameObject[width * height];
 | 
			
		||||
		this.currentObjects = 0;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	private int getCurrentObjects() {
 | 
			
		||||
		return this.currentObjects;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void setCurrentObjects(int currentObjects) {
 | 
			
		||||
		this.currentObjects = currentObjects;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void add (GameObject object) {
 | 
			
		||||
		this.objects[this.currentObjects] = object;
 | 
			
		||||
		this.currentObjects++;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	private GameObject getObjectInPosition(int fila, int columna) {
 | 
			
		||||
		int pos = getIndex(fila, columna);
 | 
			
		||||
		return this.objects[pos];
 | 
			
		||||
	}
 | 
			
		||||
	*/
 | 
			
		||||
	
 | 
			
		||||
	private int getIndex(int fila, int columna) {
 | 
			
		||||
		boolean encontrado = false;
 | 
			
		||||
		int i = this.getCurrentObjects()-1;
 | 
			
		||||
		
 | 
			
		||||
		while(!encontrado && i >= 0) {
 | 
			
		||||
			if(this.objects[i].getFila() == fila && this.objects[i].getColumna() == columna) {
 | 
			
		||||
				encontrado = true;
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				i--;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return i;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void remove(GameObject object) {
 | 
			
		||||
		int pos = getIndex(object.getFila(), object.getColumna());
 | 
			
		||||
		
 | 
			
		||||
		this.objects[pos] = null;
 | 
			
		||||
		for (int i = pos; i < this.getCurrentObjects(); i++) {
 | 
			
		||||
			this.objects[i] = this.objects[i+1];
 | 
			
		||||
		}
 | 
			
		||||
		this.currentObjects--;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void update() {
 | 
			
		||||
		for (int i = 0; i < this.getCurrentObjects(); i++) {
 | 
			
		||||
			this.objects[i].update();
 | 
			
		||||
			this.checkAttacks(this.objects[i]);
 | 
			
		||||
		}
 | 
			
		||||
		this.removeDead();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private void checkAttacks(GameObject object) {
 | 
			
		||||
		for (int i = 0; i < this.getCurrentObjects(); i++) {
 | 
			
		||||
			if (object != this.objects[i]) {
 | 
			
		||||
				if(object.performAttack(this.objects[i])) {
 | 
			
		||||
					object.onDelete();
 | 
			
		||||
					this.objects[i].onDelete();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void computerAction() {
 | 
			
		||||
		for (int i = 0; i < this.getCurrentObjects(); i++) {
 | 
			
		||||
			this.objects[i].computerAction();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private void removeDead() {
 | 
			
		||||
		for (int i = 0; i < this.getCurrentObjects(); i++) {
 | 
			
		||||
			if(!this.objects[i].isAlive()) {
 | 
			
		||||
				remove(this.objects[i]);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void swAttack() {
 | 
			
		||||
		for (int i = 0; i < this.getCurrentObjects(); i++) {
 | 
			
		||||
			this.objects[i].receiveShockWaveAttack(Game.DAMAGE);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String toString(int fila, int columna) {
 | 
			
		||||
		String print = "";
 | 
			
		||||
		
 | 
			
		||||
		for (int i = 0; i < this.getCurrentObjects(); i++) {
 | 
			
		||||
			if(this.objects[i].getFila() == fila && this.objects[i].getColumna() == columna) {
 | 
			
		||||
				print += this.objects[i].toString();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return print;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String serialize() {
 | 
			
		||||
		String serialize = "";
 | 
			
		||||
		
 | 
			
		||||
		for (int i = 0; i < this.getCurrentObjects(); i++) {
 | 
			
		||||
			serialize += this.objects[i].serializer() + "\n";
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return serialize;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										88
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Ovni.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Ovni.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
import tp.p2.game.GameObjects.Interfaces.IExecuteRandomActions;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Ovni extends EnemyShip{
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private String letra;
 | 
			
		||||
	private boolean enabble;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public Ovni(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
		this.letra = "O";
 | 
			
		||||
		this.enabble = false;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public Ovni() {
 | 
			
		||||
		super(null, 0, 0, 1);
 | 
			
		||||
		this.letra = "O";
 | 
			
		||||
		this.enabble = false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return this.letra + "[" + this.live + "]";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void computerAction() {
 | 
			
		||||
		if(IExecuteRandomActions.canGenerateRandomOvni(game)) {
 | 
			
		||||
			this.enabble = true;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean receiveMissileAttack(int damage) {
 | 
			
		||||
		this.live -= damage;
 | 
			
		||||
		this.game.enableShockWave();
 | 
			
		||||
		this.game.receivePoints(25);
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean receiveShockWaveAttack(int damage) {
 | 
			
		||||
		this.live -= damage;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onDelete() {
 | 
			
		||||
		if(this.columna < 0) {
 | 
			
		||||
			this.enabble = false;
 | 
			
		||||
			this.columna = Game.MAXCOL;
 | 
			
		||||
		}
 | 
			
		||||
		else if(this.live <= 0) {
 | 
			
		||||
			this.isAlive = false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void move() {
 | 
			
		||||
		if(this.enabble) { //QUITAR LA CONDICI<43>N DE LA COLUMNA, ES S<>LO PARA PRUEBAS. && this.columna >= Game.MAXCOL
 | 
			
		||||
			this.columna--;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String serializer() {
 | 
			
		||||
		return "O;"
 | 
			
		||||
				+ this.fila + ","
 | 
			
		||||
				+ this.columna + ";"
 | 
			
		||||
				+ this.live;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public GameObject parse(String stringFromFile, Game game2, FileContentsVerifier verifier) {
 | 
			
		||||
		String[] words = stringFromFile.split(FileContentsVerifier.separator1);
 | 
			
		||||
		String[] coords = words[1].split(FileContentsVerifier.separator2);
 | 
			
		||||
		return verifier.verifyOvniString(stringFromFile, game2, 1) ? 
 | 
			
		||||
				new Ovni(game2, Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(words[2])):null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										115
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/RegularAlien.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/RegularAlien.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,115 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class RegularAlien extends AlienShip {
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private String letra;
 | 
			
		||||
	private boolean explosive;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public RegularAlien(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
		this.letra = "C";
 | 
			
		||||
		this.explosive = false;
 | 
			
		||||
		numAliens++;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public RegularAlien() {
 | 
			
		||||
		super(null, 0, 0, 2);
 | 
			
		||||
		this.letra = "C";
 | 
			
		||||
		this.explosive = false;
 | 
			
		||||
		numAliens++;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public RegularAlien(Game game, int fila, int col, int live, String letra) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
		this.letra = letra;
 | 
			
		||||
		this.explosive = false;
 | 
			
		||||
		numAliens++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getLive() {
 | 
			
		||||
		return this.live;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean isDead() {
 | 
			
		||||
		return this.getLive() > 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void computerAction() {
 | 
			
		||||
		if((!this.explosive) && (this.game.getRandom().nextDouble() < this.level.getTurnExplodeFrequency())) {
 | 
			
		||||
			this.explosive = true;
 | 
			
		||||
			this.letra = "E";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onDelete() {
 | 
			
		||||
		if(this.live == 0) {
 | 
			
		||||
			if(!this.explosive) { this.isAlive = false; }
 | 
			
		||||
				numAliens--;
 | 
			
		||||
				if(numAliens == 0) { allDead = true; }
 | 
			
		||||
			
 | 
			
		||||
			this.game.receivePoints(5);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return this.letra + "[" + this.live + "]";
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public String serializer() {
 | 
			
		||||
		String letra = "R";
 | 
			
		||||
		if(explosive) {letra = this.letra;}
 | 
			
		||||
		return letra + ";"
 | 
			
		||||
				+ this.fila + ","
 | 
			
		||||
				+ this.columna + ";"
 | 
			
		||||
				+ this.live + ";"
 | 
			
		||||
				+ this.game.getRestCycles() + ";"
 | 
			
		||||
				+ this.direction;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos si la nave es explosiva:
 | 
			
		||||
	public void explodeAttack(GameObject other) {
 | 
			
		||||
		other.recibeExplodeAttack(Game.DAMAGE);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean performAttack(GameObject other) {
 | 
			
		||||
		boolean attack = false;
 | 
			
		||||
		
 | 
			
		||||
		if(this.explosive && this.live == 0) {
 | 
			
		||||
			if(other.isAlive()) {
 | 
			
		||||
				if(other.isOnPosition(fila-1, columna) || other.isOnPosition(fila+1, columna) || other.isOnPosition(fila, columna-1) || other.isOnPosition(fila, columna+1)) { 
 | 
			
		||||
					this.explodeAttack(other); //restar vida
 | 
			
		||||
					attack = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			this.isAlive = false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return attack;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public GameObject parse(String stringFromFile, Game game2, FileContentsVerifier verifier) {
 | 
			
		||||
		String[] words = stringFromFile.split(FileContentsVerifier.separator1);
 | 
			
		||||
		String[] coords = words[1].split(FileContentsVerifier.separator2);
 | 
			
		||||
		if(words[0].equals("R")) {
 | 
			
		||||
			return verifier.verifyRegularShipString(stringFromFile, game2, 2) ? 
 | 
			
		||||
						new RegularAlien(game2, Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(words[2])):null;
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			return verifier.verifyExplosiveShipString(stringFromFile, game2, 2) ? 
 | 
			
		||||
					new RegularAlien(game2, Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(words[2]), words[0]):null;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Ship.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Ship.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class Ship extends GameObject {
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public Ship(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	public abstract void computerAction();
 | 
			
		||||
	public abstract void onDelete();
 | 
			
		||||
	public abstract void move();
 | 
			
		||||
	public abstract String toString();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Shockwave.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Shockwave.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class Shockwave extends Weapon {
 | 
			
		||||
	
 | 
			
		||||
	public Shockwave(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public Shockwave() {
 | 
			
		||||
		super(null, 0, 0, 1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	protected void weaponAttack(GameObject other) {
 | 
			
		||||
		other.receiveShockWaveAttack(Game.DAMAGE);
 | 
			
		||||
		this.getDamage(Game.DAMAGE);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void computerAction() {}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onDelete() { 
 | 
			
		||||
		if(this.live == 0) { 
 | 
			
		||||
			this.isAlive = false; 
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void move() {}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return "";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String serializer() {
 | 
			
		||||
		return "";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public GameObject parse(String stringFromFile, Game game2, FileContentsVerifier verifier) {
 | 
			
		||||
		return verifier.verifyWeaponString(stringFromFile, game2) ? new Shockwave(game2, 0, 0, 1):null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/SuperMissile.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/SuperMissile.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class SuperMissile extends Weapon {
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private String letra;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public SuperMissile(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
		this.letra = "||";
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public SuperMissile() {
 | 
			
		||||
		super(null, 0, 0, 1);
 | 
			
		||||
		this.letra = "||";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//M<>todos:
 | 
			
		||||
	@Override
 | 
			
		||||
	protected void weaponAttack(GameObject other) {
 | 
			
		||||
		other.receiveMissileAttack(Game.DAMAGE*2);
 | 
			
		||||
		this.getDamage(Game.DAMAGE);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void computerAction() {}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onDelete() {
 | 
			
		||||
		if(this.live <= 0 || this.fila < 0) {
 | 
			
		||||
			this.isAlive = false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void move() {
 | 
			
		||||
		this.fila--;
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return this.letra;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String serializer() {
 | 
			
		||||
		return "M;"
 | 
			
		||||
				+ this.fila + ","
 | 
			
		||||
				+ this.columna;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public GameObject parse(String stringFromFile, Game game2, FileContentsVerifier verifier) {
 | 
			
		||||
		String[] words = stringFromFile.split(FileContentsVerifier.separator1);
 | 
			
		||||
		String[] coords = words[1].split(FileContentsVerifier.separator2);
 | 
			
		||||
		return verifier.verifyWeaponString(stringFromFile, game2) ? 
 | 
			
		||||
				new SuperMissile(game2, Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(words[2])):null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										67
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/UCMMissile.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/UCMMissile.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class UCMMissile extends Weapon{
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private String letra;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public UCMMissile(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
		this.letra = "|";
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public UCMMissile() {
 | 
			
		||||
		super(null, 0, 0, 1);
 | 
			
		||||
		this.letra = "|";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	protected void weaponAttack(GameObject other) {
 | 
			
		||||
		other.receiveMissileAttack(Game.DAMAGE);
 | 
			
		||||
		//this.live--;
 | 
			
		||||
		this.getDamage(Game.DAMAGE);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void computerAction() {}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onDelete() {
 | 
			
		||||
		if(this.live <= 0 || this.fila < 0) {
 | 
			
		||||
			this.isAlive = false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void move() {
 | 
			
		||||
		this.fila--;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return this.letra;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String serializer() {
 | 
			
		||||
		return "M;"
 | 
			
		||||
				+ this.fila + ","
 | 
			
		||||
				+ this.columna;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public GameObject parse(String stringFromFile, Game game2, FileContentsVerifier verifier) {
 | 
			
		||||
		String[] words = stringFromFile.split(FileContentsVerifier.separator1);
 | 
			
		||||
		String[] coords = words[1].split(FileContentsVerifier.separator2);
 | 
			
		||||
		return verifier.verifyWeaponString(stringFromFile, game2) ? 
 | 
			
		||||
				new UCMMissile(game2, Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(words[2])):null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										186
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/UCMShip.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/UCMShip.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,186 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
import tp.p2.game.FileContentsVerifier;
 | 
			
		||||
//import tp.p2.controller.ShockwaveCommand;
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
//import tp.p2.util.MyStringUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class UCMShip extends Ship {
 | 
			
		||||
	//Atributos:
 | 
			
		||||
	private Weapon misil;
 | 
			
		||||
	private Shockwave shockwave;
 | 
			
		||||
	private String letra;
 | 
			
		||||
	private int points;
 | 
			
		||||
	private int numSuperMissiles;
 | 
			
		||||
	
 | 
			
		||||
	//Constructor:
 | 
			
		||||
	public UCMShip(Game game, int fila, int col) {
 | 
			
		||||
		super(game, fila, col, 3);
 | 
			
		||||
		this.misil = null;
 | 
			
		||||
		this.shockwave = null;
 | 
			
		||||
		this.letra = "^__^";
 | 
			
		||||
		this.points = 0;
 | 
			
		||||
		this.numSuperMissiles = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public UCMShip() {
 | 
			
		||||
		super(null, Game.MAXFIL-1, 4, 3);
 | 
			
		||||
		this.misil = null;
 | 
			
		||||
		this.shockwave = null;
 | 
			
		||||
		this.letra = "^__^";
 | 
			
		||||
		this.points = 0;
 | 
			
		||||
		this.numSuperMissiles = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void activeMisile(UCMMissile misil) {
 | 
			
		||||
		this.misil = misil;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void activeSW(Shockwave sw) {
 | 
			
		||||
		this.shockwave = sw;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void activeSuperMisile(SuperMissile supermisil) {
 | 
			
		||||
		if(this.numSuperMissiles > 0) { this.misil = supermisil; }
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void deleteMisil() {
 | 
			
		||||
		if(this.getSuperMisile()) { this.numSuperMissiles--; }
 | 
			
		||||
		this.misil = null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void deleteSW() {
 | 
			
		||||
		this.shockwave = null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean receiveBombAttack(int damage) {
 | 
			
		||||
		this.live -= damage;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void computerAction() {}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onDelete() {
 | 
			
		||||
		if((this.misil != null) && (!this.misil.isAlive)) { //(this.misil.getLive() == 0 || this.misil.getFila() < 0)
 | 
			
		||||
			this.deleteMisil();
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if(this.live <= 0) {
 | 
			
		||||
			this.isAlive = false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	public boolean move(String dir, int nCasillas) throws CommandExecuteException{
 | 
			
		||||
		boolean move = false;
 | 
			
		||||
		
 | 
			
		||||
		switch(dir) {
 | 
			
		||||
			case "right":
 | 
			
		||||
				if(this.columna + nCasillas < Game.MAXCOL) {
 | 
			
		||||
					switch(nCasillas) {
 | 
			
		||||
						case 1: this.columna++; move = true; break;
 | 
			
		||||
						case 2: this.columna += 2; move = true; break;
 | 
			
		||||
						default: break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			break;
 | 
			
		||||
			case "left":
 | 
			
		||||
				if(this.columna - nCasillas >= 0) {
 | 
			
		||||
					switch(nCasillas) {
 | 
			
		||||
						case 1: this.columna--; move = true; break;
 | 
			
		||||
						case 2: this.columna -= 2; move = true; break;
 | 
			
		||||
						default: this.columna += 0; move = false; break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		if(!move) {
 | 
			
		||||
			throw new CommandExecuteException("You'd come out of the limits of the board.");
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return move;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void addPoints(int points) {
 | 
			
		||||
		this.points += points;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void subtractPoints(int points) {
 | 
			
		||||
		this.points -= points;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getPoints() {
 | 
			
		||||
		return this.points;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean getMisile() {
 | 
			
		||||
		boolean misilEnable = false;
 | 
			
		||||
		
 | 
			
		||||
		if(this.misil == null) {
 | 
			
		||||
			misilEnable = true;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return misilEnable;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean getShockWave() {
 | 
			
		||||
		boolean sw = false;
 | 
			
		||||
		
 | 
			
		||||
		if(this.shockwave != null) {
 | 
			
		||||
			sw = true;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return sw;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean getSuperMisile() {
 | 
			
		||||
		boolean smEnable = false;
 | 
			
		||||
		
 | 
			
		||||
		if(this.numSuperMissiles > 0) {
 | 
			
		||||
			smEnable = true;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return smEnable;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void getSuperMissile() {
 | 
			
		||||
		this.numSuperMissiles++;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getNumSuperMissiles() {
 | 
			
		||||
		return this.numSuperMissiles;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void move() {}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return this.letra /*+ "[" + this.live + "]"*/;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String serializer() {
 | 
			
		||||
		return "P;" 
 | 
			
		||||
				+ this.fila + "," 
 | 
			
		||||
				+ this.columna + ";" 
 | 
			
		||||
				+ this.live + ";" 
 | 
			
		||||
				+ this.points +  ";"
 | 
			
		||||
				+ this.getShockWave() + ";"
 | 
			
		||||
				+ this.numSuperMissiles;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public GameObject parse(String stringFromFile, Game game2, FileContentsVerifier verifier) {
 | 
			
		||||
		String[] words = stringFromFile.split(FileContentsVerifier.separator1);
 | 
			
		||||
		String[] coords = words[1].split(FileContentsVerifier.separator2);
 | 
			
		||||
		return verifier.verifyPlayerString(stringFromFile, game2, 3) ? 
 | 
			
		||||
				new UCMShip(game2, Integer.parseInt(coords[0]), Integer.parseInt(coords[1])):null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										36
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Weapon.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								SpaceInvaders/src/tp/p2/game/GameObjects/Weapon.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
package tp.p2.game.GameObjects;
 | 
			
		||||
 | 
			
		||||
import tp.p2.game.Game;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public abstract class Weapon extends GameObject {
 | 
			
		||||
 | 
			
		||||
	public Weapon(Game game, int fila, int col, int live) {
 | 
			
		||||
		super(game, fila, col, live);
 | 
			
		||||
		// TODO Auto-generated constructor stub
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean performAttack(GameObject other) {
 | 
			
		||||
		boolean attack = false;
 | 
			
		||||
		
 | 
			
		||||
		if(isAlive() && other.isAlive()) {
 | 
			
		||||
			if(other.isOnPosition(this.fila, this.columna)) { //x, y de weapon
 | 
			
		||||
				this.weaponAttack(other); //restar vida
 | 
			
		||||
				attack = true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return attack;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	protected abstract void weaponAttack(GameObject other);
 | 
			
		||||
	public abstract void computerAction();
 | 
			
		||||
	public abstract void onDelete();
 | 
			
		||||
	public abstract void move();
 | 
			
		||||
	public abstract String toString();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								SpaceInvaders/src/tp/p2/game/GamePrinter.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								SpaceInvaders/src/tp/p2/game/GamePrinter.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
package tp.p2.game;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public interface GamePrinter {
 | 
			
		||||
	String toString(Game game);
 | 
			
		||||
	public GamePrinter parse(String name);
 | 
			
		||||
	public String helpText();
 | 
			
		||||
	void setGame(Game game); //A<>adido en la versi<73>n 3.
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								SpaceInvaders/src/tp/p2/game/PrinterGenerator.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								SpaceInvaders/src/tp/p2/game/PrinterGenerator.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
package tp.p2.game;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class PrinterGenerator {
 | 
			
		||||
	private static GamePrinter[] availablePrinters = {
 | 
			
		||||
		new BoardPrinter(Game.MAXFIL, Game.MAXCOL),
 | 
			
		||||
		new Stringifier(),
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	public static GamePrinter parse(String name) {		
 | 
			
		||||
		GamePrinter printer = null;
 | 
			
		||||
		for (GamePrinter p: availablePrinters) {
 | 
			
		||||
			printer = p.parse(name);
 | 
			
		||||
			if (printer != null) break;
 | 
			
		||||
		}
 | 
			
		||||
		return printer;
 | 
			
		||||
	}
 | 
			
		||||
		
 | 
			
		||||
	public static String printerHelp() {
 | 
			
		||||
		StringBuilder printers = new StringBuilder();	
 | 
			
		||||
		for (GamePrinter p: availablePrinters)
 | 
			
		||||
			printers.append(p.helpText());
 | 
			
		||||
		return printers.toString();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										45
									
								
								SpaceInvaders/src/tp/p2/game/PrinterTypes.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								SpaceInvaders/src/tp/p2/game/PrinterTypes.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
package tp.p2.game;
 | 
			
		||||
 | 
			
		||||
import tp.p2.controller.Exceptions.CommandExecuteException;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public enum PrinterTypes {
 | 
			
		||||
	
 | 
			
		||||
	BOARDPRINTER("boardprinter",
 | 
			
		||||
			"prints the game formatted as a board of dimension: ",
 | 
			
		||||
			new BoardPrinter(Game.MAXFIL, Game.MAXCOL)),
 | 
			
		||||
	STRINGIFIER("stringifier",
 | 
			
		||||
			"prints the game as plain text",
 | 
			
		||||
			new Stringifier());
 | 
			
		||||
	
 | 
			
		||||
	private String printerName;
 | 
			
		||||
	private String helpText;
 | 
			
		||||
	private GamePrinter printerObject;
 | 
			
		||||
	
 | 
			
		||||
	private PrinterTypes(String name, String text, GamePrinter printer) {
 | 
			
		||||
		printerName = name;
 | 
			
		||||
		helpText = text;
 | 
			
		||||
		printerObject = printer;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static String printerHelp(Game game) throws CommandExecuteException {
 | 
			
		||||
		String helpString = "";
 | 
			
		||||
		for (PrinterTypes printer : PrinterTypes.values())
 | 
			
		||||
			helpString += String.format("%s : %s%s%n", printer.printerName, printer.helpText,
 | 
			
		||||
				(printer == BOARDPRINTER ? Game.MAXFIL + " x " + Game.MAXCOL : "") );
 | 
			
		||||
		
 | 
			
		||||
		if(helpString == "") {throw new CommandExecuteException("No hay tableros disponibles.");}
 | 
			
		||||
		return helpString;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// Assumes a max of one object of each printer type is needed (otherwise return copy)
 | 
			
		||||
	public GamePrinter getObject(Game game) {
 | 
			
		||||
		printerObject.setGame(game);
 | 
			
		||||
		return printerObject;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										34
									
								
								SpaceInvaders/src/tp/p2/game/Stringifier.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								SpaceInvaders/src/tp/p2/game/Stringifier.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
package tp.p2.game;
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class Stringifier implements GamePrinter{
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString(Game game) {
 | 
			
		||||
		return game.serialize();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public GamePrinter parse(String name) {
 | 
			
		||||
		GamePrinter tablero = null;
 | 
			
		||||
		
 | 
			
		||||
		if(name.equals("serializer") || name.equals("stringifier")) {
 | 
			
		||||
			tablero = this;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return tablero;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String helpText() {
 | 
			
		||||
		return "prints the game as plain text";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setGame(Game game) {
 | 
			
		||||
		// TODO Auto-generated method stub
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								SpaceInvaders/src/tp/p2/util/MyStringUtils.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								SpaceInvaders/src/tp/p2/util/MyStringUtils.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
package tp.p2.util;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Fernando M<>ndez Torrubiano
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class MyStringUtils {
 | 
			
		||||
	public static String repeat(String elmnt, int length) {
 | 
			
		||||
		String result = "";
 | 
			
		||||
		for (int i = 0; i < length; i++) {
 | 
			
		||||
			result += elmnt;
 | 
			
		||||
		}
 | 
			
		||||
	return result;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static String centre(String text, int len){
 | 
			
		||||
		String out = String.format(" %"+len+"s %s %"+len+"s", "",text,"");
 | 
			
		||||
		float mid = (out.length()/2);
 | 
			
		||||
		float start = mid - (len/2);
 | 
			
		||||
		float end = start + len;
 | 
			
		||||
		return out.substring((int)start, (int)end);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user