Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Soutěž: Machr na OOP - Prší

Soutěž již skončila

Zadání

Vašim úkolem bude, naprogramovat s využitím principů objektově orientovaného programování počítačovou verzi karetní hry prší. Využijeme pravidla z wikipedie (<a href="https:/­/cs.wikipedia­.org/wiki/Pr%C5%A1%­C3%AD">odkaz</a>) a to pouze klasickou hru, takže si přečtěte odstavce Průběh hry a Speciální karty. Aplikaci dělejte pro více hráčů (ono to ani jinak hrát nejde). Na začátku zadám počet hráčů, pak zadám jméno každého z nich a pak začne hra. Podle pravidel hra vybere náhodného hráče, který začne. V každém tahu každého hráče, vymažete konzoli a vypíšete kolik karet má každý hráč (v reálné hře prostě vidíte, že Franta má už jen jednu kartu a bylo by vhodné mu tam přihodit sedmičku), volitelně vypíšete i 5 následujících, kteří jsou další v pořadí.

Následující: Franta > Josef > Anička > Antonín > Jarka

Pak vypíšete kartu na balíčku. Pokud není přímo číslo karty (po měnění svrškem), tak jen barvu.

Následně vypíšete možnosti tahu. Tzn., že vypíšete všechny možnosti, které očíslujete, a uživatel zadá číslo volby, kterou si přeje provést. Příklad výstupu tahu:

Stav karet ostatních hráčů:
David: 5
Honza: 8
Karel: 2
Franta: 5

Hraje: Franta
Následuje: Michal > David > Honza > Karel > Franta

Přikládáš na: ♥K

Možnosti tahu:
0) líznout si
1) ♦K
   ♦64
2) ♥8
   ♠A
Tvá volba [0-2]: _

Z předchozí ukázka jste asi pochopili, že můžete používat unicode symboly ♠♣♥♦.

Aplikaci můžete vyřešit i s použitím GUI, záleží na Vás. V případě využití GUI je reprezentace hry na Vás a nemusíte se striktně řídit výše uvedenými formáty.

Pro tohoto machra můžete využít pouze jazyka C# a nesmíte využít již hotových řešení. Při odevzdávání odevzdávejte celý projekt, včetně řešení (.sln souboru). Nezapomeňte, že se jedná o machra na OOP. To znamená, že nemusíte vyřešit úplně všechno, ale hlavní je, aby to bylo dobře navrženo. Pro výhru nemusíte splnit všechno, většina bodů bude udělena za dodržení zásad OOP a zásad psaní „čistého kódu“.

Výhra

Vítěz dostane placku Machr, pár samolepek a ocenění do portfolia.

Výhra

Výsledky

Jméno bodů Řešení ( Stáhnout vše )
Bratr 63 Stáhnout řešení
magic44 59 Stáhnout řešení
Patrik Valkovič 53 Stáhnout řešení
Princ57 47 Stáhnout řešení
Aktivity
Avatar
D0ll0k
Člen
Avatar
Odpovídá na Patrik Valkovič
D0ll0k:12.7.2015 20:30

Tak to pak jo. Já myslel, že jsi vytvořil 70 tříd :D.

Odpovědět
12.7.2015 20:30
Veni, vidi, programmato
Avatar
NouF
Člen
Avatar
Odpovídá na David Hartinger
NouF:13.7.2015 2:47

Ty jsi už celkem naštvaný co? Ty by jsi měl fungovat jako motor pro ostatní. Motor dobré nálady, bez dobré nálady to tu můžeš zavřít :) A hlavně nezavítej.

 
Nahoru Odpovědět
13.7.2015 2:47
Avatar
D0ll0k
Člen
Avatar
D0ll0k:19.7.2015 13:46

Do háje! Já si smazal celý projekt :-(

Nahoru Odpovědět
19.7.2015 13:46
Veni, vidi, programmato
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na D0ll0k
David Novák:19.7.2015 13:48

Pro příště používej nějaký Dropbox.. Nebo ideálně git (ale ten je trochu náročnější)..

Kromě zálohy budeš mít i jednotlivé verze ;)

Nahoru Odpovědět
19.7.2015 13:48
Chyba je mezi klávesnicí a židlí.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na D0ll0k
Jan Vargovský:19.7.2015 13:49

