Tapasztalattal rendelkező ember megnézné az egyik kezdetleges programom és véleményezné? (c#)
Még csak konzolban csinálok mindent, egyenlőre form-ban nem, viszont írtam egy kő papír olló játékot és kíváncsi lennék a véleményére és építő kritikájára.
Privátban elküldöm a kódot.
„az i csökkentésének jelentőségére...”
Ja, bocs, már értem a szándékot, csak a megoldás nem a legszerencsésebb.
Szia, köszönöm a segítséget, a switches része tényleg nem a legszerencsésebb. Tudom már,hogy ezt jóval kevesebb kódból is meg lehetne írni, csak jelenleg még ezzel is aránylag sok időt töltöttem, például, hogy a bemenet sorát mindig törölje miután a számot beírtuk, vagy amikor nem az int tartományban van a megadott karakter akkor se fagyjon ki, hanem csak újra meg kelljen adni a számot.
Köszönöm mégegyszer.
Na jó, ezek szerint már nem vagy fent, én meg holnap nem leszek egész nap. Ha gondolod, itt megnézheted:
Két megjegyzés:
1. Nem vagyok benne biztos, hogy minden using kell-e, de nem tudom, hogy az én fordítóm beállításai nem kavarhatnak-e be valahogy, úgyhogy inkább nem piszkáltam őket.
2. A szövegpozícionálással nem foglalkoztam, ezeket a sorokat kihagytam a programból, csak egy törlést tettem az elejére, egyébként egymás alá ír mindent.
Én is összeraktam gyorsan egy példát:
főként a függvények használatára mutatok benne példákat, hogy hogyan lehet ismétlődő tevékenységeket velük végezni, illetve hogyan lehet részekre bontani a programot.
(Tabaki kollegához hasonlóan nekem sem elsődleges nyelvem a C#, ráadásul késő éjszaka is van ;) )
Én is beszállok a code review-ba :) (A végén karácsonyi ajándkba megkapod az eremdényt) Amit leírok, az annak a folyamatnak a dokumentációja, hogy hogyan álltam neki a feladatnak.
A kódod mostani állapot, mondjuk úgy, nem túl szervezett. A legszembetűnőbb, hogy a játék kiértékelését háromszor egymás után lemásoltad. Ez nagyon nagy hiba, ennek a javításával kell kezdened.
Első lépésnek kiválasztanám az egyik "if (bement ==" törzsét, és csinálnék belőle egy metódust. Szerencsére a Visual Studio (2017) segít ebben (Kijelölöd a kapcsos zárójelek közötti részt, nyomsz egy CTRL + '.' (pont)-ot, és azt mondod, hogy "Extract Method..." Az új metódusnak adsz valami értelmes nevet (lehetőleg angol nevet - a kódban legyen mindennek angol neve, kivéve, ha tanár mást kér. De saját kódban akkor is angolul dolgozz, később is az kell), jelen esetben mondjuk "EvaluateRound"
Ha ezzel megvagy, akkor úgy módosítod az "EvaluateRound" függvényt, hogy a bemenő paraméterek alapján írjon ki eredményt. Tehát például az elején a "Követ mutatsz" szöveget, ahogy a többiek is javasolták, egy tömbből olvasod ki, pl. "UserChoiceStrings" névvel. Jöhet a trükkös rész: a játékos és a gép választása alapján el kell döntened, hogy ki nyert. Ezt szintén kivenném egy vadonat új függvénybe (legyen a neve mondjuk "CompareChoice(int ch1, int ch2)"), ami mínusz eggyel tér vissza, ha ch1 vesztett, eggyel ha nyert, és nullával, ha döntetlen.
Ezen a ponton vált világossá számomra, hogy az '1', '2', '3' literálok használata nehézkes, úgyhogy ezeket elkezdtem lecserélgetni 'Rock', 'Paper', 'Scissor' nevű konstansokra. (A megoldásról részletesen a kódban). Az is egyértelmű lett, hogy az "Evaluate" függvényemnek át kell adnom a felhasználó választását is. Szóval kapott az elejére egy új bemenő paramétert. Szúrta a szememet, ezért a kiírást is kiraktam egy metódusba: ShowChoice(int choice, bool isUserChoice). Amint megvoltam, adta magát, hogy a visszaszámlálás is metódusba kerüljön, ráadásul ciklussal. Az Evaluate-ban már csak a switch-case szerkezetet kell rendberakni. A kiírás adja magát, már megvan a "ShowChoice" függvény, azt használom. Jöhet a kiértékelés - ez lehet a switch választója, de itt is használok konstanst inkább, jobban olvasható. Emiatt refaktorálni kell a CompareChoices függvényt is, hogy szinkronban legyen a konstansok értéke.
Ahogy elkészült "Evaluate" függvény, mindhárom releváns if törzsébe be lehet rakni, és gyorsan ki is derül, hogy valójában a három if csak egy Evaluate hívás, aminek a bemenete a "bemenet" változó. (Most így hagyom, majd a végén átnézem a változókat). Két feladat van még: a végeredmény kiírása és a bemenet ellenőrzése.
Kezdjük a bemenettel. Legyen egy "PromptForChoice" függvény belőle. Ebbe került végül egy végtelenített while ciklus, amiből cak akkor van kilépés, ha a felhasználó jó értéket írt be (egy egész számot egytől háromig). Ezen a ponton kiderült, hogy a bekérés közbe van beszúrva a gépi választás is, így az a blokk végére került. Az is kiderült, hogy a bemenet és opp változókat elég a ciklusmagon belül deklarálni, így oda kerültek.
Mard a végeredmény kiírása. Azon kívül, hogy ez is egy függvénybe került, más dolog nem nagyon volt vele. (Nem bírtam magammal, az ismétléseket azért elimináltam, amennyire ésszerű volt.
Most már csak a változók rendbetétele maradt hátra. A "currentLeft" és "currentTop" nem kell, világosan látszik, a többiek neve nem elég beszédes - nem dokumentálja magát a kód. Az "opp" így lett "machineChoice", a "count"-ból "userScore", a "countopp"-ból pedig "machineScore".
Végül már csak a tesztelés és hibajavítás maradt. Sajnos minden refaktor után kötelező a dolog :(
Nagyjából ennyi. Jó olvasgatást:
Köszönöm szépen mindenkinek, hogy még meg is írtátok a kódot, hogy segítsetek. Még egy időbe bele fog telni, hogy meg is értsem őket, viszont mindenképp rajta leszek az ügyön és még a napokban megpróbálom megírni újra azok alapján amiket küldtetek.
Nagyon szépen köszönöm a segítségeteket, utolsó neked pedig,hogy ilyen szépen kifejtetted minden lépésedet.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!