我是一名大学生和初学者Java开发人员。我得到了这个任务,我需要使用字符串来模拟一维战舰游戏。给我的规则如下:
到目前为止我想出了什么:
我的问题是我完全不知道如何生成随机字符串,特别是如果我必须保持两个字符彼此相邻。有人可以解释一下如何做到这一点吗?
您可以查看我的代码,看看它是否可以或是否可以简化?
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;
}
答案 0 :(得分:1)
我的问题是我完全不知道如何生成随机字符串,特别是如果我必须保持两个字符彼此相邻。有人可以解释一下如何做到这一点吗?
由于您需要在String中执行此操作,因此使用String函数进行一些简单的String操作将起作用。为了让您确定它是&#34;命中&#34;,&#34;沉没&#34;,&#34;未命中&#34;还是已经命中,您可以拥有一组预定义的字母代表每一个。
例如:
x - miss (no ships here)
. - sea (available for firing)
s - enemy ship (available for firing)
c - enemy ship (2 spaces, available for firing)
要在随机位置生成船只的字符串,有很多方法可以做到这一点。您可以使用StringBuilder并连接String或只是使用char数组并在定位船只后将其转换为字符串:
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);
将char数组转换为String:
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。如果也不允许,只需使用子字符串生成随机位置的船舶地图。
答案 1 :(得分:0)
我想我已经有了第一部分 - 你可以使用Apache Commons的RandomStringUtils ...... https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/RandomStringUtils.html#random(int, java.lang.String)
如您所见,它需要一个整数和一个字符串 - 整数是字符串的长度,字符串是它将使用的字符组。
我会在互联网上找一眼,看看我是否可以帮助你将两个角色放在一起。