VS má určitě někde backup.

 
Nahoru Odpovědět
19.7.2015 13:49
Avatar
D0ll0k
Člen
Avatar
Odpovídá na David Novák
D0ll0k:19.7.2015 13:50

Já ho měl v záloze, jenže byl společně s projektem v jedné složce, kterou jsem smazal, když jsem si potřeboval uvolnit místo na disku.

Nahoru Odpovědět
19.7.2015 13:50
Veni, vidi, programmato
Avatar
D0ll0k
Člen
Avatar
Odpovídá na Jan Vargovský
D0ll0k:19.7.2015 13:52

Díky podívám se.

Nahoru Odpovědět
19.7.2015 13:52
Veni, vidi, programmato
Avatar
D0ll0k
Člen
Avatar
D0ll0k:19.7.2015 14:01

Tak nic, nevadí. Pro příště použiju dropbox.

Nahoru Odpovědět
19.7.2015 14:01
Veni, vidi, programmato
Avatar
Odpovídá na D0ll0k
Neaktivní uživatel:19.7.2015 14:04

Pre budúcnosť sa nauč nejaký cvs (git) napríklad, bez toho sa proste v praxi nerobí nič. Ďalšia vec sú kvalitné zálohy, buď lokálne alebo cloud. VS by mal mať zálohy, treba pogooglit, pripadne existujú programy, ktoré dokážu obnoviť zmazané súbory. :) (napríklad recuva)

Nahoru Odpovědět
19.7.2015 14:04
Neaktivní uživatelský účet
Avatar
Insane Qurd
Tvůrce
Avatar
Insane Qurd:19.7.2015 14:08

Ahoj, omlouvám se, ale nestihl jsem to uploadovat, jelikož jsem neměl ještě nainstalovaný WinZip, chápu, že je to moje chyba, ale jinak bych to stihl, pokud byste to ještě pár sekund po konci uznali, přidávám soubor.

https://www.dropbox.com/…/mau-mau.zip?dl=0

Nahoru Odpovědět
19.7.2015 14:08
It's impossible to say it's impossible.
Avatar
Michal Žůrek - misaz:19.7.2015 14:17

Začínám hodnotit, už se těším jak si vaše aplikace obstojí s bodem:

Třída Karta je připravena k implementaci do hry Solitaire

:)
 
Nahoru Odpovědět
19.7.2015 14:17
Avatar
Insane Qurd
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Insane Qurd:19.7.2015 14:23

