• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kółko i Krzyżyk-klasyka do dopieszczenia.

Object Storage Arubacloud
0 głosów
180 wizyt
pytanie zadane 16 września 2018 w Java przez Adam Polak Początkujący (430 p.)

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();
            }
        }

    }


}

 

2 odpowiedzi

0 głosów
odpowiedź 16 września 2018 przez Wiciorny Ekspert (270,110 p.)
SOLID... przejmowanie się w tak małym projekcie to jest troche słaba spraw zresztą nie zawsze da się tego trzymac bo projekt tak prosty jak kółko i krzyżyk nie zawiera aż tylu skomplikowanych operacji, modelowania danych żeby SOLID W pełni zaimplementować.

O SOLID piszesz, a nie zachowałeś najważniejszej rzeczy ...

- nazewnictwa [ własnie po Polsku ]

- jedne funkcje masz po Polsku drugie po ang... masakra

- piszemy kod  PODSTAWOWA SPRAWA : IMPERATYWNIE istotne jest co kod robi CO METODA ROBI, a nie co się dzieje, lub jaka akcja się wykonuje.
1
komentarz 17 września 2018 przez Aisekai Nałogowiec (42,190 p.)

Rozwiń mysl.  

piszemy kod  PODSTAWOWA SPRAWA : IMPERATYWNIE

Bo możliwe że  coś zle zrozumiałem.  

1
komentarz 17 września 2018 przez mbabane Szeryf (79,280 p.)

O SOLID piszesz, a nie zachowałeś najważniejszej rzeczy ... 

- nazewnictwa [ własnie po Polsku ]

- jedne funkcje masz po Polsku drugie po ang... masakra

Czy na pewno zasady solid mówią o tym jak nazywać rzeczy? Nazewnictwo (samo z siebie) według mnie nie ma nic wspólnego z solid.

SOLID... przejmowanie się w tak małym projekcie to jest troche słaba spraw 

Czyli lepiej się tego uczyć na kobyle składającej się z tysięcy klas? 

komentarz 17 września 2018 przez Aisekai Nałogowiec (42,190 p.)
Nazewnictwo i Solid maja trochę wspólnego, bowiem oba z nich wpływają na czystość kodu, ale tak - zgadzam się z tym co napisales.
0 głosów
odpowiedź 16 września 2018 przez Tomasz Rogalski Bywalec (2,800 p.)
Package w Javie tylko z małych liter.

Podobne pytania

+4 głosów
1 odpowiedź 2,272 wizyt
0 głosów
1 odpowiedź 835 wizyt

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...