NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

Diskuze – Lekce 3 - Hrací kostka v C# - Zapouzdření, konstruktor a Random

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
mnauik
Člen
Avatar
mnauik:5.1.2014 12:49

Jak se volá konstruktor konstruktorem? Např. u té kostky, jde v nějaké podobě udělat něco takového:

public Kostka(int pocetSten)
{
        this.pocetSten = pocetSten;
        random = new Random();
}

public Kostka()
{
        this.Kostka(6); //nebo jen Kostka(6); ? nebo this(6); ?
}

Teď dělám v C# třídu, kde mám právě bezparametrický konstruktor a konstruktor s parametrem a narazil jsem na tento problém. Mohl bych samozřejmě tělo konstruktoru překopírovat do toho druhého nebo vytvořit extra metodu, ale akorát to znepřehlední kód a už tak mám problém se v tom vyznat. :)

Odpovědět
5.1.2014 12:49
minusuj mě, ale zdůvodni to ;)
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na mnauik
Jan Vargovský:5.1.2014 12:51
public Kostka() : this(6){}
 
Odpovědět
5.1.2014 12:51
Avatar
mnauik
Člen
Avatar
Odpovídá na Jan Vargovský
mnauik:5.1.2014 12:52

Děkuji, už nehlásí chybu.

Odpovědět
5.1.2014 12:52
minusuj mě, ale zdůvodni to ;)
Avatar
vfsdfsdfdsf
Člen
Avatar
vfsdfsdfdsf:27.1.2014 19:04

Jen dovysvětlím jak to je s tím randomem pro nováčky, jako jsem já... trvalo mi docela dlouho pochopit, jak to vlastně funguje... takže když si někdo bude pročítat komentáře, snad mu to pomůže :)

Prostě a jednoduše:
Náhodné číslo se generuje z různých pseudonáhodných matematických funkcí, které za nás zpracovává C#... výsledky se pak jakoby "seřadí za sebou" a vždy, když zavoláme metodu Next(), dostaneme jiné číslo z té seřazené řady (i když metodu zavoláme ve stejný čas, dostaneme jiné číslo):

Random random = new Random(); // Jedna instance třídy Random
for (int i = 0; i < 5; i++) // Vyvoláme metodu Next() 5x v jednu chvíli
    Console.WriteLine(random.Next(0, 100));
Console.ReadKey();

Výsledek bude třeba:

69
7
22
48
93

Vidíme, že i když se metoda Next() zavolala téměř v jeden okamžik 5x, vždy vydala jiné číslo (jakoby vždy z té řady čísel za sebou).

Co se ale stane, když budeme mít tento kód?

Random random1 = new Random(); // První instance
for (int i = 0; i < 3; i++)
    Console.WriteLine(random1.Next(0, 100));
Console.WriteLine();

Random random2 = new Random(); // Druhá instance
for (int i = 0; i < 3; i++)
    Console.WriteLine(random2.Next(0, 100));
Console.WriteLine();

Random random3 = new Random(); // Třetí instance
for (int i = 0; i < 3; i++)
    Console.WriteLine(random3.Next(0, 100));

Console.ReadKey();

Výsledkem bude třeba toto:

15
48
32

15
48
32

15
48
32

Vytvořili jsme 3 instance třídy Random téměř v jeden okamžik - díky tomu získaly všechny stejný seed (česky semínko - hodnota, která ovlivňuje, která čísla generátor pseudonáhodných čísel "vyplivne"). Seed je v C# ovlivněn právě časem.

Díky stejnému seedu si všechny instance připravily do řady stejná čísla za sebou a 3 z nich vypsaly.

Když si budeme instanci předávat (např. pomoci statiky), budeme mít jen jednu řadu čísel a čísla budeme získávat z této řady. Díky tomu budou čísla opravdu náhodná (ikdyž metodu Next() zavoláme třeba 1000x naráz).

Pokud nutně potřebujeme více instancí třídy Random, tak si je nesmíme vytvořit ve stejnou chvíli, nebo budou mít všechny instance stejnou řadu čísel, ze které pak budeme pomoci metody Next() čísla volat.

