Kółko i krzyżyk - wasze opinie/uwagi pod kątem obiektowości

Własne projekty oraz implementacje.

Moderator: xxSlayeRxx

Re: Kółko i krzyżyk - wasze opinie/uwagi pod kątem obiektowo

Sponsor

Sponsor
 

Re: Kółko i krzyżyk - wasze opinie/uwagi pod kątem obiektowo

Postprzez XardasLord » Pn lis 04, 2013 11:42 pm

Wielkie dzięki za swoje kolejne spostrzeżenia i uwagi co do mojego kodu :) Zastosowałem się do nich i kod wygląda teraz o wiele przyjaźniej. Oddzieliłem także metody używające WriteLine od logiki.

Mam pytanie. Nie mam pojęcia jak mogę zastąpić inaczej odróżnianie gry vsPlayer od vsComputer... Bo teraz ciągle służy mi do tego ten if:
Kod: Zaznacz cały
if (player is HumanPlayer)


Efekt końcowy projektu wygląda następująco:
Załączniki
Kolko i krzyzyk ver. 1.2.zip
(72.22 KiB) Pobrane 169 razy
XardasLord
Member
 
Posty: 14
Dołączył(a): Pt lis 01, 2013 1:48 pm

Re: Kółko i krzyżyk - wasze opinie/uwagi pod kątem obiektowo

Postprzez xxSlayeRxx » Wt lis 05, 2013 5:09 am

zapytam sie tak:
po c...o Ci: if player is human
skopales to i to strasznie, po co masz dziedziczenie, skoro nie uzywasz? Zobacz teraz jak wyglada play()... nie obchodzi mnie czy player jest kompem, czy humanem

Kod: Zaznacz cały
using System;

namespace Kolko_i_krzyzyk
{
    internal class Game
    {
        private static readonly ShowData showdata = new ShowData(); //dodalem static, aby uzyc tego w konstruktorze... inaczej to powinienes zaplanowac
        private readonly Player _player1;
        private readonly Player _player2;
        private readonly Map map = new Map();
        private int possition;

        public Game() : this(new ComputerPlayer('X', "Comp1"), new ComputerPlayer('O', "comp2"))
        {
        }

        public Game(Player player2) : this(new HumanPlayer('X', showdata.GetPlayer1Name()), player2)
        {
        }

        public Game(Player player1, Player player2)
        {
            _player1 = player1;
            _player2 = player2;
        }


        public void Play()
        {
            Console.Clear();
            showdata.DrawMap(map);

            // GŁÓWNA PĘTLA GRY
            /* Zobacz jak miales wczesniej, zeby dodac komp vs komp bys musial znowu dodawac pelno ifow,
             * teraz jak zrobisz easycompplayer, mediumcompplayer, hard, wystarczy dodac  w Consoleapp new game(new human, new hard) i bedzie dzialac,
             * a tak bys musiall znowumiliard ifow dodawac
             *
             * Na tym polega dziedziczenie
             * a i kod zrobil sie mniejszy :D
             */
            do
            {
                if (PlayPlayer(_player1))
                    break;

                if (PlayPlayer(_player2))
                    break;
            } while (true);
        }


        private bool PlayPlayer(Player player) // skoro masz to jako pola to po co powtarzac tak samo, nie uzywasz nigdzie to private
        {
            possition = player.GetField(map);
            map.PutSign(possition, player.Sign);
            Console.Clear();
            showdata.DrawMap(map);

            if (map.CheckWin(player.Sign))
            {
                showdata.WinMessage(player.Name);
                return true;
            }
            if (map.CheckDraw())
            {
                showdata.DrawMessage();
                return true;
            }
            return false;
        }
    }
}


troche Ci zmienilem klase game... zeby uzywala dziedziczenia jak nalezy, reszte zostawiam Tobie... powinienes wiedziec jak uzywac dziedziczenia (podpowiedz musialem tez zmienic consoleapp - zeby kompa dobrze odczytywalo)... swoja droga human i comp powinny miec domyslna nazwe, oraz setter nazwy powinien byc publiczny


to co teraz masz trudno bedzie Ci przeniesc na okienka (wiekszosc bys musial przepisac na nowo), bo sie uzalezniles od konsoli


kolejne... po co (w player) name i sign jest abstrakcyjne? sign powinno byc typu enum -> X,Y,Empty i w innej klasie generujesz wyswietlenie (pobierajac sign)
a name jak w kazdym graczu, wiec tez powinno byc tam ustawione, to ze klasa jest abstrakcyjna, nie znaczy, ze wszystko musi byc abstrakcyjne
xxSlayeRxx
Member
 
Posty: 661
Dołączył(a): Pt lip 08, 2011 10:24 pm

Re: Kółko i krzyżyk - wasze opinie/uwagi pod kątem obiektowo

Postprzez DariuszR » Wt lis 05, 2013 10:57 am

I znowu jakaś niezgodność z SRP, konkretniej klasa ShowData (dotyczy ostatniej wersji którą tu udostępniłeś w poście). Klasa służy do wyświetlania danych (i słusznie :) ), z drugiej strony nie wiedzieć czemu służy jeszcze do pobierania danych z klawiatury. Może by zastosować jeszcze jedną klasę do pobierania tych danych (chodzi mi o imię graczy)?
DariuszR
Member
 
Posty: 43
Dołączył(a): So paź 05, 2013 3:38 pm

Re: Kółko i krzyżyk - wasze opinie/uwagi pod kątem obiektowo

Sponsors

Sponsor
 

Poprzednia strona

Powrót do Projekty i kody źródłowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość