Diskuze: Generace bludiště v políčkové grafice
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 10 zpráv z 10.
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.
Tak opět sám. 
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using System;
public class MazeGenerator
{
private Random r = new Random();
public List<Vector2> GenerateMaze(Rectangle bounds)
{
List<Vector2> paths = new List<Vector2>() { new Vector2(0, 0) };
Dictionary<Vector2, int> potential = new Dictionary<Vector2,int>();
Vector2[] neighbors = new Vector2[] { new Vector2(1, 0), new Vector2(-1, 0), new Vector2(0, 1), new Vector2(0, -1) };
for (int index = 0; index < 4; index++)
potential.Add(neighbors[index], index);
while (paths.Count < 1000)
{
Vector2
oldItem = new Vector2(),
newItem = new Vector2();
int
index = r.Next(potential.Count),
direction = 0;
foreach (Vector2 item in potential.Keys)
if (index == 1)
{
oldItem = item;
direction = potential[item];
newItem = oldItem + neighbors[direction];
break;
}
else
index--;
if (!paths.Contains(newItem))
{
paths.Add(oldItem);
paths.Add(newItem);
for (int index2 = 0; index2 < 4; index2++)
if (!paths.Contains(newItem + neighbors[index2]) && !potential.ContainsKey(newItem + neighbors[index2]))
potential.Add(newItem + neighbors[index2], index2);
}
potential.Remove(oldItem);
}
return paths;
}
}
Já sám jsem to nechápal - proto jsem se obrátil sem... 
Nyní mi to je již jasné - bral jsem to tak, že si z každého volného konce vyberu náhodného souseda (nikam nezasahujícího) a toho přidám do proměnné s cestami v bludišti. Ale je to tak že každý volný konec má jen jeden směr - vstoupí-li mu někdo jiný do cesty, tak se jednoduše vymaže. Tím tedy každý konec má svůj pevně daný směr - a v něm stačí kontrolovat každé příští políčko...
Jediné co mi vrtá hlavou - jak mám zařídit, aby se mi vyplnila určitá plocha?
A tohle ti nestačí? http://www.itnetwork.cz/…eho-bludiste
Vždyť to již mám - a způsobů je snad nekonečně mnoho...
(A ten můj je pro mě lepší -
potřebuji alespoň jednu 100% průchozí cestu...) A snad jsem i vymyslel, jek
jím vyplnit předem zadanou plochu...
Tuhle věc jsem řešil i tak, že jsem naházel na plochu několik obdélníkových místností a ty poté propojil náhodně generovanou chodbou. Bylo to jako had, který se náhodně pohybuje (ale nemůže dozadu) a kolem něj se staví zdi. Dělalo to docela hezké dungeony, bohužel jsem to nikdy nedodělal.
Cyklus se mi nechce ukončit - přitom podmínky jsou myslím správně:
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using System;
public class MazeGenerator
{
private Random r = new Random();
public List<Vector2> GenerateMaze(Rectangle bounds)
{
List<Vector2> paths = new List<Vector2>() { new Vector2(0, 0) };
Dictionary<Vector2, int> potential = new Dictionary<Vector2, int>() { { new Vector2(1, 0), 0 }, { new Vector2(0, 1), 2 } };
Vector2[] neighbors = new Vector2[] { new Vector2(1, 0), new Vector2(-1, 0), new Vector2(0, 1), new Vector2(0, -1) };
while (potential.Count > 0)
{
Vector2
oldItem = new Vector2(),
newItem = new Vector2();
int
index = r.Next(potential.Count),
direction = 0;
foreach (Vector2 item in potential.Keys)
if (index == 1)
{
oldItem = item;
direction = potential[item];
newItem = oldItem + neighbors[direction];
break;
}
else
index--;
if (!paths.Contains(newItem))
{
paths.Add(oldItem);
paths.Add(newItem);
for (int index2 = 0; index2 < 4; index2++)
{
Vector2 total = newItem + neighbors[index2];
if (!paths.Contains(total) && !potential.ContainsKey(total) && total.X > 0 && total.Y > 0 && total.X < (bounds.Width / 32) && total.Y < (bounds.Height / 32))
potential.Add(total, index2);
}
}
potential.Remove(oldItem);
}
return paths;
}
}
V čem vidíš problém? Děkuji.
A jak bych to měl naklonit podle X - asi to mám správně:
using System;
using Microsoft.Xna.Framework;
public class Camera2D
{
public float Zoom { get; set; }
public float Rotation { get; set; }
public Vector2 Position { get; set; }
public Camera2D()
{
Zoom = 2;
Rotation = 0.001F;
Position = new Vector2(-400, 240);
}
public void Move(Vector2 amount)
{
Position += amount;
}
public Matrix GetTransformation(Microsoft.Xna.Framework.Graphics.GraphicsDevice graphicsDevice)
{
return Matrix.CreateTranslation(
new Vector3(Position.X, -Position.Y, 0))
*
Matrix.CreateRotationX(Rotation)
*
Matrix.CreateScale(new Vector3(Zoom, Zoom, 1))
*
Matrix.CreateTranslation(new Vector3(graphicsDevice.Viewport.Width * 0.5f, graphicsDevice.Viewport.Height * 0.5f, 0));
}
}
Ale problém vidím ve vykreslení 3D objektu - místo 2D. Tak jako tak bych ty zdi 3D mít chtěl - zatím bez textury. Ovšem Texture3D se vykreslit nedá - co jsem nejčastěji viděl - dělá se to přes postupné vykreslování Meshů. Ovšem dává mi to dost zabrat - dát do dokupy - jak píši - zatím by to bylo jen v nějaké modré barvě. Děkuji za případnou pomoc.
Zobrazeno 10 zpráv z 10.