Java中的一维战舰游戏

时间:2016-05-07 12:34:34

标签: java string

我是一名大学生和初学者Java开发人员。我得到了这个任务,我需要使用字符串来模拟一维战舰游戏。给我的规则如下:

  1. 该板必须长10英寸,高1英寸
  2. 计算机将一个长度 - 一个船和一个长度 - 两艘船放在船上
  3. 用户必须在10个可能的位置之一重复拍摄
  4. 计算机将使用" water"," hit"," sunk","已经点击"
  5. 来响应每一个镜头
  6. 当所有船只沉没时,游戏以计算机结束,告诉你需要多少枪。
  7. 到目前为止我想出了什么:

    1. 定义方法 String buildBoard(),返回由7个字符组成的随机字符串" water&#34 ;; 2个字符,必须彼此相邻,用于"没有命中长度 - 双船&#34 ;;和#34;没有命中长度 - 一个船"
    2. 的1个字符
    3. 定义一个方法 boolean endGame(String s),如果所有船只都沉没,则返回true。
    4. 定义一个方法 String manageShot(String s,int p),给定一个Board配置和一个位置p的镜头,打印出镜头的结果(如上所述),并返回新的董事会配置。
    5. 最后,定义一个 void main(String [] args)方法,用于管理输入,方法调用和最终打印。
    6. 你认为它能起作用吗? 希望我以一种可以理解的方式解释它。

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

      您可以查看我的代码,看看它是否可以或是否可以简化?

          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;
              }
      

2 个答案:

答案 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)

如您所见,它需要一个整数和一个字符串 - 整数是字符串的长度,字符串是它将使用的字符组。

我会在互联网上找一眼,看看我是否可以帮助你将两个角色放在一起。