Gra w statki. Prośba o sugestie i sprawdzenie kodu w javie

0

Postanowiłem sobie, że w ramach nauki i ćwiczeń programowania napiszę prostą grę w statki. W tym celu wstępnie stworzyłem 3 metody: metodę przygotowującą grę (setGame()), metodę pobierającą wybór pola przez gracza (gamerChoice()) i metodę sprawdzającą czy trafił czy nie (checkChoice()). Na początku przed przystąpieniem do dalszego pisania chciałem sprawdzić czy wszystko działa jak należy i czy to co stworzyłem ma jakiś sens. Okazało się jednak, że ostatnia metoda nie działa i nie ważne jakie współrzędne się wpiszę zawsze wyświetla, że gracz trafił!. W związku z tym prosiłbym kogoś mądrzejszego i dobrego o pomoc w rozwiązaniu tego problemu, sprawdzeniu czy to co napisałem w ogóle do czegoś się nadaje. Dodam jeszcze, że dopiero co zaczynam naukę programowania więc proszę o wyrozumiałość ;) Z góry dziękuje za poświęcony czas, pomoc i odpowiedź :).

Poniżej kod klasy z metodami:

import java.util.Random;
import java.util.Scanner;

public class BattleShip {
	
	Random random = new Random(); 

	public int i,j;
	int[][] matrix = new int[10][10];
	int ship1[] = new int[3];
	
	// metoda ustawiajaca na planszy jeden statek zajmujacy 3 pola
	public void setGame() {
			
		i = random.nextInt(10);
		j = random.nextInt(10);
		
		if(i == 8 | i == 9 & j != 8 | j != 9) {
			matrix[i][j] = ship1[0];
			System.out.println("tabela["+i+"]["+j+"]");
			j++;
			matrix[i][j] = ship1[1];
			System.out.println("tabela["+i+"]["+j+"]");
			j++;
			matrix[i][j] = ship1[2];
			System.out.println("tabela["+i+"]["+j+"]");
			
		} else if(j == 8 | j == 9 & i != 8 | i != 9) {
			matrix[i][j] = ship1[0];
			System.out.println("tabela["+i+"]["+j+"]");
			i++;
			matrix[i][j] = ship1[1];
			System.out.println("tabela["+i+"]["+j+"]");
			i++;
			matrix[i][j] = ship1[2];
			System.out.println("tabela["+i+"]["+j+"]");
			
		} else if(i == 8 | i == 9 & j == 8 | j == 9) {
			int x = random.nextInt(1);
			if(x == 0) {
				matrix[i][j] = ship1[0];
				System.out.println("tabela["+i+"]["+j+"]");
				i--;  
				matrix[i][j] = ship1[1];
				System.out.println("tabela["+i+"]["+j+"]");
				i--;  
				matrix[i][j] = ship1[2];
				System.out.println("tabela["+i+"]["+j+"]");
				
			} else {
				matrix[i][j] = ship1[0];
				System.out.println("tabela["+i+"]["+j+"]");
				j--;  
				matrix[i][j] = ship1[1];
				System.out.println("tabela["+i+"]["+j+"]");
				j--;  
				matrix[i][j] = ship1[2];
				System.out.println("tabela["+i+"]["+j+"]");			
			}				
		} else {
			matrix[i][j] = ship1[0];
			System.out.println("tabela["+i+"]["+j+"]");
			i++;
			matrix[i][j] = ship1[1];
			System.out.println("tabela["+i+"]["+j+"]");
			i++;
			matrix[i][j] = ship1[2];			
		}
		gamerChoice(); // wywoluje metode proszaca gracza o wybranie pol
	}
	
	public int tab1Choice, tab2Choice;
	
	void gamerChoice() {
		
	
			Scanner read1 = new Scanner(System.in);
			System.out.print("Wspolrzedna tablicy pionowej: ");
			tab1Choice = read1.nextInt();
			Scanner read2 = new Scanner(System.in);
			System.out.print("\t, a teraz poziomej: ");
			tab2Choice = read2.nextInt();

			checkChoice(tab1Choice, tab2Choice);
	}	
	// metoda sprawdzająca wybór gracza
	int choice1, choice2;
	
	public void checkChoice(int a, int b) {
		
		a = choice1;
		b = choice2;
		
		
		if(matrix[choice1][choice2] == ship1[0] | 
				matrix[choice1][choice2] == ship1[1] |
				matrix[choice1][choice2] == ship1[2]) {
			int hitNumber1 = 0;
			System.out.println("Trafiony!");
			hitNumber1++;
			if(hitNumber1 == 3) System.out.println("Zatopiony!");
		} else {
			System.out.print("Pudło!");
		}		
	}
} 

A oto kod klasy testującej:

public class BattleShipDemo {

	public static void main(String[] args) {
		
		BattleShip gamer = new BattleShip();
		
		gamer.setGame();
	}
} 
0
i == 8 | i == 9 & j != 8 | j != 9

To jest bitowy OR i AND a nie Logiczny. Nie wiem czy taka byla Twoja intencja.

Tak samo tu => "|"

 if(matrix[choice1][choice2] == ship1[0] | 
                matrix[choice1][choice2] == ship1[1] |
                matrix[choice1][choice2] == ship1[2]) {
            int hitNumber1 = 0;
            System.out.println("Trafiony!");
            hitNumber1++;
            if(hitNumber1 == 3) System.out.println("Zatopiony!");
        } else {
            System.out.print("Pudło!");
        }        
0

skytrack dzięki za odpowiedź. Zmieniłem operatory na logiczne ale sytuacja się nie zmieniła, nadal nieważne jakie współrzędne podam to zawsze jest "trafiony!".

0

w tablicy ship masz same zera, i potem te zera przypisujesz do tablicy matrix w metodzie setGame

0

A ja generalnie w ogóle bym tego tak nie pisał bo to jest bardzo zły pomysł. A jak będziesz chciał planszę NxM i statki rozmiaru K o potencjalnie dziwnych kształtach? Też tak będziesz to ifami pisał?
Ja bym to jednak napisał obiektowo i oparł to o jakieś HashMap<Position, Ship> i po trafieniu usuwał z mapy rozwalony fragment statku, a statek sam powinien zliczać sobie ile dostał trafień.

0

garai_nz w metodzie setGame() umieściłem w tablicy ship1[0-2] liczby od 1 do 3, ale teraz nie ważne jakie współrzędne podam program zawsze wyświetla mi pudło! Próbowałem też w metodzie checkChoice() zmienić kod if na taki, który równa się 1 || 2 || 3, ale to też nie działa. Shalom ja wiem, że istnieje wiele dużo lepszych sposobów na napisanie tej gry i chętnie wypróbuje później ten co podałeś, ale nie bardzo rozumiem dlaczego nie działa mi to co napisałem, nie wiem w czym jest problem co jest trochę demotywujące przy nauce. Myślę też, że zostawianie nie rozwiązanych problemów też nie jest dobre, dlatego bardzo proszę kogoś mądrego kto znalazł rozwiązanie o wytłumaczenie mi dlaczego to nie działa.

P.S i dzięki wszystkim, którzy do tej pory poświęcili chwile za odpowiedzi ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.