2016-11-08 16 views
5

Mam projekt dla mojej klasy informatyki i robimy pancernik. Częścią programu jest to, że upewniamy się, że utwór, który gracz kładzie, nie wychodzi z planszy.Tworzenie programu powtórzyć w sobie, ale nie można wykonać metody (?): Java

Zrobiłem sposób sprawdzić, czy zgaśnie Zarządu:

private static boolean test(String s, int row, int column,int spaces) 
{ 
    if(s.equals("right")&&column+5<=10) 
    { 
     return true; 
    } 
    if(s.equals("up")&&row-spaces>=0) 
    { 
     return true; 
    } 
    if(s.equals("left")&&column-spaces>=0) 
    { 
     return true; 
    } 
    if(s.equals("Down")&&row+spaces<=10) 
    { 
     return true; 
    } 
    return false; 
} 

Ale gdy stałam się go wydrukować komunikat o błędzie, nie jestem pewien, jak zrobić tak, aby program mógł ponownie otrzymać nową pozycję dla utworu, bez umieszczania wyrażenia if w i jeśli instrukcja w instrukcji if (i tak dalej), ponieważ musisz sprawdzić nową pozycję, aby upewnić się, że tak nie jest " t zejść z planszy.

Oto część, w której pojawia się położenie kawałka gry (chociaż nie sądzę, jest to potrzebne)

Scanner sonic= new Scanner(System.in); 
System.out.println("Please input the row where you want the aircraft carrier (5 spaces) to begin: "); 
int beginrow = sonic.nextInt(); 
System.out.println("Please input the column where you want the aircraft carrier (5 spaces) to begin: "); 
int begincolumn = sonic.nextInt(); 
System.out.print("Please input what direction (up, down, left, right) \nyou want your battle ship to face, making sure it doesn't go off of the board."); 
String direction = sonic.next(); 

A oto jeden z if że używam do sprawdzenia/umieść sztuk

if(direction.equals("left")&&test("left",beginrow,begincolumn,5)) 
{ 
    for(int i = beginrow; i>beginrow-5; i--) 
    { 
     battleship[begincolumn-1][i-1] = ('a'); 
    } 
} 
else if(!test("left",beginrow,begincolumn,5)) 
{ 
    System.out.println(" "); 
    System.out.println("*****ERROR: your piece goes off the board, please re-enter your position and direction*****"); 
} 

Może to być duplikat, ale nie wiedziałem, jak zmienić moje wyszukiwanie, aby znaleźć to, co chciałem. (Więc jeśli ktoś może skierować mnie do właściwego artykułu, że byłoby miło, jak również)

+1

Korzystanie z pętli? 'for',' do' lub 'do' /' while'? –

+0

Co naprawdę chcesz zrobić, to: Kontynuuj prosić o dane wejściowe użytkownika, dopóki nie będzie ono ważne. Pętla 'do' /' while' to naturalne dopasowanie do takiego zadania. – Hulk

Odpowiedz

1

Pierwszym krokiem jest oddzielne sprawdzanie poprawności danych wejściowych od podjęcia działania w oparciu o to wejście - logika walidacji jest już w osobnej funkcji, więc jest to łatwe. Następnie dowiedzieć się, co należy zrobić w przypadku nieprawidłowej wejścia - w przypadku, trzeba poprosić o nowym wejściu aż do uzyskania prawidłowych pozycji:

do { 
    System.out.println("Please input the row where you want the aircraft carrier (5 spaces) to begin: "); 
    beginrow = sonic.nextInt(); 
    System.out.println("Please input the column where you want the aircraft carrier (5 spaces) to begin: "); 
    begincolumn = sonic.nextInt(); 
    System.out.print("Please input what direction (up, down, left, right) \nyou want your battle ship to face, making sure it doesn't go off of the board."); 
    direction = sonic.next(); 
} while (!test(direction, beginrow, begincolumn, 5)) 

Po tym, wiesz, że masz ważny pozycja.

Moim następnym krokiem będzie prawdopodobnie do grupy informacje wymagane w celu opisania statek na planszy (tj beginrow, begincolumn, direction, prawdopodobnie również size) w odrębny przedmiot - być nazwany Ship.

1

myślę można całkiem naturalnie używać recursion tutaj:

public void getInput() { 
    // scanner code to get input 
    if (!test("left",beginrow,begincolumn,5)) { // test failed 
     getInput() 
     return 
    } 
    // test succeeded, continue 
} 
+1

Dlaczego rekurencja, jeśli pętla wydaje się łatwiejsza do zrozumienia? – Robert

0

Masz już coś granicach Ciebie tablica? Jeśli wykonasz pierwszy czek, nie trzeba wykonywać kaskadę if-else

if(!test(direction,beginrow,begincolumn,size)) 
{ 
    System.out.println(" "); 
    System.out.println("*****ERROR: your piece goes off the board, please re-enter your position and direction*****"); 
} else { 
    // check for collision with already placed ships 
} 

Należy pamiętać, że jest szansa, aby połączyć w górę/dół i lewo/prawo. Zasady obliczania są prawie takie same i musisz tylko zdecydować, czy musisz spojrzeć w tym czy innym kierunku.

2

Co należy zrobić, to odpowiednio podzielić kod na metody i wielokrotnie wywoływać metody, dopóki program nie będzie zadowolony z rezultatu.

Na przykład:

  • utworzyć metodę startGame() która ma metody połączeń zadanie uzyskiwanie danych wprowadzonych przez użytkownika, aż spełnione
  • czynią metodę żądania użytkownika do wejścia wszystkie inne statki i inne wymagane dane

To może wyglądać

public void startGame() { 
    // do some setup 

    while(!requestShipInput()) { // request ship data until the data is valid 
     System.out.println(" "); 
     System.out.println("*****ERROR: your piece goes off the board, please re-enter your position and direction*****"); 
    } 

    // do some more ship setup 

    // get the actual playing started 
} 

public boolean requestShipInput() { 
    Scanner sonic= new Scanner(System.in); 
    System.out.println("Please input the row where you want the aircraft carrier (5 spaces) to begin: "); 
    int beginrow = sonic.nextInt(); 
    System.out.println("Please input the column where you want the aircraft carrier (5 spaces) to begin: "); 
    int begincolumn = sonic.nextInt(); 
    System.out.print("Please input what direction (up, down, left, right) \nyou want your battle ship to face, making sure it doesn't go off of the board."); 
    String direction = sonic.next(); 

    if(direction.equals("left")&&test("left",beginrow,begincolumn,5)) { 
     for(int i = beginrow; i>beginrow-5; i--) { 
      battleship[begincolumn-1][i-1] = ('a'); 
     } 
     return true; // valid ship data 
    } 
    return false; // invalid ship data 
} 
+0

Dobry pomysł na podzielenie wszystkiego, dzięki. (Również w jaki sposób formatować fragmenty kodu?). –

+1

@GracelynRioux dodaje 4 spacje przed każdą linią - nie ma potrzeby stosowania znaczników komentarza blokowego. Zrobił to dla ciebie tym razem. Istnieje również '{}' - CodeSample-Button w formularzu edycji. – Hulk

Powiązane problemy