gpt4 book ai didi

java - Java 中的战舰游戏板

转载 作者:行者123 更新时间:2023-12-01 16:28:45 25 4
gpt4 key购买 nike

我写了战舰游戏的代码。有两个玩家,人类玩家和计算机玩家。他们都有单独的板。一开始,我会自动将船只随机放置在两个棋盘上,然后获取坐标并将船只放置在对方的棋盘上。如果坐标中的位置击中对方玩家的船只,我会向屏幕发送一条消息。如果击沉船只,屏幕上会显示字符“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() 方法修正了游戏逻辑
  • 我删除了“网格”变量。我不明白它为什么存在。相反,将“field”变量外部化 -> 每个玩家一个。
  • 我将您的两个 deployPlayerShips() deployComputerShips() 方法合并为一个:deployPlayersShips(...)。但我仍然不明白它的大部分逻辑。对于下面给定的代码,显示和字段初始化存在问题。但这些错误肯定已经存在于您的原始代码中。
  • 我重写了 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(",", "")));
}
}

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

关于java - Java 中的战舰游戏板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62093845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com