Gra w statki, pobranie danych wejściowych na poziome wiersza poleceń

0

Cześć,

chcę stworzyć prostą grę w statki. Plansza to kwadrat o bokach A-G na 0-6, gra ma na celu zatopienie trzech statków, z którego każdy zajmuje trzy komórki (np. C3,C4,C5). Użytkownik podaje swoje strzały w wierszu poleceń, następnie jego strzał porównywany jest z komórkami, na których usytuowane są statki. Przebieg gry kończy się podaniem komunikatu o wygranej oraz ilości wykonanych ruchów. Do pobrania danych wejściowych użytkownika używam klasy Scanner. Stworzyłam dwie klasy - 1) Gra, w której toczy się cały przebieg gry oraz 2)Statek, której głównym zadaniem jest ustawienie położenia poszczególnych statków na planszy oraz sprawdzenie czy statek został "trafiony".

Pojawiają się następujące błędy:

$javac Gra.java
Gra.java:14: error: illegal start of expression
        public String getUserInput(){
        ^
Gra.java:14: error: ';' expected
        public String getUserInput(){
                                  ^

Powyższe komunikaty raczej nie pomogą w rozwiązaniu problemu, bo w wierszu 14 nie może chodzić o zamknięcie wiersza. Nie wiem czy źle używam klasy Scanner, czy nie rozumiem do końca działania moich klas, jest to mój pierwszy program w javie, proszę pomóżcie.

Poniżej wklejam kod źródłowy:


import java.util.*;
import java.io.*;

public class Gra{
    int liczbaRuchow = 0;
    boolean statkiZatopione = false;
    Statek statek1 = new Statek();
    Statek statek2 = new Statek();
    Statek statek3 = new Statek();
        
    public void przebiegGry(){
        //pobieram dane od gracza, wpisane w konsolę
        Scanner pomocnik = new Scanner(System.in);   
        public String getUserInput(){
            return pomocnik.hasNextLine();
        }
        System.out.println("Zasady gry: Zatopić wszystkie 3 statki, każdy z nich składa się z 3 pól. Plansza A-G x 0-6. Podaj pierwsze pole: ");
        String poleOdUzytkownika = getUserInput();
        //koniec pobierania danych

        while(statkiZatopione == false){
            liczbaRuchow++;
            String wynik1 = statek1.sprawdz(poleOdUzytkownika);
            String wynik2 = statek2.sprawdz(poleOdUzytkownika);
            String wynik3 = statek3.sprawdz(poleOdUzytkownika);
            if(wynik1 == "zatopiony"){
                System.out.println("Statek pierwszy został zatopiony");
            }
            if(wynik2 == "zatopiony"){
                System.out.println("Statek pierwszy został zatopiony");
            }
            if(wynik3 == "zatopiony"){
                System.out.println("Statek pierwszy został zatopiony");
            }
            if(wynik1 == "zatopiony"&& wynik2 == "zatopiony" && wynik3 == "zatopiony"){
                statkiZatopione = true;
                break;
            }
            System.out.println("Podaj kolejne pole");
            String poleOdUzytkownika = getUserInput();
        }
        System.out.printl("Koniec gry, udało Ci się zatopić wszystkie statki. Liczba ruchów = " + liczbaRuchow);
    }
    
    public static void main(String[] args){
        Gra gra = new Gra();
        gra.przebiegGry();
    }
}


class Statek{
    String wynik = "pudło";
    public String sprawdz(String pole){
        ArrayList<String> polozenieStatku = new ArrayList<String>();
        Random r = new Random();
        char randChar = (char) (r.nextInt(7) + 'a');    //randomowa litera z przedziału a-g
        int randDigit = Math.rand()*5;                       //randomowa liczba z zakresu 0-4
        for(int i=0; i<3; i++){
            polozenieStatku.add(randChar + String.parseString(randDigit));
            polozenieStatku.add(randChar + String.parseString(randDigit+1));
            polozenieStatku.add(randChar + String.parseString(randDigit+2));
        }
        while(polozenieStatku.size() != 0){
            for(int j=0; j<3; j++){
                if(polozenieStatku(i) == pole){
                    polozenieStatku.remove(i);
                    System.out.println("trafiony ");
                }
            }
        }
        return wynik = "zatopiony";
    }
}

3

W metodzie przebiegGry() definiujesz metodę getUserInput().

ps dlaczego mieszasz polski z angielskim? Zdecyduj się na jedno i wybierz to drugie ;)

0

OK, miałam kilka literówek i metodę getUserInput() wyciągnęłam z metody przebiegGry(), brak błędów, jednak wyświetla się:

Exception in thread "main" java.util.NoSuchElementException: No line found
	at java.util.Scanner.nextLine(Scanner.java:1540)
	at Gra.getUserInput(Gra.java:13)
	at Gra.przebiegGry(Gra.java:19)
	at Gra.main(Gra.java:44)

Co z tym zrobić?

Obecny kod ma postać:

import java.util.*;
import java.io.*;

public class Gra{
    int liczbaRuchow = 0;
    boolean statkiZatopione = false;
    Statek statek1 = new Statek();
    Statek statek2 = new Statek();
    Statek statek3 = new Statek();

    public String getUserInput(){
        Scanner pomocnik = new Scanner(System.in); 
        return pomocnik.nextLine();
    }
        
    public void przebiegGry(){
        System.out.println("Zasady gry: Zatopić wszystkie 3 statki, każdy z nich składa się z 3 pól. Plansza A-G x 0-6. Podaj pierwsze pole: ");
        while(statkiZatopione == false){
            String poleOdUzytkownika = getUserInput();
            liczbaRuchow++;
            String wynik1 = statek1.sprawdz(poleOdUzytkownika);
            String wynik2 = statek2.sprawdz(poleOdUzytkownika);
            String wynik3 = statek3.sprawdz(poleOdUzytkownika);
            if(wynik1 == "zatopiony"){
                System.out.println("Statek pierwszy został zatopiony");
            }
            if(wynik2 == "zatopiony"){
                System.out.println("Statek pierwszy został zatopiony");
            }
            if(wynik3 == "zatopiony"){
                System.out.println("Statek pierwszy został zatopiony");
            }
            if(wynik1 == "zatopiony"&& wynik2 == "zatopiony" && wynik3 == "zatopiony"){
                statkiZatopione = true;
                break;
            }
            System.out.println("Podaj kolejne pole");
        }
        System.out.println("Koniec gry, udało Ci się zatopić wszystkie statki. Liczba ruchów = " + liczbaRuchow);
    }

    public static void main(String[] args){
        Gra gra = new Gra();
        gra.przebiegGry();
    }
}

class Statek{
    String wynik = "pudło";
    public String sprawdz(String pole){
        ArrayList<String> polozenieStatku = new ArrayList<String>();
        // Random r = new Random();
        // char randChar = (char) (r.nextInt(7) + 'a');    //randomowa litera z przedziału a-g
        String randChar = "A";
        int randDigit = (int) Math.random()*5;                       //randomowa liczba z zakresu 0-4
        for(int i=0; i<3; i++){
            polozenieStatku.add(randChar + randDigit);
            polozenieStatku.add(randChar + randDigit+1);
            polozenieStatku.add(randChar + randDigit+2);
        }
        while(polozenieStatku.size() != 0){
            for(int j=0; j<3; j++){
                if(polozenieStatku.get(j) == pole){
                    polozenieStatku.remove(j);
                    System.out.println("trafiony ");
                }
            }
        }
        return wynik = "zatopiony";
    }
}
0

Próbujesz pobrać kolejną linię ze scannera a nie podajesz żadnej wartości?

1 użytkowników online, w tym zalogowanych: 0, gości: 1