Example #1
0
        public List <pohyb> run(int steps)     // funkcia pre beh programu pre jedinca, pocet krokov je nastavenych premennou steps
        {
            var p = new pole();

            p.startovnaPozicia();

            var result = new List <pohyb>();
            var ip     = 0;

            while (steps-- > 0)                 // pokial nepresiahne urceny pocet krokov
            {
                var inst = mem[ip];             // premenna pre instrukciu, ukazuje na pamatovu bunku
                var op   = inst >> 6;           // premenna pre operaciu, co ma program vykonat (inkrementacia, dekrementacia, skok alebo vypis)
                var adr  = (byte)(inst & 0x3f); // premenna pre adresu (0011 1111)

                /*if (ip == 0 || ip == 1)
                 * {
                 *  Console.WriteLine("inst: " + Convert.ToString(inst, 2));
                 *  Console.WriteLine("op: " + Convert.ToString(op, 2));
                 *  Console.WriteLine("adr: " + Convert.ToString(adr, 2));
                 * }*/

                switch (op)     // podla operacie vykonaj konkretnu akciu
                {
                case 0:         // inkrementacia
                    mem[adr]++;
                    ip++;
                    break;

                case 1:             // dekrementacia
                    mem[adr]--;
                    ip++;
                    break;

                case 2:             // skok
                    ip = adr;
                    break;

                case 3:             // vypis
                    var pocet = bitcount(mem[adr]);
                    var prem  = 0;
                    if (pocet <= 2)
                    {
                        prem = 0;
                    }
                    else if (pocet <= 4)
                    {
                        prem = 1;
                    }
                    else if (pocet <= 6)
                    {
                        prem = 2;
                    }
                    else
                    {
                        prem = 3;
                    }

                    result.Add((pohyb)(prem));
                    ip++;
                    if (p.testJeMimo((pohyb)(prem)))          // skontroluj, ci je mimo, ak ano, skonci program pre daneho jedinca
                    {
                        return(result);
                    }
                    break;
                }
                if (ip >= 64)
                {
                    ip = 0;                 // ak sa dostane na koniec pola, tak chod od zaciatku
                }
            }
            //Console.WriteLine("Dosiahnuty limit poctu krokov");
            return(result);
        }