2014-10-25 4 views
0

Это моя попытка воссоздать броненосец с использованием Java. Я решил протестировать более простую версию игры только с одним кораблем и дать кораблю конкретное место на игровом поле. Я нашел проблему с моим кодом. Независимо от того, какую координату я вхожу, я в конечном итоге «ударяю» по кораблю.Код линкора не работает

Вот весь код, я написал до сих пор:

import java.util.Scanner; 

class GameBoard { 

    Scanner input = new Scanner(System.in);           // scanner object 

    String[][] board = {               // game board 

    {"_", " 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10"},  
    {"A", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"}, 
    {"B", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"}, 
    {"C", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"}, 
    {"D", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"},    
    {"E", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"}, 
    {"F", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"}, 
    {"G", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"}, 
    {"H", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"}, 
    {"I", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"}, 
    {"J", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]", "[ ]"} 

    }; 

    boolean frigateIsAlive = true;             // the ship is still alive 

    int numOfHitsOnFrigate = 0;              // number of hits the player made on the frigate 

    String [] frigate = {board[1][1], board[1][2]};         // ship 


    public void createBoard(){              // draws the battleship game board 
     for (int row = 0; row < board.length; row++) { 
      for (int col = 0; col < board[row].length; col++) { 
       System.out.print(board[row][col] + "\t"); 

      } // inner loop 
      System.out.println(); 
      System.out.println(); 
      System.out.println(); 
     } // outer loop 
} 

    public String getUserGuess() {             // takes the users guess 

     System.out.println("Choose a coordinate on the board to fire at"); 
     int x = input.nextInt();               
     int y = input.nextInt(); 

     String userGuess = board[x][y]; 
     return userGuess; 
    } 



    public void checkResult(String userGuess) {          // checks the user's guess 

      if(userGuess.equalsIgnoreCase(frigate[0])){ 
       System.out.println("hit!"); 
       numOfHitsOnFrigate++; 
       board[1][1] = " *"; 
       createBoard(); 
      } 
      else if(userGuess.equalsIgnoreCase(frigate[1])) { 
       System.out.println("hit!"); 
       numOfHitsOnFrigate++; 
       board[1][2] = " *"; 
       createBoard(); 
      } 
      else { 
       System.out.println("miss!"); 
      } 
      if (numOfHitsOnFrigate == 2) { 
       System.out.println("Enemy frigate has been sunk!"); 
       frigateIsAlive = false; 
      } 

     } 



} // end class 


public class Game { 

public static void run() { 
    GameBoard newGame = new GameBoard(); 

    newGame.createBoard(); 

    while(newGame.frigateIsAlive) { 
    newGame.checkResult(newGame.getUserGuess()); 
    } 






    } 

} 


public class App { 

    public static void main(String[] args) { 

     Game.run(); 

    } 
} 
+0

Мне кажется, что строки в (1, 1) и (1, 2) такие же, как и все остальные струны. – sje397

+0

Ну, фрегат расположен в (1,1) и (1,2), (по крайней мере, пока я тестирую код), я пытаюсь ввести эти координаты и зарегистрировать хит на корабле. –

+0

Для меня, похоже, идея о том, как можно запрограммировать игру, может быть немного отключена. Почему у вас нет двух координат вместо огромной доски? Выпустив 'frigate = {board [1] [1], board [1] [2]}', вы назначаете пустые скобки этим пятнам вместо значения. Тогда, я полагаю, вы сравниваете эти значения с более пустыми скобками? –

ответ

1

Катер всегда удара, потому что декларация frigate является:

frigate = {board[1][1], board[1][2]} 

, которая в конечном счете, назначая строку '[ ]' к обоим значениям фрегата. Затем это сравнивается с более пустыми строками, когда вы ищете фрегат и сравниваете значения.

Это можно зафиксировать, сделав доску позиции x в [1,2,3,4, n] и y в [A,B,C...,Letter_n]. То есть координаты фрегата будут Frigate.x = 1 и Frigate.y = A.

Надеюсь, это поможет!


Я видел ваш дальнейший вопрос о том, как это реализовать. Я бы фрегат класса, который имеет список координат:

  1. this.x одно очко либо письмо или номер

  2. this.y как одна точка не типа this.x как в вашем примере

  3. Кортеж (this.x, this.y) будет работать хорошо в вашем списке Фрегат

  4. Сделайте то же самое для любых других пунктов в списке фрегатов.

После того, как список фрегатов завершен, необходимо изменить еще две вещи.

Первое, что было изменено, - это проверить, действительно ли пользователь вызывает вещи в области, которую вы хотите.

Вторая вещь, которую нужно изменить, - это удостовериться, что одна и та же точка не вызывается снова и снова, чтобы «взорвать» корабль. То есть, когда вызывается пункт в Frigate, тогда его следует удалить с фрегата. Остальные кортежи в Фрегате станут «здоровьем» «хитов», оставленных на фрегате. Чтобы вспомнить исходный размер фрегата, добавление Frigate.initialSize() было бы очень удобно, но это может быть позже по дороге.

+0

Доска только для шоу. Что-то для того, чтобы пользователь мог видеть, где находится корабль, и хиты. Я понимаю, что вы говорите. Фрегат и доска должны быть двумя независимыми объектами. Правильно? –

+0

@Cherry_Developer Да, точно. Фрегат должен быть объектом для себя, как и доска. Плата должна быть только средой для фрегата. Если вы хотите каждый раз перепечатывать доску, я бы рекомендовал делать то, что вы делаете с доской, а просто обновлять хит до '*' вместо пространства или чего-то еще. Лучшим решением является простейшее решение :) –