/// <summary> /// Seperate a one-group crozzle into multi-group crozzle /// </summary> /// <param name="cp">One-group crozzle</param> /// <returns>One multi-group crozzle</returns> public static CrozzlePartial SeperateGroups(CrozzlePartial cp) { int bestScore = 0; List <Word> bestUsedWords = new List <Word>(); for (int i = 0; i < cp.GetUsedWord().Count; i++) { List <Word> usedWords = new List <Word>(); for (int j = 0; j < cp.GetUsedWord().Count; j++) { usedWords.Add(cp.GetUsedWord()[j]); } Word deleteWord = cp.GetUsedWord()[i]; usedWords.Remove(cp.GetUsedWord()[i]); int groups; try { WordGroupServiceClient ws; string endpoint = "BasicHttpBinding_IWordGroupService"; ws = new WordGroupServiceClient(endpoint); Grid grid = new Grid(PublicInfo.GetFullRows(), PublicInfo.GetFullColumns(), usedWords); string[] stringGrid = ConvertToString(grid.GetGrid(), PublicInfo.GetFullRows(), PublicInfo.GetFullColumns()); groups = ws.Count(stringGrid); } catch { // use local group calculation method if online method fail groups = CalculateGroup(usedWords); } int score = CalculateScoreAfterRemovingAWord(cp, cp.GetUsedWord()[i]); if (groups >= PublicInfo.GetMinGroups() && groups <= PublicInfo.GetMaxGroups() && score > bestScore && CheckAllIntersections(usedWords)) { bestScore = score; bestUsedWords = usedWords; } } // generate a multi-groups crozzle with used words cp.SetUsedWord(bestUsedWords); cp.SetScore(bestScore); cp.SetGrid(new Grid(PublicInfo.GetFullRows(), PublicInfo.GetFullColumns(), bestUsedWords)); return(cp); }
private CrozzlePartial GenerateInitialCrozzle(string initialWordContent, List <string> wlist) { CrozzlePartial cp = new CrozzlePartial(); // set initial word position Word initialWord = SetInitialWordPositionAndCrozzlePosition(initialWordContent, cp); // set initial crozzle List <Word> usedWord = new List <Word>(); usedWord.Add(initialWord); Grid g = new Grid(PublicInfo.GetFullRows(), PublicInfo.GetFullColumns(), usedWord); cp.SetGrid(g); cp.SetUsedWord(usedWord); cp.SetWordlist(wlist); int initialScore = GetInitialScore(initialWordContent); cp.SetScore(initialScore + PublicInfo.GetPointsPerWord()); return(cp); }
public static CrozzlePartial InsertWord(CrozzlePartial cp, Word s, int addScore) { CrozzlePartial returnCP = new CrozzlePartial(); returnCP.SetWidth(cp.GetWidth()); returnCP.SetHeight(cp.GetHeight()); returnCP.SetMaxHeight(cp.GetMaxHeight()); returnCP.SetMinHeight(cp.GetMinHeight()); returnCP.SetMaxWidth(cp.GetMaxWidth()); returnCP.SetMinWidth(cp.GetMinWidth()); List <string> wordlist = new List <string>(); for (int i = 0; i < cp.GetWordlist().Count; i++) { wordlist.Add(cp.GetWordlist()[i]); } List <Word> usedWord = new List <Word>(); for (int i = 0; i < cp.GetUsedWord().Count; i++) { usedWord.Add(cp.GetUsedWord()[i]); } Grid grid = new Grid(); int score = cp.GetScore(); wordlist.Remove(s.GetWordContent()); usedWord.Add(s); char[,] charGrid = new char[PublicInfo.GetFullRows(), PublicInfo.GetFullColumns()]; for (int i = 0; i < PublicInfo.GetFullRows(); i++) { for (int j = 0; j < PublicInfo.GetFullColumns(); j++) { charGrid[i, j] = cp.GetGrid().GetGrid()[i, j]; } } int minHeight = cp.GetMinHeight(); int maxHeight = cp.GetMaxHeight(); int minWidth = cp.GetMinWidth(); int maxWidth = cp.GetMaxWidth(); if (s.GetType().Equals("ROW")) { int rows = s.GetRows() - 1; int columnsBegin = s.GetColumns() - 1; int columnsEnd = s.GetColumns() + s.GetWordContent().Length - 2; if (rows > maxHeight) { returnCP.SetMaxHeight(rows); } if (rows < minHeight) { returnCP.SetMinHeight(rows); } if (columnsBegin < minWidth && columnsEnd > maxWidth) { returnCP.SetMaxWidth(columnsEnd); returnCP.SetMinWidth(columnsBegin); } else if (columnsBegin < minWidth && columnsEnd <= maxWidth) { returnCP.SetMinWidth(columnsBegin); } else if (columnsBegin >= minWidth && columnsEnd > maxWidth) { returnCP.SetMaxWidth(columnsEnd); } for (int i = 0; i < s.GetWordContent().Length; i++) { charGrid[s.GetRows() - 1, s.GetColumns() + i - 1] = s.GetWordContent()[i]; } } else if (s.GetType().Equals("COLUMN")) { int columns = s.GetColumns() - 1; int rowsBegin = s.GetRows() - 1; int rowsEnd = s.GetRows() + s.GetWordContent().Length - 2; if (columns > maxWidth) { returnCP.SetMaxWidth(columns); } if (columns < minWidth) { returnCP.SetMinWidth(columns); } if (rowsBegin < minHeight && rowsEnd > maxHeight) { returnCP.SetMaxHeight(rowsEnd); returnCP.SetMinHeight(rowsBegin); } else if (rowsBegin < minHeight && rowsEnd <= maxHeight) { returnCP.SetMinHeight(rowsBegin); } else if (rowsBegin >= minHeight && rowsEnd > maxHeight) { returnCP.SetMaxHeight(rowsEnd); } for (int i = 0; i < s.GetWordContent().Length; i++) { charGrid[s.GetRows() + i - 1, s.GetColumns() - 1] = s.GetWordContent()[i]; } } score += addScore; grid.SetGrid(charGrid); returnCP.SetGrid(grid); // Set & Return returnCP.SetUsedWord(usedWord); returnCP.SetWordlist(wordlist); returnCP.SetGrid(grid); returnCP.SetScore(score); return(returnCP); }