Внедрение второго корабля в одномерную игру battleship Java

#java #arrays #bluej

#java #массивы #bluej

Вопрос:

Я разработал игру battleship так, чтобы в ней был скрыт только один корабль, и теперь мне нужно внедрить в игру еще один корабль. Я новичок в Java, и мне было интересно, может ли кто-нибудь предложить мне простой способ сделать это. Нужно ли мне создать другой метод или просто настроить метод отображения реки?

         public static void displayRiver(int[] river, boolean showShip) {
            System.out.println();
            System.out.print("|");
            for (int val : river) {
                switch (val) {
                    case -1: // No Ship
                    System.out.print("x");
                    break;
                    case 0: // Unknown
                    System.out.print(" ");
                    break;
                    case 1: // Ship Found
                    System.out.print(showShip ? "Y" : " ");
                    break;
                }//switch
                System.out.print("|");
            }//for
            System.out.println();
            System.out.println();
        }//displayRiver
    
        // main method
        public static void main(String[] arg) {
            int riverLength = promptForInt("Please, enter the river lenght"); 
            int [] shipArray = new int[riverLength]; 
         
            int randomBattleshipLocation = new Random().nextInt(riverLength); 
            shipArray[randomBattleshipLocation] = 1; 
         
            boolean showShip = false ; 
            int userGuess; 
    
            do
            {
                displayRiver (shipArray, false);
                userGuess = promptForInt(String.format("Guess, enter a location from 1 to "   riverLength));
                userGuess = userGuess -1; 
    
                if(shipArray[userGuess] == 1) 
                {
                    System.out.println("Boom! ");
                    showShip = true; 
                    displayRiver(shipArray, true);
                }
                else if(shipArray[userGuess] == -1)
                {
                    System.out.println("Location was already hit, try again! ");
                }
                else if(shipArray[userGuess] == 0) 
                {
                    System.out.println("Splash...");
                    shipArray[userGuess] = -1 ; 
                }
    
            } while(!showShip); 
    
            System.exit(0);
    
        }
    }
 

Ответ №1:

Ваша логика, похоже, заключается в том, что 1 в массиве указывается корабль, и ваши корабли, по-видимому, никогда не бывают больше одного в ширину.

В настоящее время для создания одного корабля используется следующее

 int randomBattleshipLocation = new Random().nextInt(riverLength); 
shipArray[randomBattleshipLocation] = 1;
 

Таким образом, вы могли бы превратить это в метод, который создает battleship, а затем вызывать его столько раз, сколько захотите для нескольких кораблей. Просто убедитесь, что вы не назначаете корабль поверх другого корабля или не допускаете другую логическую ошибку (например, пытаясь поместить 5 кораблей в реку размером 4, и она будет вечно зацикливаться, пытаясь найти место для кораблей).

Псевдокод и не очень псевдокод:

 for(int i = 0;i < shipsToAdd; i  ) {
    addShip(shipArray);
}

// Use a shared class-level Random object, don't do new Random().nextInt();
private static Random rnd = new Random();
private static addShip(int[] array) {
    // Here you should loop to check if the array is already full of ships
    // otherwise it's a design flaw that will result in an infinite loop with bad input

    // loop until we find a shipless array index
    int index = rnd.nextInt(array);
    while(array[index] == 1)
       index = rnd.nextInt(array);
    array[index] = 1;
}
 

Комментарии:

1. В дополнение к комментарию Каямана, вы также можете убедиться, что пользовательское предположение на самом деле ЯВЛЯЕТСЯ числом от 1 до длины реки, в противном случае часть displayRiver (shipArray, false); userGuess = promptForInt(String.format(«Угадай, введи местоположение от 1 до » Длина реки)); userGuess= userGuess -1; if(shipArray[userGuess] == 1) приведет к исключению IndexOutOufBoundsException. Удачи и удачи в вашем путешествии по Java 🙂