猜猜战舰计划

时间:2015-12-11 23:51:18

标签: java

我在使用Java创建战舰解决方案时遇到了一些问题。随机的一组船被装载到10x10板上。 1 2hit船舶2 3hit船舶1 4hit船舶和1 5hit船舶(总共17次点击目标)

我做了一个嵌套循环,基本上在每个单元格坐标处开火,直到我使用了100次射击或者摧毁了所有的船只。目标是找到一种方法,以50或更少的射击下沉所有船只。我的问题是我无法分辨船只在哪里根据它们的下沉位置(因为它只告诉我是否我沉没了船,而不是如果我击中)而且,它不告诉我我是什么样的船沉没,但如果我知道如何解决命中问题,我可以更容易理解。

那么如果我“击中”一艘船怎么办呢?我可以在我的主板上确认的唯一“击中”是由“船沉没”消息引发的最后一击。

编辑:对不起,我还应该提一下我无法访问战舰类,我只有一个我用来解决这个问题的类。我得到了一些类的方法,如:

“public BattleShip() - 您需要在程序中调用一次构造函数来创建战舰游戏的实例。

public boolean shoot(Point shot) - 您需要调用此函数来进行每次拍摄。有关示例用法,请参阅示例源代码。

public int numberOfShipsSunk() - 返回在游戏过程中任何时候沉没的船只总数。最好使用这种方法来确定船舶何时沉没。

public boolean allSunk() - 返回一个布尔值,指示是否所有船只都已沉没。

public int totalShotsTaken() - 返回拍摄的总镜头数。您的代码需要负责确保不会多次拍摄相同的镜头。

public ArrayList shipSizes() - 返回所有出货号的ArrayList。数组的长度表示存在多少艘船。

public enum CellState - 这个枚举对象非常适用于标记单元格是Empty,Hit还是Miss。它还有一个方便的toString方法,因此可以用于打印目的。您也可以在代码中为此创建自己的枚举/类,但建议您使用此代替整数/字符来标记单元格状态“

CellState属性实际上不存在/是私有的,所以我不能使用它。这是我的循环。

  x  = 0;
           for(int i = 0; i < 10; i++)
           {
               y = 0;
             for(int j = 0; j < 10;j++) 
             {
                 if(x <=9 && y <=9) //X and Y  are less than or equal to 9...
             {
                     Point shot = new Point(x, y);

            // At the end of each decision on where to fire next you need to shoot

            if(shotTracker[x][y] == '-') // if space is free...
            {  battleShip.shoot(shot);
                if (sunkShip != battleShip.numberOfShipsSunk())
                {
                  shotTracker[x][y] = 'O'; //The hit that sunk the ship 
                  sunkShip++;
                }
                else
                shotTracker[x][y] = '*'; // set space to fired miss
            }
                 }



            gameShots = battleShip.totalShotsTaken();
            System.out.printf("You've shot %d times. The last shot's location was (%d,%d). You've hit something (not sure) times. You've sunk %d ships.\n", gameShots, x, y, battleShip.numberOfShipsSunk() );
            if(battleShip.allSunk() || gameShots >= shotLimit)
            {
                break;
            }
            y+=3;
             }
             if(battleShip.allSunk() || gameShots >= shotLimit)
            {
                break;
            }
             x++;
           } 
            if( gameShots >= shotLimit)
            {
                break;
            }
        }

输出:

* - - * - - * - - * 
* - - * - - * - - * 
* - - * - - * - - * 
* - - * - - * - - * 
* - - * - - * - - * 
* - - O - - * - - * 
* - - * - - * - - * 
* - - * - - * - - * 
* - - * - - * - - * 

这是随机输出。我每3个细胞拍摄一次,你可以看到我沉没了一艘船,但是O只告诉我那是最后一击,所以那是一架随机游戏中未知大小的垂直船......

2 个答案:

答案 0 :(得分:0)

无论您使用什么代码来确定船舶是否已经沉没,都应该能够告诉您船舶是否被击中。否则,它如何聚合以了解它的沉没?

答案 1 :(得分:0)

我明白了。我的镜头命令

battleShip.shoot(shot)

评估为真或假,或命中或未命中。当我检查是否真的使用&#34; O&#34;否则使用&#34; *&#34; O的弹出,所以我想我现在可以做更多的工作了。感谢您的帮助!