sa2209GitHub
5/22/2016 - 9:04 PM

Sea Battle Pattern Generator

Sea Battle Pattern Generator

/**     Sea Battle
 *      Pattern Generator
 *      v. 1.1
 */

import java.util.Random;

public class PatternGenerator {

    private static final int boardSize = 10;

    public static void main(String[] args) {
        int[] shipsArray;
        shipsArray = new int[boardSize * boardSize];
        createEmptyBoard(shipsArray);
        String pattern;

        for (int i = 0; i < 100; i++)
        {
            placeShip(4, shipsArray);

            placeShip(3, shipsArray);
            placeShip(3, shipsArray);

            placeShip(2, shipsArray);
            placeShip(2, shipsArray);
            placeShip(2, shipsArray);

            placeShip(1, shipsArray);
            placeShip(1, shipsArray);
            placeShip(1, shipsArray);
            placeShip(1, shipsArray);

            pattern = printPattern(shipsArray);

            displayPattern(shipsArray);

            System.out.printf("Pattern" + i + ": ");

            System.out.println(pattern);

            createEmptyBoard(shipsArray);
        }
    }

    private static void placeShip(int decks, int[] board) {
        Random random = new Random();

        int xPos;
        int yPos;

        boolean checkPlace;
        boolean isHorizontally = random.nextBoolean();

        if (isHorizontally)
        {
            do
            {
                xPos = random.nextInt(boardSize - (decks - 1));
                yPos = random.nextInt(boardSize);

                checkPlace = (checkPlaceHorizontally(xPos, yPos, board, decks));

            } while (!checkPlace);

            for (int i = xPos; i < (xPos + decks); i += 1)
                board[i + (yPos * boardSize)] = decks;

        } else
        {
            do
            {
                xPos = random.nextInt(boardSize);
                yPos = random.nextInt(boardSize - (decks - 1));

                checkPlace = checkPlaceVertically(xPos, yPos, board, decks);

            } while (!checkPlace);

            for (int i = (yPos * boardSize); i < ((yPos * boardSize) + (decks * boardSize)); i += boardSize)
                board[i + xPos] = decks;
        }
    }

    private static boolean checkPlaceHorizontally(int xPos, int yPos, int[] board, int decks) {
        int[] checkList = new int[(decks + 2) * 3];

        int counter = 0;
        int result = 0;

        for (int h = -boardSize; h < boardSize + 1; h += boardSize)
        {
            for (int i = xPos - 1; i < (xPos + decks + 1); i += 1)
            {
                result = ((i + h) + (yPos * boardSize));

                if (xPos == 0 && i == xPos - 1)
                    result = -666;      // FAKE RESULT (!)

                if (xPos == (decks + 2) && result % boardSize == 0)
                    result = -666;      // FAKE RESULT (!)

                if (result > -1 && result < (boardSize * boardSize))
                {
                    checkList[counter] = result;
                    counter++;
                }
            }
        }
        if (checkArea(board, checkList) > 0)
        {
            return false;

        } else
        {
            return true;
        }
    }

    private static boolean checkPlaceVertically(int xPos, int yPos, int[] board, int decks) {

        int[] checkList = new int[(decks + 2) * 3];

        int counter = 0;

        int result = 0;

        for (int h = -1; h < 2; h++)
        {
            for (int i = (yPos * boardSize) - boardSize;
                 i < ((yPos * boardSize) + (decks * boardSize) + boardSize); i += boardSize)
            {
                result = i + (xPos + h);

                if (xPos == 0 && h == - 1)
                {
                    result = -666;      // FAKE RESULT (!)
                }
                if (xPos == boardSize - 1 && h == 1)
                {
                    result = -666;      // FAKE RESULT (!)
                }
                if (result > -1 && result < (boardSize * boardSize))
                {
                    checkList[counter] = result;
                    counter ++;
                }
            }
        }
        if (checkArea(board, checkList) > 0)
        {
            return false;

        } else
        {
            return true;
        }
    }

    private static int checkArea(int[] board, int[] area) {

        int checkSum = 0;

        for (int i = 0; i < area.length; i++) {

            if (i == 0) {

                checkSum += board[area[i]];

            } else {

                if (area[i] > 0) {

                    checkSum += board[area[i]];
                }
            }
        }
        return checkSum;
    }

    private static void displayPattern(int[] board) {

        String defaultMark = "~";

        for (int i = 0; i < board.length; i++) {

            if (board[i] != 0) {

                defaultMark = String.valueOf(board[i]);

            } else {

                defaultMark = "~";
            }

            System.out.printf(defaultMark + ((i + 1) % boardSize == 0 ? "\n" : " "));
        }
    }

    private static String printPattern(int[] board) {

        String defaultMark = "0";

        String pattern = "";

        for (int i = 0; i < board.length; i++)
        {
            defaultMark = String.valueOf(board[i]);

            if (board[i] > 0)
                defaultMark = "1";

            pattern = pattern + defaultMark;
        }
        return pattern;
    }

    private static void createEmptyBoard(int[] board) {

        for (int  i = 0; i < (boardSize * boardSize); i++)
            board[i] = 0;
    }

}