繁体   English   中英

Java中的战舰游戏板

[英]Battleship game board in Java

我编写了军舰游戏的代码。 有两个玩家,人类玩家和电脑玩家。 他们都有单独的板。 一开始我会自动将船随机放置在两个板上,然后我取坐标并将船放在彼此的板上。如果坐标中的位置击中对方的船,我会向屏幕发送一条消息说这个. 如果沉船,屏幕上会显示字符“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();
}

好的,这是一个更正确的版本。 我可以做更多,但是......然后一半的代码将被重写,我看不出这样做的意义(对你没有帮助)。 所以我坚持认为它远非完美,但至少它解决了你的问题。 我做了以下更正:

  • Battle() 方法具有更正的游戏逻辑
  • 我删除了“网格”变量。 我不明白它为什么存在。 而是将“字段”变量外部化-> 每个玩家一个。
  • 我将您的两个deployPlayerShips() deployComputerShips()方法合并为一个: deployPlayersShips(...) 但我仍然不明白它的大部分逻辑。 下面给出的代码在显示和字段初始化时存在问题。 但是这些错误肯定已经存在于您的原始代码中。
  • 我重写了 printBoard() 以使用“字段”变量。 但它仍然需要修复。
  • 我部分修复了 playerTurn() 和 computerTurn() 方法,因为它们的循环结构很糟糕。 转弯永远不会真正“转弯”。 我认为最大的(阻塞)问题出现在这些方法中(即使仍然存在其他错误)。
  • 我添加了一个全局 Random() 并使 Scanner 仅实例化一次。

package沙盒;

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(",", "")));
    }
}

此时我让你做rest。 许多错误仍然存在 在再次请求帮助之前,花点时间真正完成并仔细检查您的代码。 并继续培训,在 OOP、编码规则和最佳实践方面仍有改进的空间。 祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM