Пример #1
0
        /// <summary>
        /// move tokens to current slide direction to fill holes on a field
        /// </summary>
        /// <returns></returns>
        public bool Slide()
        {
            int dx = 0;
            int dy = 0;

            switch (SlideDirection)
            {
            case Directions.Left: dx = -1; break;

            case Directions.Right: dx = 1; break;

            case Directions.Up: dy = 1; break;

            case Directions.Down: dy = -1; break;
            }
            bool reslide;
            bool result = false;

            do
            {
                reslide = false;
                for (int x = 0; x < FieldLength; x++)
                {
                    for (int y = 0; y < sizeH; y++)
                    {
                        if (InRange(x + dx, y + dy))
                        {
                            if (Data[x, y].Alive)
                            {
                                if (!Data[x + dx, y + dy].Alive)
                                {
                                    Swap(x, y, x + dx, y + dy);
                                    reslide = true;
                                    result  = true;
                                }
                            }
                        }
                    }
                }
            } while (reslide);
            if (result)
            {
                TokenEventArgs ea = new TokenEventArgs();
                OnFieldChanged(ea);
            }
            return(result);
        }
Пример #2
0
        // used in GetLines
        private bool CheckCluster(bool FindAndKill, List <ItemData> Cluster)
        {
            TokenEventArgs ea = new TokenEventArgs();

            if (Cluster.Count > 0)
            {
                if (FindAndKill)
                {
                    foreach (ItemData itd in Cluster)
                    {
                        Data[itd.x, itd.y].Kill();
                        TotalTokens--;
                        ea.Tokens.Add(new GameTokenData(itd));
                    }
                    OnTokensKilled(ea);
                }
                return(true);
            }
            return(false);
        }
Пример #3
0
        /// <summary>
        /// Fill holes on a field with random tokens
        /// </summary>
        /// <param name="nolines">ensure filled tokens never result a ready solution</param>
        public void Fill(bool nolines = false)
        {
            TokenEventArgs ea = new TokenEventArgs();

            bool loop = false;

            do
            {
                loop = false;
                for (int x = 0; x < sizeL; x++)
                {
                    for (int y = 0; y < sizeH; y++)
                    {
                        if (InRange(x, y))
                        {
                            if (!Data[x, y].Alive)
                            {
                                //GameToken t = ;
                                Data[x, y] = new GameToken(NextSeed);
                                ea.Tokens.Add(new GameTokenData(x, y, Data[x, y]));
                                TotalTokens++;
                            }
                        }
                    }
                }

                while (nolines && GetLines())
                {
                    Slide();
                    loop = true;
                }
            } while (loop);
            if (ea.Tokens.Count > 0)
            {
                OnTokensAdded(ea);
            }
        }
Пример #4
0
        /// <summary>
        /// OnFieldChanged event starter
        /// </summary>
        /// <param name="e"></param>
        protected virtual void OnFieldChanged(TokenEventArgs e)
        {
            EventHandler <TokenEventArgs> handler = FieldChanged;

            handler?.Invoke(this, e);
        }
Пример #5
0
        /// <summary>
        /// OnTokensKilled event starter
        /// </summary>
        /// <param name="e"></param>
        protected virtual void OnTokensKilled(TokenEventArgs e)
        {
            EventHandler <TokenEventArgs> handler = TokensKilled;

            handler?.Invoke(this, e);
        }
Пример #6
0
        /// <summary>
        /// Fill holes on a field with random tokens, according to slide direction
        /// </summary>
        /// <param name="nolines"></param>
        public void FillOneLine(bool nolines = false)
        {
            TokenEventArgs ea = new TokenEventArgs();

            switch (SlideDirection)
            {
            case Directions.Up:

                for (int x = 0; x < sizeH; x++)
                {
                    int y = sizeH - 1;
                    while ((y >= 0) && (Data[x, y].Alive))
                    {
                        y--;
                    }
                    if (y >= 0)
                    {
                        AddToken(x, y, ea);
                    }
                }
                break;

            case Directions.Down:
                for (int x = 0; x < sizeH; x++)
                {
                    int y = 0;
                    while ((y < sizeH) && (Data[x, y].Alive))
                    {
                        y++;
                    }
                    if (y < sizeH)
                    {
                        AddToken(x, y, ea);
                    }
                }
                break;

            case Directions.Right:
                for (int y = 0; y < sizeH; y++)
                {
                    int x = sizeH - 1;
                    while ((x >= 0) && (Data[x, y].Alive))
                    {
                        x--;
                    }
                    if (x >= 0)
                    {
                        AddToken(x, y, ea);
                    }
                }
                break;

            case Directions.Left:
                for (int y = 0; y < sizeH; y++)
                {
                    int x = 0;
                    while ((x < sizeH) && (Data[x, y].Alive))
                    {
                        x++;
                    }
                    if (x < sizeL)
                    {
                        AddToken(x, y, ea);
                    }
                }
                break;
            }
            if (ea.Tokens.Count > 0)
            {
                OnTokensAdded(ea);
            }
            else
            {
                TotalTokens = sizeH * sizeL;
            }
        }
Пример #7
0
 private void AddToken(int x, int y, TokenEventArgs ea)
 {
     Data[x, y] = new GameToken(NextSeed);
     ea.Tokens.Add(new GameTokenData(x, y, Data[x, y]));
     TotalTokens++;
 }