Kółko i krzyżyk na Stringach

0

Witam, mam do zrobienia grę opartą na trzech wierszach Stringów. Aktualnie mój problem odnosi się do GameValidatora (nie sprawdza czy gracz wygrał w mainie) oraz do metody GetPoint (nie wprowadza znaków do Planszy w mainie). Czy mógłby ktoś rzucić okiem na kod i podpowiedzieć gdzie leży błąd ?

Plansza:

public class Plansza {

	String wiersz1;
	String wiersz2;
	String wiersz3;	

	public Plansza(String w1, String w2, String w3) {

		wiersz1 = w1;
		wiersz2 = w2;
		wiersz3 = w3;
	}

	private void put(int x, int y, char znak) {

		if (x< 0 || y < 0 || x > 2 || y > 2)
		{
			throw new WspolrzednePozaPlanszaException(x,y);
		}		
		else 
		if (isFull())
		{
			throw new PlanszaJestPelnaException ();
		}		
		else
		if (!isEmptyField(x,y))	{
			
			throw new ToPoleJestZajeteException(x, y);
		}	
		
		else
			
		{
		String row = getRow( y);
		String newRow = setCharAt(row, x, znak);
		setRow( newRow, y);
		}
	}
	
	private boolean isEmptyField( int x, int y) {
		
		return get(x,y) == '-';
	}
	
	private String setCharAt(String s, int index, char c) {
		
		String result = "";
		int i = 0;
		
		while (i < s.length()) {
			
			char cfs = s.charAt(i);
			if (i == index) cfs = c;
			result = result +cfs ;
			i = i+1;
		}
		
		return result;
	}
	private void setRow(String newRow, int y){
		
		if (y == 0) wiersz1= newRow;
		else
		if ( y == 1) wiersz2 = newRow;
		else
			wiersz3 = newRow;
	}

	public void putX(int x, int y) {

		put(x, y, 'X');
	}

	public void putO(int x, int y) {

		put(x, y, 'O');
	}

	public boolean isFull() {
		
		String r = wiersz1 + wiersz2 + wiersz3;		
		return !r.contains("-");
	}
	
	public boolean isRowWith(int y, char c) {
		
		return isStringWith ( getRow( y ), c);
	}
	
	private boolean isStringWith( String s , char c )
	{
		for( int i = 0 ; i < s.length() ; i++ )
		{
			if( s.charAt( i ) != c ) return false; 
		}
		
		return true;
	}
	
	public boolean isColWith(int x, char c) {
		return isStringWith( getCol( x ) , c );
	}	
	
	public boolean isSlashRowWith(char c) {
		
		return isStringWith( getSlashRow(), c);
	}
	
	public boolean isBackSlashRowWith(char c) {
		
		return isStringWith( getBackslashRow(), c);
	}

	 public char get(int x, int y) {
		 
		 return getRow(y).charAt(x);
		 	 
	 }

	public String getRow(int y) {

		String wiersz = "";

		if (y == 0) 
			wiersz = wiersz1;
			
		
		else
		if	 (y == 1) 			
			wiersz = wiersz2;
			
		
		else
			wiersz = wiersz3;
		
		
			return wiersz;
		
	}

	 public String getCol(int x){
		 
		 return "" + get(x, 0) + get(x,1) + get(x,2);	
	 }

	public String getSlashRow() {
		
		return "" + get(0, 2) + get(1,1) + get(2,0);
	}

	public String getBackslashRow(){		
		
		return "" + get(0, 0) + get(1,1) + get(2,2);
	}

	public String toString() {
		return ("wiersz1: " + wiersz1 + "\n" + "wiersz2: " + wiersz2 + "\n"
				+ "wiersz3: " + wiersz3);
	}
}

Metoda GetPoint:

import java.awt.Point;
import java.util.*;


public class KeyboardKolkoKrzyzykPlayer extends KolkoKrzyzykPlayer{
	
	public KeyboardKolkoKrzyzykPlayer (String name) {
		
		super (name);
	}
	
