Letní akce! Lákají tě IT školení C#, Javy a PHP v Brně? Přihlas se a napiš nám do zpráv kód "BRNO 500" pro slevu 500 Kč na libovolný brněnský kurz. Lze kombinovat se slevami uvedenými u školení i použít pro více kurzů. Akce končí 28.7.
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 Stastny
Redaktor
Avatar
Odpovídá na ivanp
Petr Stastny: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  +1 21.12.2017 21:32
Avatar
Petr Čech
Redaktor
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  +4 22.12.2017 0:49
Life doesn't give you lemons. You need to grow them patiently and then sell the lemonade.
Avatar
ostrozan
Redaktor
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
Redaktor
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
Redaktor
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  +1 22.12.2017 17:29
Life doesn't give you lemons. You need to grow them patiently and then sell the lemonade.
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  +1 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.