jueves, 21 de agosto de 2014

Juego de hundir la flota (Parte 1)




Hoy vamos a repasar la primera aplicación (juego) que he creado gracias al libro. Se trata de el clásico juego de Hundir la Flota. Cuando el juego comienza pide que se le introduzcan los valores de las casillas correspondientes donde queremos "atacar", si en esa casilla se encuentra alguna porción de barco (creado anteriormente por el programa) nos devolverá un "hit". Si por el contrario fallamos nos devolverá un "miss". Cada elección irá sumando un "intento" y al final, cuando hayamos conseguido hundir los 3 barcos nos saldrá el número de intentos. En esta primera parte solo voy a mostrar el código necesario para crear el juego, en la segunda parte explicaremos un poco como funciona.

El juego se compone de 3 clases, una de ellas se conoce como "GameHelper" y es la que nos va a crear los 3 barcos al inicio del programa de forma aleatoria. También será la encargada de recoger la petición del usuario en la consola. La clase GameHelper no vamos a estudiarla por ahora puesto que contiene código que aún no tengo ni idea muy bien como funciona.

Las otras dos clases son DotCom y DotComBust. Serán las encargadas de llevar el conteo de los intentos, mostrar los mensajes por pantalla en función de cada situación e iniciar el programa.

Vamos a comenzar por crear las 3 clases. 

No se si lo he dicho antes, la aplicación que utilizo para programar en Java es IntelliJ IDEA 13 CE, me parece una aplicación muy buena, al menos para las cosas básicas que estoy haciendo aquí.


Clase: DotCom

import java.util.*;
public class DotCom {
    private ArrayList<String> locationCells;
    private String name;

    public void setLocationCells (ArrayList<String> loc) {
        locationCells = loc;
    }

    public void setName (String n) {
        name = n;
    }

    public String checkYourself (String userInput){
        String result = "fallo";
        int index = locationCells.indexOf(userInput);
        if (index>=0) {
            locationCells.remove(index);

            if (locationCells.isEmpty()) {
                result = "Hundido!";
                System.out.println ("Joder tío, te has cargado a "+ name + "   : ( ");
            } else {
                result = "Tocado!";
            }
        }
        return result;
    }
}


Clase: DotComBust

import java.util.*;
public class DotComBust {

    private GameHelper helper = new GameHelper();
    private ArrayList<DotCom> dotComsList = new ArrayList<DotCom>();
    private int numOfGuesses = 0;

    private void setUpGame() {
        DotCom one = new DotCom();
        one.setName("Pets.com");
        DotCom two = new DotCom();
        two.setName("eToys.com");
        DotCom three = new DotCom();
        three.setName("Go2.com");

        dotComsList.add(one);
        dotComsList.add(two);
        dotComsList.add(three);

        System.out.println("Tu objetivo es hundir los tres punto coms.");
        System.out.println("Pets.com, eToys.com, Go2.com");
        System.out.println("intenta hundirlos a todos en el menor número de intentos");

        for(DotCom dotComToSet:dotComsList){
            ArrayList<String> newLocation = helper.placeDotCom(3);
            dotComToSet.setLocationCells(newLocation);
        }
    }

    private void startPlaying() {
        while (!dotComsList.isEmpty()) {
            String userGuess = helper.getUserInput("Atacar a la casilla: ");
            checkUserGuess(userGuess);
        }
        finishGame();
    }

    private void checkUserGuess(String userGuess) {
        numOfGuesses++;
        String result = "Fallo";

        for (DotCom dotComToTest : dotComsList) {
            result = dotComToTest.checkYourself(userGuess);
            if (result.equals("Tocado!")) {
                break;
            }
            if (result.equals("Hundido!!!")) {
                dotComsList.remove(dotComToTest);
                break;
            }
        }

        System.out.println(result);

    }

    private void finishGame() {

        System.out.println("Tío, te has cargado todos los punto coms!");
        if (numOfGuesses <= 18) {
            System.out.println("Necesitastes " + numOfGuesses + " intentos");
            System.out.println("Eres un jodío crack tío!.");
        } else {
            System.out.println("Necesitastes. " + numOfGuesses + " intentos.");
            System.out.println("Los pobres peces te quieren dar las gracias por animarles el mar.");
        }


    }

    public static void main (String [] args) {
        DotComBust game = new DotComBust();
        game.setUpGame();
        game.startPlaying();
    }


}



Clase: GameHelper

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.*;
import java.util.ArrayList;

public class GameHelper {

    private static final String alphabet = "abcdefg";
    private int gridLength = 7;
    private int gridSize = 49;
    private int [] grid = new int[gridSize];
    private int comCount = 0;

    public String getUserInput(String prompt) {
        String inputLine = null;
        System.out.print (prompt +" ");
        try {
            BufferedReader is =new BufferedReader(new InputStreamReader(System.in));
            inputLine = is.readLine();
            if (inputLine.length() == 0) return null;
        } catch (IOException e) {
            System.out.println ("IOException: " + e);
        }
        return inputLine;
    }

    public ArrayList<String> placeDotCom (int comSize) {
        ArrayList<String> alphaCells = new ArrayList<String>();
        String [] alphacoords = new String [comSize];
        String temp = null;
        int [] coords = new int [comSize];
        int attempts = 0;
        boolean success = false;
        int location = 0;

        comCount++;
        int incr = 1;
        if ((comCount % 2) ==1){
            incr = gridLength;
        }

        while ( !success & attempts++ < 200) {
            location = (int) (Math.random() * gridSize);

            int x= 0;
                success=true;
            while (success && x < comSize) {
                if (grid[location] == 0) {
                    coords [x++] = location;
                    location += incr;
                    if (location >= gridSize) {
                        success= false;
                    }
                    if (x>0 && (location % gridLength == 0)) {
                        success = false;
                    }
                } else {
                    success = false;
                }
            }
        }

        int x = 0;
        int row = 0;
        int column = 0;

        while (x< comSize) {
            grid [coords [x]] = 1;
            row = (int) (coords [x] / gridLength);
            column = coords [x] % gridLength;
            temp = String.valueOf ( alphabet.charAt(column));

            alphaCells.add(temp.concat(Integer.toString(row)));
            x++;

        }
        return alphaCells;
    }

}




Cuando iniciamos el juego, nos pide que introduzcamos una casilla. Los inputs (valores que debemos introducir) son del estilo "a0, a1, a2, ..., a6" .... "f0, f1,..., f6"






No hay comentarios:

Publicar un comentario