	public java.awt.Point getPoint() {
	
	Scanner scanner = new Scanner(System.in);
		
		System.out.println( "wprowadz X: ");
		int x = scanner.nextInt();
		
		System.out.println( "wprowadz Y: ");
		int y = scanner.nextInt();
	
		return new Point (x,y); 
	}
}

Game Validator:

public class KolkoKrzyzykGameValidator extends GameValidator{

	
	Plansza p = new Plansza("---", "---", "---");
	
	public KolkoKrzyzykGameValidator(Plansza p1) {
		
		p =p1;
	}
	
	
    public boolean isPlayerAWinner(){
    	
    	int y=0;
    	int x=0;
    	
    	if (p.isRowWith(y, 'X') && p.isColWith(x, 'X') && p.isSlashRowWith('X') 
    			&& p.isBackSlashRowWith('X'))
    	{
    	return true;
    	}
    	else
		return false;
    }

    public boolean isPlayerBWinner(){
    	
    	int y=0;
    	int x=0;
    	
    	
    	if (p.isRowWith(y, 'O') && p.isColWith(x, 'O') && p.isSlashRowWith('O') 
    			&& p.isBackSlashRowWith('O'))
    	{
    	return true; 
    	}
    	
    	else  
		return false;   
    	
    }

    public boolean isGameFinished(){
    	
    	if (p.isFull()); 
    	return true;
    	
    }
}

Main:

import java.util.Scanner;


public class KolkoKrzyzyk {

	
	public static void main(String[] args) {
		
		KeyboardKolkoKrzyzykPlayer GraczA = new KeyboardKolkoKrzyzykPlayer("");
		KeyboardKolkoKrzyzykPlayer GraczB = new KeyboardKolkoKrzyzykPlayer("");
		String imieA = GraczA.getName("Gracz(X)");
		String imieB = GraczB.getName("Gracz(O)");			
		Plansza p = new Plansza("---", "---", "---");
		GameValidator gv = new KolkoKrzyzykGameValidator(p);
		
		while (! p.isFull())
		{
		//GraczA.getPoint();
		//GraczB.getPoint();
		
		Scanner scanner = new Scanner(System.in);
			
		System.out.println( "Gracz A, wprowadz X: ");
		int wierszA = scanner.nextInt();			
		System.out.println( "Gracz A, wprowadz Y: ");		
		int kolumnaA = scanner.nextInt();
		p.putX( wierszA, kolumnaA);
		System.out.println(p);		
		gv.isPlayerAWinner();
		System.out.println( "Gracz B, wprowadz X: ");
		int wierszB = scanner.nextInt();			
		System.out.println( "Gracz B, wprowadz Y: ");		
		int kolumnaB = scanner.nextInt();
		p.putO( wierszB, kolumnaB);
		System.out.println(p);
		gv.isPlayerBWinner();

		}
	}
}
0

Przyjrzyj się temu fragmentowi:

    public boolean isGameFinished(){
 
            if (p.isFull()); 
            return true;
 
    }
0
__krzysiek85 napisał(a)

Przyjrzyj się temu fragmentowi:

    public boolean isGameFinished(){
 
            if (p.isFull()); 
            return true;
 
    }

Niestety niewiele mi to mówi :) być może coś jest źle ze składnią bądź całą metodą, ale to troche drugorzędne dla mnie w tym momencie. Bardziej martwi mnie Validator i getPoint :/

0
__krzysiek85 napisał(a)

Przyjrzyj się temu fragmentowi:

    public boolean isGameFinished(){
 
            if (p.isFull()); 
            return true;
 
    }

Ta metoda zawsze zwróci true przez średnik po if'ie

0

Dodam że bez wspomnianego średnika, ta metoda się nie skompiluje.

0

daj else return false;

0

Dzięki :) a mógłbyś ocenić czy metody isPlayerWinner i getPoint są poprawne ? Samo getPoint powinno być ok, ale jego implementacja w mainie nie działa.

0

