Kłaniam się,
Napisałem chyba jeden z bardziej oklepanych programów czyli kółko i krzyżyk. Zapewne jest tego mnóstwo na necie ale pomyślałem, że będzie to dobra okazja żeby poćwiczyć obiektowość. Dlatego byłbym bardzo wdzięczny gdyby ktoś rzucił okiem na mój kod i powiedział czy to w ogóle koło obiektowości stało, jak tak to co jeszcze poprawić a jak nie to co konkretnie jest nie tak i też drobne wskazówki jak to naprawić.
Małe wprowadzanie, program składa się interfejsu gracz oraz implementującej go klasy, tak samo z interfejsem plansza, do tego klasy sędzia i gra. Gracz ma za zadanie stworzenie 2 graczy, każdy mam imię i znak do tego metodę do wybrania miejsca na planszy na planszy.
Obiekt planszy drukuje plansze oraz przyjmuje od gracza pole oraz stawia znak od gracza na planszy.
Sędzia sprawdza czy doszło do wygranej, czy ruch jest poprawny oraz sprawdza dostępne wolne pola.
Obiekt gry pilnuję kiedy rozgrywka ma się skończyć.
Tak jak pisałem, byłbym bardzo wdzięczny gdyby ktoś mógł spojrzeć na to krytycznie i ocenić kod oraz jego obiektowe aspekty(albo ich ewentualne braki...).
PS Na starcie już mogę przeprosić za to, że nazwy nie są po angielsku;(
PPS Domyslam sie ze SOLID zostal zgwalcony kilka razy, bardzo sie uciesze jak ktoś rzuci mi w twarz gdzie.
package TicTacToe.plansza;
import TicTacToe.gracz.Gracz;
public interface Plansza {
void drukujPlansze();
void postawZnakGracza(Gracz zawodnik);
String[][] getTablicaDoGry();
}
package TicTacToe.plansza;
import TicTacToe.gracz.Gracz;
public class PlanszaDoGry implements Plansza {
private String[][] tablicaDoGry = {{"-", "-", "-"}, {"-", "-", "-"}, {"-", "-", "-"}};
public void drukujPlansze() {
for (int i = 0; i < this.tablicaDoGry.length; i++) {
if (i == 0)
System.out.print(" " + (i + 1));
else
System.out.print(" " + (i + 1));
}
System.out.println();
for (int i = 0; i < this.tablicaDoGry.length; i++) {
System.out.print((char) ('A' + i));
for (int j = 0; j < this.tablicaDoGry.length; j++) {
System.out.print(" | " + (this.tablicaDoGry[i][j]));
}
System.out.print(" | ");
System.out.println();
System.out.println();
}
}
public void postawZnakGracza(Gracz zawodnik) {
tablicaDoGry[zawodnik.getZaznaczonePole()[0]][zawodnik.getZaznaczonePole()[1]] = zawodnik.getZnak();
}
public String[][] getTablicaDoGry() {
return tablicaDoGry;
}
public void setTablicaDoGry(String[][] tablicaDoGry) {
this.tablicaDoGry = tablicaDoGry;
}
}
package TicTacToe.gracz;
public interface Gracz {
void wykonajRuch(String pole);
public String getNazwaGracza();
public String getZnak();
public int[] getZaznaczonePole();
}
package TicTacToe.gracz;
import TicTacToe.gracz.Gracz;
import java.util.Scanner;
public class Zawodnik implements Gracz {
private String nazwaGracza;
private String znak;
private int[] zaznaczonePole;
public void wykonajRuch(String pole) {
this.zaznaczonePole = new int[2];
Integer wspolrzednaA = 0;
Integer wspolrzednaB;
String[] split = pole.split("");
if (split[0].equalsIgnoreCase("A")) {
wspolrzednaA = 0;
} else if (split[0].equalsIgnoreCase("B")) {
wspolrzednaA = 1;
} else if (split[0].equalsIgnoreCase("C")) {
wspolrzednaA = 2;
}
wspolrzednaB = new Integer(split[1]);
zaznaczonePole[0] = wspolrzednaA;
zaznaczonePole[1] = wspolrzednaB - 1;
}
public Zawodnik(String nazwaGracza, String znak) {
this.nazwaGracza = nazwaGracza;
this.znak = znak;
}
public String getNazwaGracza() {
return nazwaGracza;
}
public void setNazwaGracza(String nazwaGracza) {
this.nazwaGracza = nazwaGracza;
}
public String getZnak() {
return znak;
}
public void setZnak(String znak) {
this.znak = znak;
}
public int[] getZaznaczonePole() {
return zaznaczonePole;
}
public void setZaznaczonePole(int[] zaznaczonePole) {
this.zaznaczonePole = zaznaczonePole;
}
}
package TicTacToe;
import TicTacToe.gracz.Gracz;
import TicTacToe.plansza.Plansza;
import TicTacToe.plansza.PlanszaDoGry;
public class Sedzia {
private Plansza plansza;
private boolean wygrana;
private boolean czyRuchJestPoprawny;
public Sedzia(Plansza plansza) {
this.plansza = plansza;
}
public void czyWygralPoziom(Gracz gracz){
String[][]tablica=plansza.getTablicaDoGry();
String znakGracza=gracz.getZnak();
if(tablica[0][0].equalsIgnoreCase(znakGracza)&&tablica[0][1].equalsIgnoreCase(znakGracza)
&&tablica[0][2].equalsIgnoreCase(znakGracza)){
this.wygrana=true;
}else if(tablica[1][0].equalsIgnoreCase(znakGracza)&&tablica[1][1].equalsIgnoreCase(znakGracza)
&&tablica[1][2].equalsIgnoreCase(znakGracza)){
this.wygrana=true;
}else if(tablica[2][0].equalsIgnoreCase(znakGracza)&&tablica[2][1].equalsIgnoreCase(znakGracza)
&&tablica[2][2].equalsIgnoreCase(znakGracza)){
this.wygrana=true;
}
}
public void czyWygralPion(Gracz gracz){
String[][]tablica=plansza.getTablicaDoGry();
String znakGracza=gracz.getZnak();
if(tablica[0][0].equalsIgnoreCase(znakGracza)&&tablica[1][0].equalsIgnoreCase(znakGracza)
&&tablica[2][0].equalsIgnoreCase(znakGracza)){
this.wygrana=true;
}else if(tablica[0][1].equalsIgnoreCase(znakGracza)&&tablica[1][1].equalsIgnoreCase(znakGracza)
&&tablica[2][1].equalsIgnoreCase(znakGracza)){
this.wygrana=true;
}else if(tablica[0][2].equalsIgnoreCase(znakGracza)&&tablica[1][2].equalsIgnoreCase(znakGracza)
&&tablica[2][2].equalsIgnoreCase(znakGracza)){
this.wygrana=true;
}
}
public void czyWygralaPrzekatna(Gracz gracz){
String znakGracza=gracz.getZnak();
String[][]tablica=plansza.getTablicaDoGry();
if(tablica[0][2].equalsIgnoreCase(znakGracza)&&tablica[1][1].equalsIgnoreCase(znakGracza)
&&tablica[2][0].equalsIgnoreCase(znakGracza)){
this.wygrana=true;
}else if(tablica[0][0].equalsIgnoreCase(znakGracza)&&tablica[1][1].equalsIgnoreCase(znakGracza)
&&tablica[2][2].equalsIgnoreCase(znakGracza)){
this.wygrana=true;
}
}
public String wyswietlWolnePola(){
String[][] tab=plansza.getTablicaDoGry();
String wolnePola="";
StringBuilder sB = new StringBuilder(wolnePola);
for (int i = 0; i <tab.length ; i++) {
for (int j = 0; j <tab.length ; j++) {
if(tab[i][j].equalsIgnoreCase("-")){
sB.append((char)('A' + i)+""+(j+1)+" ");
}
}
}
wolnePola=sB.toString();
return wolnePola;
}
public void czyPoleJestWolne(Gracz gracz){
String [][] tablica=plansza.getTablicaDoGry();
int[] pole=gracz.getZaznaczonePole();
if(!tablica[pole[0]][pole[1]].equalsIgnoreCase("-")){
czyRuchJestPoprawny= false;
}else
czyRuchJestPoprawny= true;
}
public boolean isWygrana() {
return wygrana;
}
public boolean isCzyRuchJestPoprawny() {
return czyRuchJestPoprawny;
}
}
package TicTacToe;
import TicTacToe.gracz.Gracz;
import TicTacToe.plansza.Plansza;
import java.util.Scanner;
public class Gra {
private boolean tura;
private String poleOdGracza;
private Gracz gracz1;
private Gracz gracz2;
private Plansza plansza;
private Sedzia sedzia;
public Gra(Gracz gracz1, Gracz gracz2, Plansza plansza, Sedzia sedzia) {
this.gracz1 = gracz1;
this.gracz2 = gracz2;
this.plansza = plansza;
this.sedzia = sedzia;
}
public void pobranieOdGraczaPola() {
Scanner scan = new Scanner(System.in);
System.out.println("Podaj pole do zaznaczenia, dostepne pola to: " + sedzia.wyswietlWolnePola());
System.out.print("Wybrane Pole: ");
poleOdGracza = scan.next();
}
public void keepGoing() {
Gracz gracz;
while (!sedzia.isWygrana()) {
if (tura) {
gracz = gracz2;
} else gracz = gracz1;
plansza.drukujPlansze();
pobranieOdGraczaPola();
gracz.wykonajRuch(poleOdGracza);
sedzia.czyPoleJestWolne(gracz);
if (sedzia.isCzyRuchJestPoprawny()) {
plansza.postawZnakGracza(gracz);
sedzia.czyWygralaPrzekatna(gracz);
sedzia.czyWygralPion(gracz);
sedzia.czyWygralPoziom(gracz);
tura = !tura;
} else {
System.out.println("TO POLE JEST ZAJETE!");
System.out.println("TO POLE JEST ZAJETE!");
System.out.println("TO POLE JEST ZAJETE!");
System.out.println();
}
}
}
}