/// <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); }
// 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); }
/// <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); } }
/// <summary> /// OnFieldChanged event starter /// </summary> /// <param name="e"></param> protected virtual void OnFieldChanged(TokenEventArgs e) { EventHandler <TokenEventArgs> handler = FieldChanged; handler?.Invoke(this, e); }
/// <summary> /// OnTokensKilled event starter /// </summary> /// <param name="e"></param> protected virtual void OnTokensKilled(TokenEventArgs e) { EventHandler <TokenEventArgs> handler = TokensKilled; handler?.Invoke(this, e); }
/// <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; } }
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++; }