w isPlayerXWinner zmień w if'ie andy na ory wg mnie. Sprawdzasz tam czy chociaż jedna sytuacja zaszła i wtedy koleś wygrał, nie?

Mi ten fragment śmiga, co u ciebie się dzieje? Jakiś wyjątek wyskakuje czy nie wykonują się te linijki a reszta działa?

asd napisał(a)

Mi ten fragment śmiga, co u ciebie się dzieje? Jakiś wyjątek wyskakuje czy nie wykonują się te linijki a reszta działa?
Chodziło mi o getPoint()

0
asd napisał(a)
asd napisał(a)

Mi ten fragment śmiga, co u ciebie się dzieje? Jakiś wyjątek wyskakuje czy nie wykonują się te linijki a reszta działa?
Chodziło mi o getPoint()

Używając tego w mainie:

 
GraczA.getPoint();
GraczB.getPoint(); 

ruchy nie zapisują się do planszy.

EDIT
Metody isPlayerWinner oczywiście teraz działają, dzięki za pomoc, głupi błąd zrobiłem.

Jeszcze jeden problem, wyjątek WspolrzednePoza PlanszaException powinien pozwalać ponownie wykonać kolejny, tym razem poprawny, ruch danemu graczowi, tymczasem przeskakuje do tego drugiego. W czym leży błąd ?

Main:

import java.util.Scanner;


public class KolkoKrzyzyk {

	
	public static void main(String[] args) {
		
		KeyboardKolkoKrzyzykPlayer GraczA = new KeyboardKolkoKrzyzykPlayer("");
		KeyboardKolkoKrzyzykPlayer GraczB = new KeyboardKolkoKrzyzykPlayer("");
		String imieA = GraczA.getName("Gracz(krzyzyk)");
		String imieB = GraczB.getName("Gracz(kolko)");			
		Plansza p = new Plansza("---", "---", "---");
		GameValidator gv = new KolkoKrzyzykGameValidator(p);
		
		while (! p.isFull())
		{
		//GraczA.getPoint();
		//GraczB.getPoint();
			try
				{
					Scanner scanner = new Scanner(System.in);
			
					System.out.println( "" + imieA + " , wprowadz X: ");
					int wierszA = scanner.nextInt();		
					System.out.println( "" + imieA + " , wprowadz Y: ");		
					int kolumnaA = scanner.nextInt();
		
					p.putX( wierszA, kolumnaA);		
					System.out.println(p);
		
						if (gv.isPlayerAWinner() == true )
							{				
								System.out.println ("wygrałeś!");
								break;
							}
					System.out.println( "" + imieB + " , wprowadz X: ");
					int wierszB = scanner.nextInt();			
					System.out.println( "" + imieB + " , wprowadz Y: ");		
					int kolumnaB = scanner.nextInt();
		
					p.putO( wierszB, kolumnaB);
					System.out.println(p);
		
						if (gv.isPlayerBWinner() == true )
							{				
								System.out.println ("wygrałeś!");
								break;
							}
				}
			catch	( PlanszaJestPelnaException pjpe )

				{
		        System.out.println( "Plansza jest pelna!!" + pjpe );
				}

		    catch	( WspolrzednePozaPlanszaException zppe )

		    	{
		        System.out.println( "Postawiles znak poza plansza!!" + zppe + ", zly X=" + zppe.getBadX() + ", zly Y=" + zppe.getBadY() );
		    	}
		}
	}
}

Wyjatek:

public class WspolrzednePozaPlanszaException extends BadXYException{

	
	public WspolrzednePozaPlanszaException (int badX, int badY) {
		
		super (badX, badY);
	}
}

public class BadXYException extends RuntimeException {
	
	
	private final int badX;
	private final int badY;
	
	public BadXYException  (int badX, int badY) {
		
		this.badX = badX;
		this.badY = badY;
	}
	
	public int getBadX (){
		return badX;
	}
	
	public int getBadY (){
		return badY;
	}
	

}

Fragment klasy Plansza:

