예제 #1
0
        //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);
        }
예제 #2
0
        // 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);
        }