IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.
Avatar
ivanp
Člen
Avatar
ivanp:21.12.2017 21:02

Zdravím pracujem na menšom programe ktorý by sa dal nazvať hrou. Použil som trochu OOP a metódy , ale chcem sa vás opýtať či je tento kód v "norme" . Co by ste zlepšili alebo či to je v pohode . Za každú radu budem rád.

Program:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MemoryGame_v1._0._1
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console Setup
            Console.Title = "Memory-Game";
            Console.Clear();

            //Variables
            Cisla cisla = new Cisla();
            int znova = 1;

            //Program
            Console.WriteLine("=========================");
            Console.WriteLine("===[MemoryGame v1.0.1]===");
            Console.WriteLine("=========================");
            Console.WriteLine("by ivanp");
            Console.WriteLine("");


            while (znova == 1)
            {
                cisla.GenerovanieCisel();
                cisla.Odpocet();
                cisla.Zadanie();
                cisla.OverenieZadania();

                Console.WriteLine("Chcete hrať znova?[ANO-1/NIE-0]");
                while (!int.TryParse(Console.ReadLine(), out znova))
                {
                    Console.WriteLine("Neplatná voľba, zadajte ju znova:");
                }

            }
            Console.ReadKey();
        }
    }
}

Cisla:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MemoryGame_v1._0._1
{
    class Cisla
    {
        //Variables
        public int number1, number2, number3;
        public int vybrateCislo, zadaneCislo;
        public int odpocet = 1000;

        Random rnd;

        //Methods

        public void GenerovanieCisel()
        {
            rnd = new Random();
            number1 = rnd.Next(1, 5);
            number2 = rnd.Next(1, 5);
            number3 = rnd.Next(1, 5);

            Console.WriteLine("Zapamatajte si následujuce čísla: {0},{1},{2}", number1, number2, number3);
        }

        public void Odpocet()
        {
            Console.WriteLine("5");
            Thread.Sleep(odpocet);
            Console.WriteLine("4");
            Thread.Sleep(odpocet);
            Console.WriteLine("3");
            Thread.Sleep(odpocet);
            Console.WriteLine("2");
            Thread.Sleep(odpocet);
            Console.WriteLine("1");
            Thread.Sleep(odpocet);
            Console.Clear();
        }

        public void Zadanie()
        {
            rnd = new Random();
            vybrateCislo = rnd.Next(1, 4);
            Console.Write("Zadajte " + vybrateCislo + "." + " cislo: ");

            while (!int.TryParse(Console.ReadLine(), out zadaneCislo))
            {
                Console.WriteLine("Zadajte číslo prosím:");
            }
        }

        public void OverenieZadania()
        {
            if (vybrateCislo == 1)
            {
                if (number1 == zadaneCislo)
                {
                    Console.WriteLine("Zadali ste spravné číslo.");

                }
                else
                {
                    Console.WriteLine("Zadali ste zle číslo");

                }
            }

            else if (number2 == 2)
            {
                if (number2 == zadaneCislo)
                {
                    Console.WriteLine("Zadali ste spravné číslo.");

                }
                else
                {
                    Console.WriteLine("Zadali ste zle číslo");

                }
            }

            else if (number3 == 3)
            {
                if (number3 == zadaneCislo)
                {
                    Console.WriteLine("Zadali ste spravné číslo.");

                }
                else
                {
                    Console.WriteLine("Zadali ste zle číslo");

                }
            }
        }
    }
}
 
Odpovědět
21.12.2017 21:02
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na ivanp
Petr Šťastný:21.12.2017 21:32

Kód je přehledný, ale trochu se mi nezdá ta metoda OverenieZadania() - určitě by to šlo udělat líp. Minimálně bys mohl kontrolovat podmínky složeně. Takže místo

if(a)
{
if(b){
// Ano
}else{
// Ne
}
}

můžeš napsat

if(a && b){
// Ano
}else{
// Ne
}

Ale určitě by ta metoda šla udělat jinak, lépe.

Komentáře uvnitř metod chybí, ale u tohohle programu to naprosto nevadí - tady nejsou komentáře potřeba, myslím, že pro takhle krátký kód není potřeba je vypisovat. Ale jestli budeš někdy psát delší kód, nezapomínej na ně. Když za měsíc budeš chtít upravit nějakou tu složitou podmínku co pracuje s 6 LINQ querynama, nebudeš to muset půl hodiny luštit :D

Ohledně návrhu nemám v tomhle případě sebemenších poznámek. Jen tak dál!

Malé drobnůstky, které ti zpříjemní život
Když chceš vypsat nový řádek, nemusíš psát Console.Write­Line(""), ale prostě do předchozího výpisu můžeš dát \n

Console.WriteLine("Radek 1");
Console.WriteLine();
Console.WriteLine("Radek 3");

==

Console.WriteLine("Radek 1\n");
Console.WriteLine("Radek 3");

Doplňování proměnných do textu:

Console.WriteLine("{0}, {1}, {2}", a, b, c);

==

Console.WriteLine($"{a}, {b}, {c}");
string s = $"{a}, {b}, {c}";  // Toto muzes pouzit i u normalniho stringu

LINQ
Vážně. Jakmile potřebuješ pracovat v aplikaci s polem (nebo listem, nebo libovolnou kolekcí... Klidně i s databází), přidávat něco, upravovat, hledat... Použij LINQ . Nauč se ho. Je to taková magická věc, která vyřeší všechny tvé problémy s kolekcemi :)

 
Nahoru Odpovědět
21.12.2017 21:32
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na ivanp
Petr Čech:22.12.2017 0:49

Ke komentáři nade mnou přidám výrazný problém. Kód není čistě v Aj. VEŠKERÝ kód se píše v Aj a neexistuje jediný důvod pro to, aby to bylo jinak.

Nahoru Odpovědět
22.12.2017 0:49
the cake is a lie
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na ivanp
ostrozan:22.12.2017 6:52

Mně spíš vadí

Použil som trochu OOP

když OOP tak úplně :) - a s tím souvisí i nepoužívání veřejných proměnných

//Variables
public int number1, number2, number3;
public int vybrateCislo, zadaneCislo;
public int odpocet = 1000;

proměnné mají být privátní a přistupuje se k nim pomocí veřejných metod - getteru a setteru - což C# řeší elgantně vlastnostmi
zápis:

public int number1{get;set;}

privátní proměnnou a zmíněné metody vygeneruje za tebe

můžeš tím mimo jiné zajistit, že proměnná bude jen pro čtení :

public int number1{get;private set;}

to je ale jen jako příklad - ve skutečnosti všechny proměnné ve třídě Cisla nějak zpracovávají veřejné metody a můžou tedy být privátní a nepotřebuješ k nim ani přistupovat přes vlastnosti

další věc - co nejdřív se odnauč používat na čekání uspávání vlákna Thread.Sleep() - v tvém případě dokonce na sekundu - to je cesta do pekel :)
spíš si prostuduj async - await

 
Nahoru Odpovědět
22.12.2017 6:52
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na ivanp
ostrozan:22.12.2017 7:01

možná lepší vysvětlení async - await

 
Nahoru Odpovědět
22.12.2017 7:01
Avatar
ivanp
Člen
Avatar
Odpovídá na Petr Čech
ivanp:22.12.2017 17:14

Hej komentáre určite používam m ale to mi to neprišlo nutné

 
Nahoru Odpovědět
22.12.2017 17:14
Avatar
ivanp
Člen
Avatar
ivanp:22.12.2017 17:15

Celkovo som chcel vedieť či je čitateľný , prehľadný atd.

 
Nahoru Odpovědět
22.12.2017 17:15
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na ivanp
Petr Čech:22.12.2017 17:29

Je jedno, jestli ti to přijde dobré, nebo ne, kód se píše anglicky, i třeba nějaký tvůj domácí test. V neformálním prostředí je to dobrý zvyk, v profesionálním naprostá nutnost.

Nahoru Odpovědět
22.12.2017 17:29
the cake is a lie
Avatar
HONZ4
Člen
Avatar
Odpovídá na ivanp
HONZ4:22.12.2017 17:36

za mě je to že: new Random by se měl volat za běhu programu pouze jednou.

 
Nahoru Odpovědět
22.12.2017 17:36
Avatar
ivanp
Člen
Avatar
Odpovídá na HONZ4
ivanp:23.12.2017 10:46

Všetkým vám ďakujem za vaše rady a typy

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
23.12.2017 10:46
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 10 zpráv z 10.