private void put(int x, int y, char znak) {

		if (x< 0 || y < 0 || x > 2 || y > 2)
		{
			throw new WspolrzednePozaPlanszaException(x,y);
		}		
		else 
		if (isFull())
		{
			throw new PlanszaJestPelnaException ();
		}		
		else
		if (!isEmptyField(x,y))	{
			
			throw new ToPoleJestZajeteException(x, y);
		}	
		
		else
			
		{
		String row = getRow( y);
		String newRow = setCharAt(row, x, znak);
		setRow( newRow, y);
		}
	}
0

w przypadku tego wyjątku, nie jest tak, że jest jak opisujesz tylko dla gracza B zaś gdy gracz A popełni błąd to może go skorygować? Jeśli tak to jest tak dlatego że catch łapie niezależnie z którego gracza ten wyjątek a następnie ponownie uruchamiana jest pętla

W sprawie głównego błędu to spróbuj sobie po zaczytaniu metodą getPoint() wypisać ten punkt + w metodzie put wypisać czy dostaje dobre współrzędne, bo tak na oko nic nie widzę.

0
asd napisał(a)

w przypadku tego wyjątku, nie jest tak, że jest jak opisujesz tylko dla gracza B zaś gdy gracz A popełni błąd to może go skorygować? Jeśli tak to jest tak dlatego że catch łapie niezależnie z którego gracza ten wyjątek a następnie ponownie uruchamiana jest pętla

W sprawie głównego błędu to spróbuj sobie po zaczytaniu metodą getPoint() wypisać ten punkt + w metodzie put wypisać czy dostaje dobre współrzędne, bo tak na oko nic nie widzę.

W wyjątku rzeczywiście było tak jak mówisz, ale nie wiem jak to poprawić.
Próbowałem tak:

while (!p.isFull()) {
			// GraczA.getPoint();
			// GraczB.getPoint();
			try
			{

				System.out.println("" + imieA + " , wprowadz X: ");
				int wierszA = scanner.nextInt();
				System.out.println("" + imieA + " , wprowadz Y: ");
				int kolumnaA = scanner.nextInt();
				p.putX(wierszA, kolumnaA);
				
			}
			catch (PlanszaJestPelnaException pjpe)

			{
				System.out.println("Plansza jest pelna!!" + pjpe);
			}

			catch (WspolrzednePozaPlanszaException zppe)

			{
				System.out.println("Postawiles znak poza plansza!!" + zppe
						+ ", zly X=" + zppe.getBadX() + ", zly Y="
						+ zppe.getBadY());
			}
			System.out.println(p);

			if (gv.isPlayerAWinner() == true) {
				System.out.println("wygrałeś!");
				break;
			}

			try 
			{
				System.out.println("" + imieB + " , wprowadz X: ");
				int wierszB = scanner.nextInt();
				System.out.println("" + imieB + " , wprowadz Y: ");
				int kolumnaB = scanner.nextInt();
				p.putO(wierszB, kolumnaB);
			}

			catch (PlanszaJestPelnaException pjpe)

			{
				System.out.println("Plansza jest pelna!!" + pjpe);
			}

			catch (WspolrzednePozaPlanszaException zppe)

			{
				System.out.println("Postawiles znak poza plansza!!" + zppe
						+ ", zly X=" + zppe.getBadX() + ", zly Y="
						+ zppe.getBadY());
			}

			System.out.println(p);

			if (gv.isPlayerBWinner() == true) {
				System.out.println("wygrałeś!");
				break;
			}

		}

Ale w efekcie w ogóle nie działa.

Co do punktu, taki kod:

Point punktA = GraczA.getPoint();
Point punktB = GraczB.getPoint();
System.out.println("punkt:" + punktA);
System.out.println("punkt:" + punktB);
System.out.println(p);

Daje w efekcie:

punkt:java.awt.Point[x=0,y=0]
punkt:java.awt.Point[x=1,y=1]
wiersz1: ---
wiersz2: ---
wiersz3: --- 

Czyli punkty wypisuje poprawnie, wg wprowadzanych danych, ale do planszy ich nie zapisuje.

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