Pro ty, co umí anglicky: pochopení toho, jak to vlastně funguje, jsem získal odsud: http://stackoverflow.com/…are-the-same

Editováno 27.1.2014 19:07
 
Odpovědět
27.1.2014 19:04
Avatar
qwertyW
Tvůrce
Avatar
qwertyW:17.4.2014 10:22

malá drobnost, zde chybí modrý rámeček okolo kodu

Vše funguje, jak jsme očekávali. C# nám již v tuto chvíli nevygeneruje prázdný (tzv. bezparametrický konstruktor), takže kostku bez parametru vytvořit nelze. My to však můžeme umožnit, vytvořme si další konstruktor a tentokrát bez parametru. V něm nastavíme počet stěn na 6, protože takovou hodnotu asi uživatel naší třídy u kostky očekává jako výchozí:

public Kostka() {
pocetSten = 6;
random = new Random(); }

Odpovědět
17.4.2014 10:22
Programuji, tedy jsem.
Avatar
kamo20101
Člen
Avatar
Odpovídá na dez1nd
kamo20101:12.5.2014 15:37

ne, pozri si konstruktor

 
Odpovědět
12.5.2014 15:37
Avatar
darkwalker
Člen
Avatar
darkwalker:26.5.2014 19:00

Ahoj, to, že je metoda hod() s malým počátečním písmenem, má nějaký důvod? Jak to sedí s tezí "všechny metody s velkým"?

Jo, a díky moc za tutorialy. A jako starý Grammar Nazi velmi chválím jazyk autora, není zvykem mít IT články na takové úrovni.

Editováno 26.5.2014 19:02
 
Odpovědět
26.5.2014 19:00
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na darkwalker
Jan Vargovský:26.5.2014 19:00

Je to jen překlep :)

 
Odpovědět
26.5.2014 19:00
Avatar
Šimon Raichl
Tvůrce
Avatar
Šimon Raichl:11.8.2014 20:30

Moje kostka:

Program.cs:

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

namespace Kostka
{
    class Program
    {
        static void Main(string[] args)
        {
            Kostka prvni = new Kostka();
            Console.WriteLine("První kostka má defaultně 6 stěn\nNapište, kolik stěn má mít druhá kostka: ");
            int VaseSteny = int.Parse(Console.ReadLine());
            Kostka druha = new Kostka(VaseSteny);
            Console.WriteLine(prvni);
            for (int v = 0; v < 20 ; v++){
                Console.Beep();
                Console.Write(prvni.HodKostkou() + " ");
            }
            Console.WriteLine("\n");
            Console.WriteLine(druha);
            for (int v = 0; v < 20 ; v++){
                Console.Beep();
                Console.Write(druha.HodKostkou() + " ");
            }
            Console.ReadKey();
        }
    }
}

Kostka.cs:

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

namespace Kostka
{

    class Kostka
    {
        private Random Nahoda;
        private int Steny;
        int hody = 15;

        public Kostka()
        {
            this.Steny = 6;
            Nahoda = new Random();
        }
        public Kostka(int Steny)
        {
            this.Steny = Steny; // přetížená proměnná Steny
            Nahoda = new Random();
        }
        public int HodKostkou()
        {
            return Nahoda.Next(1, Steny + 1);
        }
        public override string ToString()
        {
            return String.Format("Tato kostka má {0} stěn. {1} hodů kostkou:", Steny, hody);
        }
    }
}
 
Odpovědět
11.8.2014 20:30
Avatar
petr.ptacek99:16.10.2014 19:34

Dobrý den,
prosím o doporučení učebnice, hlavně v češtině, která je pro začátečníky v programovacím jazyce C#. Ve škole to vysvětluje učitel pomocí prezentace a slajdů. Je to prostě k ničemu. Proto bych uvítal knihu, kde je vše hezky vysvětleno. Třeba jako na tomto tutoriálu.
Předem děkuji ;)

 
Odpovědět
16.10.2014 19:34
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 154.