Něco tam, ale taky nemám... :( Aspoň, že to je objektově :D

Editováno 19.7.2015 14:24
Nahoru Odpovědět
19.7.2015 14:23
It's impossible to say it's impossible.
Avatar
Michal Žůrek - misaz:19.7.2015 18:08

Díky všem za účast, zde jsou výsledky:

Bratr - 63 bodů
Tvé řešení má dobře navrženou většinu tříd i přesto to má par much. V třídě karta máš read-only vlastnost oznaceni. Dobře je že zápis informací o sobě se obstarává nějak inteligentně v třídě a zároveň mimo hlavní logiku, ale neřeší se to read-only vlastností ale přepsáním metody ToString. Výhodou pak je, že služby, které očekávají nějaký inteligentní popis, budou používat právě ten ToString, zkus si vložit instanci té třídy do okna Watch při ladění aplikace a uvidíš, že se do popisku bude používat právě ToString, což usnadní procházení různých věcí, když je jich více – třeba když chceš nahlížet do balíčku karet, ti ten náhled z ToString usnadní spoustu práce s rozklinkáváním jednotlivých karet.

Trošku divné je, že o porovnávání karet se stará balíček. Správně by to měla být záležitost karet a ideálně přetíženého operátoru.

Moc ani nevidím význam attributu puvodniKarty v třídě balíčku. Balíček by měl možnost mít přeci si kdykoliv všechny karty doplnit znova sám, tak jak to dělá konstruktor. Resp. On by to ani neměl dělat konstrutkor, ale metoda, kterou bude konstruktor volat.

Hodně se mi líbilo označování stavu hry, informace o esu, měnění, nuceného lízání, atd.

Co se mi ale vůbec nelíbí je metoda VyberModifikator v třídě karty. Má to dvě mouchy. První je switch. Switch by se v objektové aplikaci používat neměl. Lze to vyřešit tak, že hře dáš nějaké pole pouzijModifikatory a každá karty modifikátory projde, modifikátor si řekne, jestli je ten vhodný pro danou kartu. Tzn, že modifikátory budou mít např. metodu JsemVhody, která vrací bool, jako parametr bude brát kartu a v obsahu bude podmínky if (karta.cislo == 7), tak vrátí true, naopak false (ono se dá napsat i single-line). Výhodu to bude mít v okamžiku, kdy modifikátoru bud více a budeš je chtít třeba vypínat nebo zapínat. Idea je taková, že kdybych chtěl naimplementovat ♠K, tak teď budu muset nejen vytvořit ten modifikátor, ale upravovat i ten switch, což je špatně. Tím se dostávám k druhé mouše a to že kvůli té metody se třída Karty v podstatě stává závislou na hře prší. V okamžiku kdy bych ji chtěl použit v jiné hře, opět musím zasahovat do toho switche, což je špatně.

I přes drobné chybky v kódu ti hra funguje velmi dobře.

magic44 - 59 bodů
Jako jednoho z mála tě napadlo, že když děláš hru, tak ten nejpodstatnější objekt bude asi samotný Game. Nicméně v samotné třídě Game pak jsou drobné „divnosti“. Možná ještě než začnu tím, že tě upozorním na délku řádku. Třeba řádek 50 (v souboru Game.cs) se mi ani za normálních okolností nevlez do okna Visual Studia na Full HD monitoru. Existuje doporučení, že řádek kódu by neměl přesáhnout 80 znaků. Nemusíš to dodržovat striktně, ale přeci jen řádek 50 má 234 znaků, tak by to chtělo trochu zredukovat. Kód by to chtělo taky trochu komentovat, vůbec netuším, k čemu tam jsou konstanty VALUE_OF_SEVEN, VALUE_OF_EMPTY_CAR­D. Pak jsem se taky pozastavil nad typy některých proměnných, proč je hráč celé číslo? Sem tam mícháš do angličtiny češtinu. Většina kódu je v angličtině a pak se tam objeví proměnná typKaret (správně cardsType).

Samotná hra by také neměla přímo komunikovat s uživatelem, obecně celé Questions.GetIn­stance().Answe­rInRange je špatně. Metody mají parametry a komunikovat s uživatelem má něco co to všechno obsluhuje. Pokud bych chtěl spustit hru na serveru, narazím u toho na dost závažný problém, který to víceméně znemožní.

Chválím, že informace o kartě vracíš přes přepsané ToString. Místo equals šel přetížit operátor, ale to už je jen drobnost.

Velmi dobře je navržen balíček, se kterým jsem neměl sebemenší problém, sice i zde by mu neuškodil komentář nad metodami a vysvětlení konstanty COUNT_OF_COLORS. Nicméně skutečně implementace napodobuje reálný balíček. Jako jeden z mála jsi balíček skutečně zamíchal.

Vůbec se mi nelíbí rozpoznávání speciálních karet. Switch by se neměl používat, protože jakákoliv změna v speciální kartě víceméně musí zasahovat i do switche a to je špatně. Podívej se na řešení od SilverFox, který má toto pěkně vyřešené.
Hra ti fungovala velmi, dobře, v této části si neztratil jediný bod.

Patrik Valkovič - 53 bodů
Řešil jsi to strašně robustně, napomáhají to mu i testy, což je samozřejmě dobře. Nicméně kolem jednoduché hry je toho strašně moc okolo, úplně zbytečně.

Neprogramovali jsme komplexní IS, ale jednoduché prší. Ale máš to vymyšlené do detailu, kdybych hru nasadil na síti, heslo by se hráči určitě hodilo.

Trošku problém je u znuvupoužitelnosti některých objektů, třeba karty, která je vázaná na stav karty a ten je enumerace, která obsahu prší-specifické stavy, což v jiných hrách může být dost problém.

Tvůj kód obsahuje zbytečně moc všeho, všechno má úplně zbytečně rozhraní. Je to sice pěkné, ale orientace v kódu je na bodu mrazu, v hodnotících kritériích mám věci, které bych bez Visual Studia a nástrojů jako Go to Definition, Find all references a podobných prostě nenašel.

Hra ti celkem funguje, ♠K si ani nemusel implementovat, máš za to bonusové body. Na druhou stranu zase mělo fungovat vkládání Q na libovolnou „barvu“, takže tam si je zase ztratil.

Princ57 - 47 bodů
Tvůj kód je už na první pohled moc roztahaný. Metoda ChooseStartin­gPlayer má za sebou komentář, který říká, že dělá něco jiného než její název tvrdí. Karty skutečně mícháš, což je dobře.

Dobré je, že hru lze spustit na jedno volání, trochu horší je, že hra si díky toho musí sama vypisovat informace do konzole. Pokud bych hru chtěl spustit třeba po síti, byl by to problém.

Super je, že v kódu nikde nepoužíváš switch.

Hra ti funguje dobře, až na to že měnit dámou lze na libovolné kartě.

Neaktivní uživatel - 23 bodů

Začni tím, že to rozdělíš do více tříd, třeba karta, Balíček karet atd…. Hra ti funguje tak na půl slova, kód je všechen v jednom souboru (o 450 řádcích) a ještě jsi to ani nestihl odevzdat v termínu.

Placku tedy získává SilverFox. Gratuluji :)

