//QRコードから読み取ったデータをPuzzle型に変換する. public Puzzle ReadFromQRCode(Procon2017MCTProtocol.QRCodeData QRCode) { Puzzle puzzle = new Puzzle(new List <Poly>(), new List <Poly>(), new List <Line>()); int i, j; //枠 for (i = 0; i < QRCode.Frames.Count; i++) { puzzle.wakus.Add(Poly.ParsePolyFromQRCode(QRCode.Frames[i], false, -1)); } //ピース for (i = 0; i < QRCode.Polygons.Count; i++) { puzzle.pieces.Add(Poly.ParsePolyFromQRCode(QRCode.Polygons[i], true, (sbyte)i)); } //枠辺 for (i = 0; i < puzzle.wakus.Count; i++) { for (j = 0; j < puzzle.wakus[i].Count; j++) { puzzle.wakuLines.Add(new Line(puzzle.wakus[i].points[j], puzzle.wakus[i].points[j + 1], -1)); } } //初期ピース数, 盤面評価値, 盤面ハッシュ puzzle.setInitPieceNum(puzzle.pieces.Count); puzzle.setBoardScore(0); puzzle.setBoardHash(); return(puzzle); }
// 1問につき、1回実行される // ・ビュー(パズルの表示, 強調表示) // ・ソルバ(計算) // でそれぞれ1つずつのスレッドを立ち上げる。 // ソルバのViewPuzzleの中身をビューで表示する。 // //返り値:True:正常終了 public bool Syakunetsukun(Puzzle initialPuzzle) { //ソルバーを初期化(ログを消すなど) solve = new Solver(); //ソルバのスレッドを立ち上げる Task.Run(() => solve.Solve(initialPuzzle)); //solve.Solve(initialPuzzle); //コントロール(表示指令) ValueTuple <DX.KeyState, DX.Result> prev_key; ValueTuple <DX.KeyState, DX.Result> key; int strongDrawPieceId = -1; //強調表示するピースの番号 int cursor = 0; //カーソル key = DX.GetHitKeyStateAll(); while (DX.ScreenFlip() == 0 && DX.ProcessMessage() == 0 && DX.ClearDrawScreen() == 0) { prev_key = key; key = DX.GetHitKeyStateAll(); //キー操作 if (!prev_key.Item1[DX.KeyInput.Escape] && key.Item1[DX.KeyInput.Escape]) { return(true); } if (!prev_key.Item1[DX.KeyInput.NumPadEnter] && key.Item1[DX.KeyInput.NumPadEnter]) { if (cursor + 1 < solve.ViewPuzzles.Count) { cursor++; } } if (!prev_key.Item1[DX.KeyInput.Back] && key.Item1[DX.KeyInput.Back]) { //表示を1手戻す if (cursor > 0) { cursor--; } } view.UpdateDrawInfo(); //ViewPuzzles.Count == 0だったら表示に移らない if (solve.ViewPuzzles.Count == 0) { continue; } //表示したいパズルを渡す Puzzle ViewPuzzle = solve.ViewPuzzles[cursor].Clone(); if (Network.ProconPuzzleService.IsPolygonReceived) { //支援システムから、Webカメラに写った多角形を読み取る。もし読み取れて、かつ、該当する多角形が存在すればViewクラスで表示。 Poly recivedPiece = Poly.ParsePolyFromQRCode(Network.ProconPuzzleService.Polygon, true, -1); int id = CalcPieceId(ViewPuzzle, recivedPiece); if (id != -1) { strongDrawPieceId = id; } } //パズルの表示 view.Draw(ViewPuzzle); //強調表示 if (strongDrawPieceId != -1) { view.DrawPieceStrong(ViewPuzzle, strongDrawPieceId, false); } } return(false); }