//Q each candidate for horiz/vert 3 in a row 1 at a time. //if match, add to temp; else see if temp has >= 3 //if so, record for destroying and clear temp, otherwise clear temp. private void Check3PlusInDirection(GemmLoc gemmKey, int horiz, int vert) { Queue Check3Q = new Queue(); Check3Q.Enqueue(gemmKey); while (Check3Q.Count > 0) { GemmLoc key = (GemmLoc)Check3Q.Dequeue(); if (FloodMatchDict.ContainsKey(key)) { Check3List.Add(key); GemmLoc newKey = new GemmLoc { gridXLoc = key.gridXLoc + horiz, gridYLoc = key.gridYLoc + vert, }; Check3Q.Enqueue(newKey); } else { if (Check3List.Count >= 3) { for (int i = 0; i < Check3List.Count; i++) { if (!GemmDictToDestroy.ContainsKey(Check3List[i])) { GemmDictToDestroy.Add(Check3List[i], GemmGridLayout[Check3List[i].gridXLoc, Check3List[i].gridYLoc]); } } } Check3List.Clear(); break; } } }
//Mark blob of same colored gemms; track with Floodmatchdict private void FloodMark(int x, int y, string origTag) { //create ToDo List Stack gemmStack = new Stack(); gemmStack.Push(GemmGridLayout[x, y]); //while ToDo List not empty while (gemmStack.Count > 0) { Gemm gemmLFM = (Gemm)gemmStack.Pop(); GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc].floodVisited = true; if (gemmLFM.gemmGObj.tag == origTag) { GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc].floodMatched = true; //create key to add to running list GemmLoc key = new GemmLoc { gridXLoc = gemmLFM.gridXLoc, gridYLoc = gemmLFM.gridYLoc, }; if (!FloodMatchDict.ContainsKey(key)) { FloodMatchDict.Add(key, GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc]); } //add appropriate cells around current to the ToDoList if (gemmLFM.gridXLoc > 0) { if (!GemmGridLayout[gemmLFM.gridXLoc - 1, gemmLFM.gridYLoc].floodVisited && !GemmGridLayout[gemmLFM.gridXLoc - 1, gemmLFM.gridYLoc].destroyed) { gemmStack.Push(GemmGridLayout[gemmLFM.gridXLoc - 1, gemmLFM.gridYLoc]); } } if (gemmLFM.gridXLoc < boardDimX - 1) { if (!GemmGridLayout[gemmLFM.gridXLoc + 1, gemmLFM.gridYLoc].floodVisited && !GemmGridLayout[gemmLFM.gridXLoc + 1, gemmLFM.gridYLoc].destroyed) { gemmStack.Push(GemmGridLayout[gemmLFM.gridXLoc + 1, gemmLFM.gridYLoc]); } } if (gemmLFM.gridYLoc > 0) { if (!GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc - 1].floodVisited && !GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc - 1].destroyed) { gemmStack.Push(GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc - 1]); } } if (gemmLFM.gridYLoc < boardDimY - 1) { if (!GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc + 1].floodVisited && !GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc + 1].destroyed) { gemmStack.Push(GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc + 1]); } } } } }