static void Main(string[] args) { Console.WriteLine("Single Plyaer Mode?(Y/y)"); bool singlePlayer = Console.ReadLine().ToLower().Contains("y"); AdbWrapper adb = new AdbWrapper(); int[][] board = new int[9][]; StringBuilder sboard = new StringBuilder(); Rectangle boardRegion = singlePlayer ? new Rectangle(55, 407, 966, 966) : new Rectangle(55, 330, 966, 966); float offset = 5; using (var img = adb.GetScreenshot()) using (var boardImg = img.Clone(boardRegion, img.PixelFormat)) { using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.TesseractAndCube)) { engine.SetVariable("tessedit_char_whitelist", "0123456789"); for (int i = 0; i < 9; i++) { board[i] = new int[9]; for (int j = 0; j < 9; j++) { float x = boardImg.Width / 9f * j + offset; float y = boardImg.Height / 9f * i + offset; float w = boardImg.Width / 9f - offset * 2f; float h = boardImg.Height / 9f - offset * 2f; using (var cell = boardImg.Clone(new RectangleF(x, y, w, h), boardImg.PixelFormat)) using (var cellx = new Bitmap(cell, new Size(cell.Width / 4, cell.Height / 4))) using (var page = engine.Process(cellx, PageSegMode.SingleChar)) { var text = page.GetText(); if (string.IsNullOrWhiteSpace(text)) { board[i][j] = 0; sboard.Append('.'); } else { board[i][j] = text[0] - '0'; sboard.Append(text[0]); } } } sboard.Append('\n'); } } } Console.WriteLine(sboard); var option = StringSplitOptions.RemoveEmptyEntries; var mod = Console.ReadLine().Split(new char[] { ' ' }, option).Select(a => int.Parse(a)).ToArray(); while (mod.Length == 3) { sboard[mod[0] * 10 + mod[1]] = (char)(mod[2] + '0'); mod = Console.ReadLine().Split(new char[] { ' ' }, option).Select(a => int.Parse(a)).ToArray(); } Console.WriteLine(sboard); var puzzle = SudokuPuzzle.FromString(sboard.ToString(), 3, 3); puzzle.SolveGrid(); Console.WriteLine(puzzle); int kx = 160 + 75; int ky = singlePlayer ? 1460 + 75 : 1356 + 75; int cellh = boardRegion.Height / 9; int cellw = boardRegion.Width / 9; int bx = boardRegion.X + boardRegion.Width / 18; int by = boardRegion.Y + boardRegion.Height / 18; int index = 0; foreach (var node in puzzle.GetNodes()) { int v = node.Value; adb.Tap(kx + v % 5 * 150, ky + v / 5 * 150); adb.Tap(bx + index % 9 * cellw, by + index / 9 * cellh); index++; } }