Игровое поле Морской бой в Java - PullRequest
0 голосов
/ 29 мая 2020

Пишу код игры про корабли. Есть два игрока, человек и компьютер. У обоих есть отдельные доски. Вначале я автоматически размещаю корабли на обеих досках случайным образом, затем я беру координаты и кладу корабли друг на друга. Если место в координате попадает в корабль другого игрока, я отправляю сообщение об этом на экран . Символ «s» отображается на экране, если он топит корабль, только со знаком «*», если он попадает, и «x», если он не может попасть. Как я могу внести изменения в доску компьютерного игрока после получения координат, когда пришло время человеческого игрока?

public static int numRows = 10;
public static int numCols = 10;
public static int playerShips;
public static int computerShips;
public static String[][] grid = new String[numRows][numCols];
public static int[][] missedGuesses = new int[numRows][numCols];

public static void main(String[] args) {
    System.out.println("Welcome to Amiral Batti game");
    System.out.println("\nComputer: ");
    deployComputerShips();
    System.out.println("\n");
    System.out.println("\nHuman: ");
    deployPlayerShips();

    do {
        Battle();
    }
    while(players.playerShips != 0 && players.computerShips != 0);

    gameOver();
}
public static int FIELD_SIZE = 10;

public static void deployPlayerShips() {
    Random random = new Random();
    int[][] field = new int[FIELD_SIZE][FIELD_SIZE];
    for (int i = 5; i > 0; i--) {
        int x = random.nextInt(field.length);
        int y = random.nextInt(field.length);
        boolean vertical = random.nextBoolean();

        if (vertical) {
            if (y + i > FIELD_SIZE) {
                y -= i;
            }
        } else if (x + i > FIELD_SIZE) {
            x -= i;
        }
        boolean isFree = true;

        if (vertical) {
            for (int m = y; m < y + i; m++) {
                if (field[m][x] != 0) {
                    isFree = false;
                    break;
                }
            }
        } else {
            for (int n = x; n < x + i; n++) {
                if (field[y][n] != 0) {
                    isFree = false;
                    break;
                }
            }
        }
        if (!isFree) {
            i++;
            continue;
        }

        if (vertical) {
            for (int m = Math.max(0, x - 1); m < Math.min(FIELD_SIZE, x + 2); m++) {
                for (int n = Math.max(0, y - 1); n < Math.min(FIELD_SIZE, y + i + 1); n++) {
                    field[n][m] = 9;
                }
            }
        } else {
            for (int m = Math.max(0, y - 1); m < Math.min(FIELD_SIZE, y + 2); m++) {
                for (int n = Math.max(0, x - 1); n < Math.min(FIELD_SIZE, x + i + 1); n++) {
                    field[m][n] = 9;
                }
            }
        }

        for (int j = 0; j < i; j++) {
            field[y][x] = i;
            if (vertical) {
                y++;
            } else {
                x++;
            }
        }
    }

    System.out.print(" ");
    System.out.println("0 1 2 3 4 5 6 7 8 9");
    char[][] map = new char[FIELD_SIZE][FIELD_SIZE];
    for (int i = 0; i < FIELD_SIZE; i++) {
        for (int j = 0; j < FIELD_SIZE; j++) {
            map[i][j] = field[i][j] == 0 || field[i][j] == 9 ? '.' : 'o';
        }
    }

    Arrays.stream(map)
            .forEach(m -> System.out.println(Arrays.toString(m).replace(",", "")));
}
public static void deployComputerShips() {
    Random random = new Random();
    int[][] field = new int[FIELD_SIZE][FIELD_SIZE];
    for (int i = 5; i > 0; i--) {

        int x = random.nextInt(field.length);
        int y = random.nextInt(field.length);
        boolean vertical = random.nextBoolean();

        if (vertical) {
            if (y + i > FIELD_SIZE) {
                y -= i;
            }
        } else if (x + i > FIELD_SIZE) {
            x -= i;
        }

        boolean isFree = true;

        if (vertical) {
            for (int m = y; m < y + i; m++) {
                if (field[m][x] != 0) {
                    isFree = false;
                    break;
                }
            }
        } else {
            for (int n = x; n < x + i; n++) {
                if (field[y][n] != 0) {
                    isFree = false;
                    break;
                }
            }
        }
        if (!isFree) {
            i++;
            continue;
        }

        if (vertical) {
            for (int m = Math.max(0, x - 1); m < Math.min(FIELD_SIZE, x + 2); m++) {
                for (int n = Math.max(0, y - 1); n < Math.min(FIELD_SIZE, y + i + 1); n++) {
                    field[n][m] = 9;
                }
            }
        } else {
            for (int m = Math.max(0, y - 1); m < Math.min(FIELD_SIZE, y + 2); m++) {
                for (int n = Math.max(0, x - 1); n < Math.min(FIELD_SIZE, x + i + 1); n++) {
                    field[m][n] = 9;
                }
            }
        }

        for (int j = 0; j < i; j++) {
            field[y][x] = i;
            if (vertical) {
                y++;
            } else {
                x++;
            }
        }
    }

    System.out.print(" ");
    System.out.println("0 1 2 3 4 5 6 7 8 9");
    char[][] map = new char[FIELD_SIZE][FIELD_SIZE];
    for (int i = 0; i < FIELD_SIZE; i++) {
        for (int j = 0; j < FIELD_SIZE; j++) {
            map[i][j] = field[i][j] == 0 || field[i][j] == 9 ? '.' : 'o';
        }
    }

    Arrays.stream(map)
            .forEach(m -> System.out.println(Arrays.toString(m).replace(",", "")));
}