Editováno 19.7.2015 18:09
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
19.7.2015 18:08
Avatar
Michal Žůrek - misaz:19.7.2015 18:16

Pro informaci: Interně jste mohli získat 680 bodů, což se přepočítalo trojčlenkou na 100 bodové maximum.

OOP                     51 bodů
Přehlednost kódu        6 bodů
Funkčnost aplikace      34 bodů
Bonusové body           9 bodů

Uživatelské rozhraní nedělal nikdo, ale kdyby ho někdo udělal, tak za to dostal maximálně 2,9 bodů, které by byli započteny v bonusových.

 
Nahoru Odpovědět
19.7.2015 18:16
Avatar
Odpovídá na Michal Žůrek - misaz
Patrik Valkovič:19.7.2015 19:15

Nechceš i ukázat jednotlivé body, podle kterých jsi hodnotil? ;-)

Editováno 19.7.2015 19:15
Nahoru Odpovědět
19.7.2015 19:15
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jan Lupčík
Tvůrce
Avatar
Nahoru Odpovědět
19.7.2015 19:20
TruckersMP vývojář
Avatar
 
Nahoru Odpovědět
19.7.2015 19:21
Avatar
Odpovídá na Michal Žůrek - misaz
Neaktivní uživatel:19.7.2015 19:25

Já se lekl co jsem provedl. :D

Nahoru Odpovědět
19.7.2015 19:25
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:20.7.2015 1:05

Gratulace Bratr :)

Michal Žůrek - misaz: dá se tohle počítat jako uživatelský prostředí? Jen ze zvědavosti :) jinak já se neúčastnil jelikož jsem to nedokázal uvést do hratelnýho stavu... :/

btw: SilverFox měl myslim taky míchání balíčku a jestli ne tak sorry ale řikal jsem mu to :D :D

Nahoru Odpovědět
20.7.2015 1:05
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Žůrek - misaz:20.7.2015 11:37

za GUI se to moc považovat nedá, protože to nemá prvky GUI. Když už děláš GUI, tak by to chtělo třeba pěkně graficky vykreslit kartu a to se ti v konzoli asi moc dobře nepovede.

 
Nahoru Odpovědět
20.7.2015 11:37
Avatar
Matěj Černý
Tvůrce
Avatar
Matěj Černý:6.5.2019 22:18

Ahoj, koukám, že sem už několik let nikdo nenapsal, ale stejně napíšu. Jen tak pro cvik jsem si zkusil prší napsat taky, ale řeším jeden problém.
No problém - jde spíš o malichernost.
Potřebuji, aby mi konzole zobrazovala symboly ♠♣♥♦. Zobrazují se mi pouze otazníky.
Díky za jakoukoliv radu

Nahoru Odpovědět
6.5.2019 22:18
Žádný strach, jsem programátor. Věř mi ;-)
Avatar
krepsy3
Tvůrce
Avatar
Odpovídá na Matěj Černý
krepsy3:6.5.2019 22:40

Pravým myšítkem kliknout na horní lištu okna konzole -> vlastnosti -> písmo -> vybrat nějaký font, ve kterém znaky jsou :)

Nahoru Odpovědět
6.5.2019 22:40
Programátor je stroj k převodu kávy na kód.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 23 zpráv z 73.