NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Josef Kuchař - Pepa489:3.8.2015 14:23

Ahoj,
začal jsem se učit OOP a začal jsem tvořit program, který má 2 třídy: Robot, Svet. Robot má senzory a potřebuje od světa zjistit jestli vpravo, vlevo, před ním nebo za ním není zeď. Celé se to bude odehrávat na 2d mapě (poli). Robot by neměl vědět svoji absolutní pozici na mapě. Jak mají robotovi senzory zjistit jestli není někde překážka když nezná absolutní pozici? Je správné do mapy uložit robotovu absolutní pozici? Díky

Odpovědět
3.8.2015 14:23
2x piš, jednou debuguj
Avatar
vodslon
Člen
Avatar
Odpovídá na Josef Kuchař - Pepa489
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.

 
Nahoru Odpovědět
3.8.2015 15:23
Avatar
Odpovídá na vodslon
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?

Nahoru Odpovědět
3.8.2015 16:24
2x piš, jednou debuguj
Avatar
vodslon
Člen
Avatar
Odpovídá na Josef Kuchař - Pepa489
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.

 
Nahoru Odpovědět
3.8.2015 17:04
Avatar
Odpovídá na vodslon
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?

Nahoru Odpovědět
3.8.2015 17:58
2x piš, jednou debuguj
Avatar
vodslon
Člen
Avatar
Odpovídá na Josef Kuchař - Pepa489
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?

 
Nahoru Odpovědět
4.8.2015 8:00
Avatar
Odpovídá na vodslon
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.

Nahoru Odpovědět
4.8.2015 8:57
2x piš, jednou debuguj
Avatar
vodslon
Člen
Avatar
Odpovídá na Josef Kuchař - Pepa489
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.

 
Nahoru Odpovědět
4.8.2015 10:26
Avatar
Odpovídá na vodslon
Josef Kuchař - Pepa489:4.8.2015 10:39

Chtěl bych aby se na každé políčko, kde není překážka dostal

Nahoru Odpovědět
4.8.2015 10:39
2x piš, jednou debuguj
Avatar
D0ll0k
Člen
Avatar
D0ll0k:4.8.2015 19:21

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.

Nahoru Odpovědět
4.8.2015 19:21
Veni, vidi, programmato
Avatar
vodslon
Člen
Avatar
Odpovídá na Josef Kuchař - Pepa489
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...

 
Nahoru Odpovědět
4.8.2015 19:48
Avatar
Odpovídá na vodslon
Josef Kuchař - Pepa489:5.8.2015 15:27

mohl by si mi alespon zkracene napsat kod, klidne bez wf? Díky

Nahoru Odpovědět
5.8.2015 15:27
2x piš, jednou debuguj
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Josef Kuchař - Pepa489
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.

Nahoru Odpovědět
5.8.2015 15:32
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovídá na Ondřej Štorc
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.

Nahoru Odpovědět
5.8.2015 15:45
2x piš, jednou debuguj
Avatar
Josef Kuchař - Pepa489:5.8.2015 16:47

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();
            }
        }
    }
Nahoru Odpovědět
5.8.2015 16:47
2x piš, jednou debuguj
Avatar
vodslon
Člen
Avatar
Odpovídá na Josef Kuchař - Pepa489
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.

 
Nahoru Odpovědět
10.8.2015 8:32
Avatar
Odpovídá na vodslon
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 :)

Nahoru Odpovědět
10.8.2015 11:28
2x piš, jednou debuguj
Avatar
vodslon
Člen
Avatar
Odpovídá na Josef Kuchař - Pepa489
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é.

 
Nahoru Odpovědět
10.8.2015 11:49
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 18 zpráv z 18.