gpt4 book ai didi

java - Java 中的一维战舰游戏

转载 作者:行者123 更新时间:2023-12-01 09:57:23 25 4
gpt4 key购买 nike

我是一名大学生,也是一名初级 Java 开发人员。我收到了这个作业,我需要使用字符串模拟一维战舰游戏。给我的规则如下:

  1. 棋盘的长度必须为 10,高度必须为 1
  2. 计算机将一艘长度一船和一艘长度两船放在板上
  3. 用户必须在 10 个可能的位置之一重复拍摄
  4. 计算机会对每次射击做出“水”、“击中”、“沉没”、“已击中”的响应
  5. 当所有船只都沉没后,游戏结束,计算机会告诉您需要射击多少次。

到目前为止我想到了什么:

  1. 定义一个方法String buildBoard(),返回由 7 个字符“water”组成的随机字符串; 2 个字符,必须彼此相邻,用于“无命中长度-两艘船”;和 1 个字符表示“单船无命中长度”
  2. 定义一个方法boolean endGame(String s),如果所有船只都沉没,则该方法返回 true。
  3. 定义一个方法String manageShot(String s, int p),在给定棋盘配置和位置 p 的射击的情况下,打印出射击的结果(如上所述)并返回新的董事会配置。
  4. 最后,定义一个void main(String[] args)方法来管理输入、方法调用和最终打印。

你认为这可行吗?希望我已经以一种可以理解的方式解释了它。

我的问题是,我完全不知道如何生成随机字符串,特别是如果我必须使两个字符彼此相邻。有人可以解释一下我该怎么做吗?

你能看一下我的代码,看看它是否可以或者是否可以简化?

    public class UnidimensionalBattleship {

/* x - miss (no ships here)
* . - sea (available for firing)
* s - enemy ship (available for firing)
* c - enemy ship (2 spaces, available for firing) */

public static String map() {
String sea = new String("..........");
int pos;
Random rnd = new Random();

pos = rnd.nextInt(sea.length());
sea = sea.substring(0, pos) + "s" + sea.substring(pos + 1);

int shipsSet = 0;
do {
if (sea.substring(pos).equals(".") && sea.substring(pos+1).equals(".")) { //pos available
sea.substring(pos).equals("cc");
shipsSet++;
}
}while(shipsSet < 2);

return sea;
}

public static String manageShot(String sea, int p) {
char outcome = sea.charAt(p);
switch(outcome) {
case '.': System.out.println("Miss");
sea=sea.substring(p, p) + "x" + sea.substring(p+1);
break;

case 's': System.out.println("Sunk!");
sea=sea.substring(p, p) + "x" + sea.substring(p+1);
break;

case 'c': System.out.println("Hit!");
sea=sea.substring(p, p) + "x" + sea.substring(p+1);
break;

case 'x': System.out.println("Already Hit");
break;
}
return sea;
}

public static boolean endGame(String sea) {
int i; //counter
i=0;

for (i=0; i<sea.length(); i++) {
if (sea.charAt(i)=='.'|| sea.charAt(i)=='x')
i++;
}
return true;
}

最佳答案

My problem is that I have absolutely no idea on how to generate a random String especially if I have to keep two characters next to each other. Can someone please explain me how to do it?

由于您需要在字符串中执行此操作,因此可以使用字符串函数进行一些简单的字符串操作。为了让您确定它是“击中”、“沉没”、“未击中”还是已经击中,您可以使用一组预定义的字母来表示其中的每一个。

例如:

x - miss (no ships here)
. - sea (available for firing)
s - enemy ship (available for firing)
c - enemy ship (2 spaces, available for firing)

要生成船舶位于随机位置的字符串,有多种方法可以实现。您可以使用 StringBuilder 并连接字符串,或者简单地使用字符数组并在定位船舶后将其转换为字符串:

char[] sea = new char[10];
for(int x=0; x<sea.length; x++)
sea[x] = '.'; //set everything as sea first

Random rnd = new Random();
sea[rnd.nextInt(sea.length)] = 's'; //sea ship at random position

如果您有多种类型的船舶,请使用不同的符号来识别它们。如果您有不止一艘船,请使用循环来填满海洋:

int shipsSet = 0;
do
{
int pos = rnd.nextInt(sea.length);
if(sea[pos] == '.'){ //pos available
sea[pos] = 's';
shipsSet++;
}
}while(shipsSet < 2);

将字符数组转换为字符串:

String map = String.valueOf(sea);

生成结果:

int attackPos = scn.nextInt();

char outcome = map.charAt(attackPos);
switch(outcome){
case '.': System.out.println("Miss");
//use substring to mark this spot as "X"
break;
case 's': System.out.println("Sunk!"); //ship 's' only takes 1 space
//use substring to mark this spot as "X"
break;
case 'c': System.out.println("Hit!"); //ship 'c' takes 2 spaces
//use substring to mark this spot as "X"
break;
case 'x': System.out.println("Already Hit");
break;
}

以上内容将使您非常清楚从哪里开始以及如何实现整个计划。如果不允许使用 char 数组,只需使用 StringBuilder。如果也不允许,只需使用子字符串生成一张 map ,其中船舶位于随机位置。

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

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