using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace Sokoban {

    class SzelessegiJatekos {

        private List<Jatekos> _NyiltJatekos = new List<Jatekos>();
        private List<Jatekos> _ZartJatekos = new List<Jatekos>();
        private int[] _Palya=new int[32];
        private Point _Cel = new Point();
        private String _Iranyok;     

        public SzelessegiJatekos(Lada l) {
            l.Palya.CopyTo(_Palya,0); _Palya[l.JatekosHelye.X] |= (1 << l.JatekosHelye.Y);
            _NyiltJatekos.Add(new Jatekos(l.JatekosHelye,_Palya, ""));
            _Cel = l.Cel; _Iranyok = l.Iranyok; 
        }

        public Jatekos Kereses() {
            Jatekos j1,j2;
            if (_NyiltJatekos[0].CeleE(_Cel)) {
                _NyiltJatekos[0].Iranyok = _Iranyok; return _NyiltJatekos[0];
            }

            while (_NyiltJatekos.Count>0) {
                j1 = _NyiltJatekos[0]; _NyiltJatekos.RemoveAt(0);
                j2 = KiterjesztJatekos(j1);
                if (j2 != null){ 
                    j2.Iranyok = _Iranyok + j2.Iranyok; return j2;
                }
                _ZartJatekos.Add(j1);
            }
            return null;
        }

        public Jatekos KiterjesztJatekos(Jatekos j) {
            Jatekos uj;
            int szint = j.Szint;

            if (j.LehetE(-1, 0)) {
                uj = new Jatekos(j.HolVagyok, j.Palya, j.Iranyok);
                uj.Szint = szint; uj.Fel(); if (uj.CeleE(_Cel)) return uj;
                _NyiltJatekos.Add(uj);
            }

            if (j.LehetE(1, 0)) {
                uj = new Jatekos(j.HolVagyok, j.Palya, j.Iranyok);
                uj.Szint = szint; uj.Le(); if (uj.CeleE(_Cel)) return uj;
                _NyiltJatekos.Add(uj);
            }

            if (j.LehetE(0, 1)) {
                uj = new Jatekos(j.HolVagyok, j.Palya, j.Iranyok);
                uj.Szint = szint; uj.Jobbra(); if (uj.CeleE(_Cel)) return uj;
                _NyiltJatekos.Add(uj);
            }

            if (j.LehetE(0, -1)) {
                uj = new Jatekos(j.HolVagyok, j.Palya, j.Iranyok);
                uj.Szint = szint; uj.Balra(); if (uj.CeleE(_Cel)) return uj;
                _NyiltJatekos.Add(uj);
            }
            return null;
        }
    }
}