public static void Battle(){
    playerTurn();
    computerTurn();

    printBoard();

    System.out.println();
    System.out.println("Your ships: " + players.playerShips + " | Computer ships: " + players.computerShips);
    System.out.println();
}

public static void playerTurn(){
    Scanner scn = new Scanner(System.in);
    System.out.println("\nHuman's turn: ");
    int x = -1, y = -1;
    do {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter row number: ");
        x = scn.nextInt();
        System.out.print("Enter column number: ");
        y = scn.nextInt();

        if ((x >= 0 && x < numRows) && (y >= 0 && y < numCols)){
            if (grid[x][y].equals("o")){
                System.out.println("You sunk the ship!");
                grid[x][y] = "s";
                --players.computerShips;
            }
            else if (grid[x][y].equals(".")) {
                System.out.println("You missed");
                grid[x][y] = "x";
            }
        }
        else if ((x < 0 || x >= numRows) || (y < 0 || y >= numCols))
            System.out.println("You can't place ships outside the " + numRows + " by " + numCols + " grid");
    }
    while((x < 0 || x >= numRows) || (y < 0 || y >= numCols));
}
public static void computerTurn(){
    System.out.println("\nComputer's turn: ");

    int x = -1, y = -1;
    do {
        x = (int)(Math.random()*10);
        y = (int)(Math.random()*10);
        System.out.println("Enter row number: "+x);
        System.out.println("Enter column number: "+y);

        if ((x >= 0 && x < numRows) && (y >= 0 && y < numCols)){
            if (grid[x][y].equals("o")){
                System.out.println("The Computer sunk one of your ships!");
                grid[x][y] = "s";
                --players.playerShips;
                ++players.computerShips;
            }
            else if (grid[x][y].equals(".")) {
                System.out.println("Computer missed");
                grid[x][y] = "x";
                if(missedGuesses[x][y] != 1)
                    missedGuesses[x][y] = 1;
            }
        }
    }
    while((x < 0 || x >= numRows) || (y < 0 || y >= numCols));
}

public static void gameOver(){
    System.out.println("Your ships: " + players.playerShips + " | Computer ships: " + players.computerShips);
    if(players.playerShips > 0 && players.computerShips <= 0)
        System.out.println("You won the battle! ");
    else
        System.out.println("You lost the battle! ");
    System.out.println();
}

public static void printBoard(){

    System.out.print(" ");
    System.out.println("0123456789");

    for(int x = 0; x < grid.length; x++) {
        System.out.print(x);

        for (int y = 0; y < grid[x].length; y++){
            System.out.print(grid[x][y]);
        }
        System.out.println();
    }
    System.out.println();
}

1 Ответ

0 голосов
/ 30 мая 2020

Хорошо, вот более правильная версия. Я мог бы сделать больше, но ... тогда половина кода была бы переписана, и я не вижу смысла в этом (не помогает). Поэтому я настаиваю на том, что его далек от совершенства , но, по крайней мере, он решает вашу проблему. Я сделал следующие исправления:

  • В методе battle () исправлен лог игры c
  • Я удалил переменную 'grid'. Я не понимаю, почему он существует. И вместо этого вынесли переменную field -> по одному для каждого игрока.
  • Я объединил ваши два метода deployPlayerShips () deployComputerShips () в один: deployPlayersShips (...) . Но я до сих пор не понимаю большую часть его логи c. А с приведенным ниже кодом возникают проблемы при отображении и инициализации поля. Но эти ошибки определенно уже присутствуют в вашем исходном коде.
  • Я переписал printBoard (), чтобы использовать переменные поля. Но это все равно потребует исправления.
  • Я частично исправил методы playerTurn () и computerTurn (), поскольку они имели плохо построенные циклы. Повороты никогда не могли "повернуться". Самая большая (блокирующая) проблема была в этих методах Думаю (хотя другие ошибки остались).
  • Я добавил глобальную функцию Random () и создал экземпляр Scanner только один раз.

пакетная песочница;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

// ATTENTION: low-quality code based on original source posted in question. Not fully functional and has many issues. But it answers the original question.
public class Warships {

