Diskuze: C# Rychlý output / ASCII art / nápad na hru
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 9 zpráv z 9.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Když já potřebuji udělat něco podobného, nepřekresluji všechno, ale překreslím jenom změněný znak.
Console.SetCursorPosition(x, y);
Příklad:
A B C
D E F
G H I
// Potřebuji překreslit E na @
Console.SetCursorPosition(2, 1);
Console.Write("@");
Zatím jsem nepřišel na lepší způsob, jak něco podobného vyřešit, takže snad ti to pomůže.
// EDIT:
Kdybys nevěděl co udělat, tak já momentálně pracuji na takovém RPG
dungeonu. Vygeneruji mapu a nechám hrdinu procházet se po mapě a zabíjet
příšery. Nic moc složitého a technika, kterou jsem popsal výše, na to
úplně stačí.
Díky
Ale pokud bych měl
dejme tomu konzoli ve full screenu a hru ve které se hýbe hodně objektů, tak
bude výstup stejně strašně pomalý.
Chtěl jsem zkusit štěstí, jestli náhodou nemá někdo zkušenosti s
výstupem pomocí nějakého bufferu.
Samozřejmě jsem googlil, ale nikde jsem nenarazil na plně funkční
řešení.
To řešení co naznačuje Petr je myslím vhodné pro to co se snažíš zrealizovat. Pokud jen přepisuješ jednotlivé znaky v konzoli a nepoužiješ refresh (Console.Clear()), tak ta rychlost je celkem slušná. Viz následující experiment.
class Program
{
static Random r = new Random();
static int[,] body = new int[50,2];
static void Main(string[] args)
{
Console.CursorVisible = false;
System.Timers.Timer t = new System.Timers.Timer(30);
t.Elapsed += new System.Timers.ElapsedEventHandler(t_elapse);
t.Start();
Console.ReadLine();
}
private static void t_elapse(object sender, ElapsedEventArgs e)
{
for (int i = 0; i < 50; i++)
{
Console.SetCursorPosition(body[i, 0], body[i, 1]);
Console.Write(" ");
}
for (int i = 0; i < 50; i++) {
body[i, 0] = r.Next(0, 40);
body[i, 1] = r.Next(0, 20);
Console.SetCursorPosition(body[i, 0], body[i, 1]);
Console.Write("*");
}
}
}
Musím říct, že jsi mě překvapil a dokonce i trošku přesvědčil. Na té tvé velikosti obrazovky / vykreslujícího pole je to ideální. Ale stále si nejsem jist, jestli by to nemělo vliv na hratelnost = Pokud plánuji mít danou konzoli ve full screenu, tak přepsání celé konzole trvá asi 0,7s. Samozřejmě bych nepřepisoval celou konzoli, ale pokud bych měl nějaké pozadí ze znaků + nějaké ty pohybující se objekty tak se na nějakou znatelnou hodnotu dostanu.
(Zítra, vlastně dnes
,
zkusím něco napsat a uvidím)
Díky 
Při hře Pacman se ti přece pohybuje dost málo objektů (pacman + 4 duchové). Tam nebude problém s rychlostí
Konzole se dá překreslit mnohem rychlejc, mě to tu zvládá několiksetkrát za sekundu:
Jde o to nepřepisovat celou stránku, ale jen ty znaky, u kterých dochází k aktivní změně a je pravda, jak píše Lukáš, že u většiny her tohoto typu nepotřebuješ pohybovat stovkami objektů. Zkusil jsem to trochu pozměnit a dal jsem tam 100 měnících se pozic a měření času přepisu a pohybuje se to na úrovni 5-15ms a to mi přijde na konzoli celkem rychlé:
class Program
{
static Random r = new Random();
static int[,] body = new int[100,2];
static void Main(string[] args)
{
Console.CursorVisible = false;
System.Timers.Timer t = new System.Timers.Timer(30);
t.Elapsed += new System.Timers.ElapsedEventHandler(t_elapse);
t.Start();
Console.ReadLine();
}
private static void t_elapse(object sender, ElapsedEventArgs e)
{
int c = Environment.TickCount;
for (int i = 0; i < 100; i++)
{
Console.SetCursorPosition(body[i, 0], body[i, 1]);
Console.Write(" ");
}
for (int i = 0; i < 100; i++) {
body[i, 0] = r.Next(0, 50);
body[i, 1] = r.Next(0, 30);
Console.SetCursorPosition(body[i, 0], body[i, 1]);
Console.Write("*");
}
c = Environment.TickCount - c;
Console.SetCursorPosition(2, 32);
Console.Write(c);
}
}
Satik: Něco takového jsem hledal, díky 
Lukas, Jiří: Pacman byl na to vykreslování špatný příklad,
ale do nějakého toho "space shooteru" se to určitě hodí.
Ale máš pravdu, že pro většinu her by tato metoda stačila.
Díky všem za čas a rady

Zobrazeno 9 zpráv z 9.