Diskuze: OOP - Pomoc
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
vodslon:3.8.2015 15:23
Ahoj,
Já myslím, že mapa musí vědět absolutní pozici robota, protože jak jinak by věděla, jestli je další krok překážka nebo ne. OOP, jak ho chápu a používám já by mělo být. Jeden Objekt Mapa, druhý Robot. Ve třídě Robot budeš mít jeho vlastnosti a třeba i pohyb. Vytvoříš mapu s překážkami, pak Robota přidáš do mapy a on se tam začne pohybovat a mapa ted na základě pohybu Robota řeší, jeslti může ten krok udělat, ale určitě mapa musí vědět pozici Robota v mapě, poznáš to třeba tak, že je to správně, že tam může vypustit kolik Robotů chceš a pak můžeš řešit vztah mezi nima, co objekt to Robot se svým jménem a pozicí a možnostma pohybu.
Josef Kuchař - Pepa489:3.8.2015 16:24
Takže si mám v mapě ještě vytvořit list se souřadnicema robotů, nebo to mám udělat úplně jinak?
vodslon:3.8.2015 17:04
Ono to asi nejde říct obecně, to je o Tvém přístupu a o Tvém návrhu toho, co ta apka má dělat. Určitě nejdříve klidně na papíře rozmysli, bude jeden typ mapy nebo více, bude na mapě jeden, dva nebo X robotů. Budou různé levly, budou mezi sebou v příapdě, že jich tam bude více, něják komunikovat (kolize). Ozvou se sem třeba i zkušenější programátoři, kteří to uvidí jinak , když nebudeš vědět cokoliv tak napiš a já zkusím pomoc, OOP není řešení a nebo kod, je to balík zásad jak psát kod správně. Ale řikám nejdříve si musíš rozvrhnout přesně co budeš potřebovat.
Josef Kuchař - Pepa489:3.8.2015 17:58
Mapa se bude generovat náhodně a robot budě vždy jeden, takže si mám do třídy mapa uložit promněné x a y robota a průběžně je aktualizovat?
vodslon:4.8.2015 8:00
Musíš mít hodnotu pozice Robota v mapě. Budeš tam mít nějákej timer a nebo se Ti to bude hýbat jenom na key press? V čem to budeš dělat? WF,WPF nebo něco pokročilejšího?
Josef Kuchař - Pepa489:4.8.2015 8:57
Ten robot by se měl hýbat podle svého algoritmu, budu to vypisovat pro začátek do konzole.
vodslon:4.8.2015 10:26
takže dejme tomu náhodně jenom pobíhat, nebo se snažit třeba najít cestu bludištěm do nějákého cíle? Já bych to do konzole nedělal..Je to teda mojí neschopností, ale tam pořád přesouvat ten index kurzoru, ono je to ve směs stejné, ale mě se s tím dělá strašně špatně, pojdme třeba alespon třeba WF.
Josef Kuchař - Pepa489:4.8.2015 10:39
Chtěl bych aby se na každé políčko, kde není překážka dostal
Já bych to udělal tak, že bych si vytvořil třídy Robot, Mapa a Policko (Políčko). V Mapě si vytvořil dvourozměrné pole třídy Policko, které by mělo vlastnosti:
Enum enum (rozdíl mezi zdí a místností) nebo by šlo taky dát: bool
jdeProjit - tuto vlastnost by jsi náhodně vybíral,
int x (místo na mapě ve vodorovné ose),
int y (místo na mapě ve svislé ose).
Pak cyklem FOR inicializoval všechny prvky. Dále bych zjistil, která políčka jsou v poli místnostmi a náhodně v jednom z nich vložil robota. Robot by měl taky vlastnosti stejné jako Policko kromě Enum enum nebo bool jdeProjit. Pak jednoduše zjišťuješ, jestli je vedle robota místnost.
vodslon:4.8.2015 19:48
já jsem myslel, že bych něco napsal v kodu ve WF, ale nestihnul jsem to...
ale rozmyšlené to mám takto, at si zkusíš i dědění.
třída Hřiště má void metodu vytvoři hřiště ta kreslí v paintu
pomocí cyklu kostky...
Každá kostka má místo kde je a je děděná z matky Kostka a bud Kostka
průchozí nebo kostka překážka, které mají každá stejnou velikost ale
jinou barvu, tak mám List<kostek> které mi pokryjí celej paint, který
mám 200;200 a v něm 100 kostek z toho 20 % překážek náhodně. Robota má
zase X,Y a dám ho na náhodné pole kde je kostka průchozí no a ted si hodí
kostkou jeslti jakým půjde směrem a zeptá se, je tím směrem kostka
průchozí nebo ne, když ano tak tam přeskočí když ne tak nejde...u té
kostky můžeš dát vlastnost třeba početšlápnutí, aby si mohl zajistit,
že si bude vybírat kostky nejméně šlápnutí kdyby si třeba chtěl aby ti
cítelně prošel co nejdříve celou mapu...Robot může mít třeba i počet
uražených kostek a pohybuje se pomocí timeru třeba každou vteřinu...
Josef Kuchař - Pepa489:5.8.2015 15:27
mohl by si mi alespon zkracene napsat kod, klidne bez wf? Díky
Ondřej Štorc:5.8.2015 15:32
Nechci prudit, ale zkus si ten kód napsat sám. vodslon ti to vysvětlil dost detailně a když se budeš koukat jen na cizí kódy tak se nic nenaučíš (v porovnání s tím kdybys sis to udělal sám). Zkus něco sepsat a poslat to sem. Určitě se pak najde někdo kdo ti ten kód zkritizuje a poradí jak něco udělat třeba lépe.
Josef Kuchař - Pepa489:5.8.2015 15:45
Až se mi povede splácat funkční kód tak to sem dám, těd to mám problém spustit, aby to nevyhazovalo vyjímky, takže tak.
No zatím mám tohle, robota zatím nemám, protože nevím, jak ho tam vpasovat
class Program
{
static void Main(string[] args)
{
Random random = new Random();
Svet svet = new Svet(random);
svet.VytvorMapu();
Console.WriteLine(svet.ToString());
Console.ReadKey();
}
}
class Svet
{
private Random random;
private Pole[,] mapa;
private int sirka, vyska;
public Svet(Random random)
{
this.random = random;
sirka = 10;
vyska = 10;
mapa = new Pole[sirka, vyska];
for (int x = 0; x < sirka; x++)
{
for (int y = 0; y < vyska; y++)
{
var pole = new Pole();
mapa[x, y] = pole;
}
}
}
public Svet(Random random, int sirka, int vyska)
{
this.random = random;
this.sirka = sirka;
this.vyska = vyska;
mapa = new Pole[sirka, vyska];
for (int x = 0; x < sirka; x++)
{
for (int y = 0; y < vyska; y++)
{
var pole = new Pole();
mapa[x, y] = pole;
}
}
}
public void VytvorMapu()
{
for (int x = 0; x < sirka; x++)
{
for (int y = 0; y < vyska; y++)
{
if(random.Next(101) > 80)
{
mapa[x, y].Zed = true;
}
}
}
}
public override string ToString()
{
string buffer = "";
for(int y = 0; y < vyska; y++)
{
for (int x = 0; x < sirka; x++)
{
buffer += mapa[x, y].ToString() + " ";
}
buffer += "\n";
}
return buffer;
}
}
class Pole
{
public int slapnuto = 0;
public int Slapnuto
{
get { return slapnuto; }
set
{
if(slapnuto >= 0)
{
slapnuto = value;
}
else
{
slapnuto = 0;
}
}
}
public bool Zed { get; set; }
public override string ToString()
{
if(Zed)
{
return "█";
}
else
{
return Slapnuto.ToString();
}
}
}
vodslon:10.8.2015 8:32
Ahoj, tak jak si s tím pokročil.
Umístit Robota je třeba tak
public void UmistiRobota(Robot r)
{
while(mapa[r.poziceX,r.poziceY].Zed == true)
{
r.poziceX++;
}
Console.SetCursorPosition(r.poziceX, r.poziceY);
}
Ale kod píšeš pěkně, myslím, že by to pro Tebe měla být celé
brnkačka.
Mě se nelíbí ta konzole, každopádně tady si umístíš Robota, kterej bude
třeba jako R a místo v mapě přepíšeš na R a ted to začíná, ted půjde
nějákym směrem a je v té mapě zed ano nebo ne, myslím, že nic víc v tom
není, nejdříve ho nauč pouze chodit a potom si zkus chodit s logikou, že
upřednostní tam kde nebylo ještě šlápnuto.
Josef Kuchař - Pepa489:10.8.2015 11:28
Ahoj, mám to zatím uděláno nějak takhle:
class Program
{
static void Main(string[] args)
{
Random random = new Random();
Svet svet = new Svet(random, 15, 15);
Robot robot = new Robot(random, svet);
Console.WriteLine("Počet kroků: " + robot.Jed());
Console.WriteLine("Hotovo!!!");
Console.ReadKey();
}
}
class Svet
{
private Random random;
private Pole[,] mapa;
private int sirka, vyska;
private int robotX, robotY;
public Svet(Random random)
{
this.random = random;
sirka = 10;
vyska = 10;
VytvorPole();
VytvorMapu();
VlozRobota();
}
public Svet(Random random, int sirka, int vyska)
{
this.random = random;
this.sirka = sirka;
this.vyska = vyska;
VytvorPole();
VytvorMapu();
VlozRobota();
}
public enum SMER
{
Nahore,
Dole,
Vlevo,
Vpravo
}
private void VlozRobota()
{
robotX = random.Next(sirka);
robotY = random.Next(vyska);
while (mapa[robotX, robotY].Zed)
{
robotX = random.Next(sirka);
robotY = random.Next(vyska);
}
mapa[robotX, robotY].Slapnuto += 10000;
}
private void VytvorPole()
{
mapa = new Pole[sirka, vyska];
for (int x = 0; x < sirka; x++)
{
for (int y = 0; y < vyska; y++)
{
var pole = new Pole();
mapa[x, y] = pole;
}
}
}
private void VytvorMapu()
{
for (int x = 0; x < sirka; x++)
{
for (int y = 0; y < vyska; y++)
{
if(random.Next(101) > 15)
{
mapa[x, y].Zed = true;
}
}
}
}
public bool Prosel()
{
for (int x = 0; x < sirka; x++)
{
for (int y = 0; y < vyska; y++)
{
if(!mapa[x, y].Zed && mapa[x, y].Slapnuto == 0)
{
return false;
}
}
}
return true;
}
public bool KontrolaZdi(SMER smer)
{
switch ((int)smer)
{
case 0:
return !(robotY - 1 >= 0) || mapa[robotX, robotY - 1].Zed;
case 1:
return !(robotY + 1 < vyska) || mapa[robotX, robotY + 1].Zed;
case 2:
return !(robotX - 1 >= 0) || mapa[robotX - 1, robotY].Zed;
case 3:
return !(robotX + 1 < sirka) || mapa[robotX + 1, robotY].Zed;
default:
return false;
}
}
public int PocetSlapnuti(SMER smer)
{
switch ((int)smer)
{
case 0:
if (robotY - 1 >= 0) return mapa[robotX, robotY - 1].Slapnuto;
return 0;
case 1:
if (robotY + 1 < vyska) return mapa[robotX, robotY + 1].Slapnuto;
return 0;
case 2:
if (robotX - 1 >= 0) return mapa[robotX - 1, robotY].Slapnuto;
return 0;
case 3:
if (robotX + 1 < sirka) return mapa[robotX + 1, robotY].Slapnuto;
return 0;
default:
return 0;
}
}
public void Jdi(SMER smer)
{
switch((int)smer)
{
case 0:
if (robotY - 1 >= 0 && !mapa[robotX, robotY - 1].Zed)
{
robotY--;
mapa[robotX, robotY].Slapnuto++;
}
break;
case 1:
if (robotY + 1 < vyska && !mapa[robotX, robotY + 1].Zed)
{
robotY++;
mapa[robotX, robotY].Slapnuto++;
}
break;
case 2:
if (robotX - 1 >= 0 && !mapa[robotX - 1, robotY].Zed)
{
robotX--;
mapa[robotX, robotY].Slapnuto++;
}
break;
case 3:
if (robotX + 1 < sirka && !mapa[robotX + 1, robotY].Zed)
{
robotX++;
mapa[robotX, robotY].Slapnuto++;
}
break;
default:
break;
}
}
public override string ToString()
{
int nejviceSlapnuti = 0;
for(int x = 0; x < sirka; x++)
{
for (int y = 0; y < vyska; y++)
{
if(mapa[x, y].Slapnuto > nejviceSlapnuti)
{
nejviceSlapnuti = mapa[x, y].Slapnuto;
}
}
}
int nejvetsiPocetCislic = PocetCislic(nejviceSlapnuti);
string buffer = "";
for(int y = 0; y < vyska; y++)
{
for (int x = 0; x < sirka; x++)
{
int pocetCislic = PocetCislic(mapa[x, y].Slapnuto);
if(x == robotX && y == robotY)
{
for(int i = 0; i < nejvetsiPocetCislic - 1; i++)
{
buffer += " ";
}
buffer += "# ";
}
else
{
if(mapa[x, y].Zed)
{
for(int i = 0; i < nejvetsiPocetCislic; i++)
{
buffer += mapa[x, y].ToString();
}
buffer += " ";
}
else
{
for (int i = 0; i < nejvetsiPocetCislic - pocetCislic; i++)
{
buffer += " ";
}
buffer += mapa[x, y].ToString() + " ";
}
}
}
buffer += "\n";
}
return buffer;
}
private int PocetCislic(int n)
{
return n.ToString().Length;
}
}
class Pole
{
public int slapnuto = 0;
public int Slapnuto
{
get { return slapnuto; }
set
{
if(slapnuto >= 0)
{
slapnuto = value;
}
else
{
slapnuto = 0;
}
}
}
public bool Zed { get; set; }
public override string ToString()
{
if(Zed)
{
return "█";
}
else
{
return Slapnuto.ToString();
}
}
}
class Robot
{
private Svet svet;
private Random random;
public Robot(Random random, Svet svet)
{
this.random = random;
this.svet = svet;
}
public int Jed()
{
List<int> mozneSmery = new List<int>();
List<int> smerSlapnuti = new List<int>();
List<int> nejlepsiSmer = new List<int>();
int kroku = 0;
while (!svet.Prosel())
{
for(int i = 0; i < 4; i++)
{
if(!svet.KontrolaZdi((Svet.SMER)i))
{
mozneSmery.Add(i);
smerSlapnuti.Add(svet.PocetSlapnuti((Svet.SMER)i));
}
}
Console.WriteLine(svet.ToString());
Console.WriteLine("Nejlepší směr:");
int nejmensiPocetSlapnuti = Minimum(smerSlapnuti);
for(int i = 0; i < mozneSmery.Count; i++)
{
if(smerSlapnuti[i] == nejmensiPocetSlapnuti)
{
Console.WriteLine((Svet.SMER)mozneSmery[i]);
nejlepsiSmer.Add(mozneSmery[i]);
}
}
Console.WriteLine("Nejmenší počet šlápnutí:" + nejmensiPocetSlapnuti);
kroku++;
Console.WriteLine("Počet kroků: " + kroku);
svet.Jdi((Svet.SMER)nejlepsiSmer[random.Next(nejlepsiSmer.Count)]);
mozneSmery.Clear();
smerSlapnuti.Clear();
nejlepsiSmer.Clear();
nejmensiPocetSlapnuti = 0;
System.Threading.Thread.Sleep(10);
Console.Clear();
}
return kroku;
}
public static int Minimum(List<int> list)
{
int min = 0;
for (int i = 0; i < list.Count; i++)
if (list[i] < list[min])
min = i;
return list[min];
}
}
Vím ten robot je trochu sprasenej, ale beru to jako dobrý začátek
vodslon:10.8.2015 11:49
Ahoj je to zajímavý kod, ale když jsem si to nakopíroval tak se mi to
zobrazuje strašně divně.
Něják mi není jasný co je překážka a co ne . Já bych tam jasně viděl
použít Timer, aby bylo hezky vidět co ten Robot dělá a kam jde atd. Klidně
i s komentářem zkouším to doprava není tam překážka tak to vyšlo něco
takového. Tady to je takové extrémně zacyklené a pro mě jako uživatele
uplně zmatečné.
Zobrazeno 18 zpráv z 18.