    private static final int numRows = 10;
    private static final int numCols = 10;
    private static final int NB_SHIPS = 5;

    private static int playerShips = NB_SHIPS;
    private static int computerShips = NB_SHIPS;
    private static final int[][] missedGuesses = new int[numRows][numCols];

    private static final Random random = new Random(System.currentTimeMillis());

    public static final int FIELD_SIZE = 10;
    private static final int[][] playerField = new int[FIELD_SIZE][FIELD_SIZE];
    private static final int[][] computerField = new int[FIELD_SIZE][FIELD_SIZE];

    public static void main(String[] args) {
        System.out.println("Welcome to Amiral Batti game");

        System.out.println("\nComputer: ");
        deployPlayersShips(computerField);
        System.out.println("\n");
        System.out.println("\nHuman: ");
        deployPlayersShips(playerField);

        Scanner scn = new Scanner(System.in);  

        do {
            battle(scn);
        } while (playerShips != 0 && computerShips != 0);

        gameOver();
    }

    public static void deployPlayersShips(int[][] field) {       
        for (int i = NB_SHIPS; i > 0; i--) {
            int x = random.nextInt(field.length);
            int y = random.nextInt(field.length);
            boolean vertical = random.nextBoolean();

            (...)
        }    
        printBoard2(field);
    }

    public static void battle(Scanner scn) {                                          
            playerTurn(scn);
            computerTurn();

            System.out.println("\nComputer: ");
            printBoard2(computerField);
            System.out.println("\nHuman: ");
            printBoard2(playerField);

            System.out.println();
            System.out.println("Your ships: " + playerShips + " | Computer ships: " + computerShips);
            System.out.println();
    }

    public static void playerTurn(Scanner scn) {        
        System.out.println("\nHuman's turn: ");
        int x = -1, y = -1;

        // MAIN ISSUE WAS HERE -- Add correct loop on invalid input
        do {
            System.out.print("Enter row number: ");
            x = scn.nextInt();
            System.out.print("Enter column number: ");
            y = scn.nextInt();
        } while ((x < 0 || x >= numRows) || (y < 0 || y >= numCols));

        // MAIN ISSUE WAS HERE -- Removed invalid loop on update field
        if (computerField[x][y] != 0 && computerField[x][y] != 9) {
            System.out.println("You sunk the ship!");
            computerField[x][y] = 1;//"s";
            computerShips--;
        } else if (".".equals(computerField[x][y])) {
            System.out.println("You missed");
            computerField[x][y] = 2; //"x";
        }                   
    }

    public static void computerTurn() {
        System.out.println("\nComputer's turn: ");

        int x = random.nextInt(FIELD_SIZE);
        int y = random.nextInt(FIELD_SIZE);
        System.out.println("Enter row number: " + x);
        System.out.println("Enter column number: " + y);

        // MAIN ISSUE WAS HERE -- Removed invalid loop on input/rand
        if ((x >= 0 && x < numRows) && (y >= 0 && y < numCols)) {
            if (playerField[x][y] != 0 && playerField[x][y] != 9) {
                System.out.println("The Computer sunk one of your ships!");
                playerField[x][y] = 1;//"s";
                playerShips--;
            } else if (".".equals(playerField[x][y])) {
                System.out.println("Computer missed");
                playerField[x][y] = 2; //"x";
                if (missedGuesses[x][y] != 1) {
                    missedGuesses[x][y] = 1;
                }
            }              
        }
    }

    public static void gameOver() {
        System.out.println("Your ships: " + playerShips + " | Computer ships: " + computerShips);
        if (playerShips > 0 && computerShips <= 0) {
            System.out.println("You won the battle! ");
        } else {
            System.out.println("You lost the battle! ");
        }
        System.out.println();
    }

    public static void printBoard2(int[][] field) {
        System.out.print(" ");
        System.out.println("0 1 2 3 4 5 6 7 8 9");
        char[][] map = new char[FIELD_SIZE][FIELD_SIZE];
        for (int i = 0; i < FIELD_SIZE; i++) {
            for (int j = 0; j < FIELD_SIZE; j++) {
                switch(field[i][j]) {
                    case 0:
                    case 9: map[i][j] = '.';
                        break;
                    case 1: map[i][j] = 's';
                        break;
                    case 2: map[i][j] = 'x';
                        break;
                    default: map[i][j] = 'o';
                        break;
                }
            }
        }

        Arrays.stream(map)
                .forEach(m -> System.out.println(Arrays.toString(m).replace(",", "")));
    }
}

На этом этапе Я позволю вам сделать все остальное. Осталось много ошибок . Найдите время, чтобы полностью завершить sh и перепроверить свой код, прежде чем снова обращаться за помощью. И продолжайте обучение, есть возможности для улучшений с точки зрения OOP, правил кодирования и лучших практик. Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...