Example #1
0
        /// <summary>
        /// 棋譜ファイルを読み込みます。
        /// </summary>
        private static void ExecuteLoadKifFile(ShogiUIElement3D control)
        {
            try
            {
                var dialog = new OpenFileDialog()
                {
                    DefaultExt       = ".kif",
                    Title            = "棋譜ファイルの選択",
                    Multiselect      = false,
                    RestoreDirectory = false,
                    Filter           = "Kif Files(*.kif,*.ki2)|*.kif;*.ki2|All files (*.*)|*.*",
                    FilterIndex      = 0,
                };
                var result = dialog.ShowDialog();
                if (result == null || !result.Value)
                {
                    return;
                }

                using (var reader = new StreamReader(dialog.FileName,
                                                     KifuObject.DefaultEncoding))
                {
                    LoadKif(control, reader);
                }
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                                     "棋譜ファイルの読み込みに失敗しました。( ̄ω ̄;)");
            }
        }
Example #2
0
        /// <summary>
        /// 棋譜ファイルの書き込みを行います。
        /// </summary>
        public static void SaveKif(ShogiUIElement3D control, TextWriter writer)
        {
            try
            {
                if (control == null || writer == null)
                {
                    return;
                }

                //var manager = model.MoveManager;
                //var root = manager.CreateVariationNode(control.Board);

                var headers = new Dictionary <string, string>();
                headers["先手"] = control.BlackPlayerName;
                headers["後手"] = control.WhitePlayerName;

                //var kifu = new KifuObject(headers, null);
                //KifuWriter.Save(writer, kifu);
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                                     "棋譜ファイルの出力に失敗しました( ̄ω ̄;)");
            }
        }
Example #3
0
        /// <summary>
        /// 棋譜ファイルを保存します。
        /// </summary>
        private static void ExecuteSaveKifFile(ShogiUIElement3D control)
        {
            try
            {
                var dialog = new SaveFileDialog()
                {
                    AddExtension     = true,
                    CheckFileExists  = false,
                    OverwritePrompt  = true,
                    CreatePrompt     = false,
                    Title            = "棋譜ファイルの選択",
                    RestoreDirectory = false,
                    Filter           = "Kif Files(*.kif)|*.kif|All files (*.*)|*.*",
                    FilterIndex      = 0,
                };
                var result = dialog.ShowDialog();
                if (result == null || !result.Value)
                {
                    return;
                }

                using (var writer = new StreamWriter(dialog.FileName, false,
                                                     KifuObject.DefaultEncoding))
                {
                    SaveKif(control, writer);
                }
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                                     "棋譜ファイルの保存に失敗しました( ̄ω ̄;)");
            }
        }
Example #4
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public PieceObject(ShogiUIElement3D shogi, BoardPiece piece, Square square)
        {
            this.shogi = shogi;

            IsFastInitialize = true;
            Piece            = piece;
            Square           = square;
        }
Example #5
0
        /// <summary>
        /// 棋譜ファイルのコピーを行います。
        /// </summary>
        private static void ExecuteCopyKifFile(ShogiUIElement3D control)
        {
            using (var writer = new StringWriter())
            {
                SaveKif(control, writer);

                Clipboard.SetText(writer.ToString());
            }
        }
Example #6
0
        /// <summary>
        /// 棋譜ファイルの貼り付けを行います。
        /// </summary>
        private static void ExecutePasteKifFile(ShogiUIElement3D control)
        {
            var text = Clipboard.GetText(TextDataFormat.Text);

            using (var reader = new StringReader(text))
            {
                LoadKif(control, reader);
            }
        }
Example #7
0
        private static Board GetBoard(ShogiUIElement3D control)
        {
            var board = control.Board;

            if (board == null || !board.Validate())
            {
                //DialogUtil.ShowError(
                //    "局面が正しくありません (ー_ー)");
                return(null);
            }

            return(board);
        }
Example #8
0
        /// <summary>
        /// 最終局面へ。
        /// </summary>
        private static void ExecuteGotoLastState(ShogiUIElement3D control)
        {
            if (control.EditMode != EditMode.Normal)
            {
                return;
            }

            // 局面をRedoします。
            var cloned = control.Board.Clone();

            cloned.RedoAll();
            control.Board = cloned;
        }
Example #9
0
 /// <summary>
 /// イメージのY方向インデックスを取得します。
 /// </summary>
 private static int ImageIndexY(ShogiUIElement3D shogi, BoardPiece piece)
 {
     if (piece.BWType == BWType.None)
     {
         // 駒箱の駒は常に0
         return(0);
     }
     else
     {
         // 駒台の駒は視点と同じなら0
         return(piece.BWType == shogi.ViewSide ? 0 : 2);
     }
 }
Example #10
0
        /// <summary>
        /// 盤面を反転します。
        /// </summary>
        private static void ExecuteSetReverseBoard(ShogiUIElement3D control, ExecutedRoutedEventArgs e)
        {
            try
            {
                var isWhite = (bool)e.Parameter;
                var side    = (isWhite ? BWType.White : BWType.Black);

                control.ViewSide = side;
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                                     "盤面の反転に失敗しました( ̄ω ̄;)");
            }
        }
Example #11
0
        /// <summary>
        /// コマンドが実行できるか調べます。
        /// </summary>
        private static void CanExecute(ShogiUIElement3D control, CanExecuteRoutedEventArgs e)
        {
            var canEdit = (control.EditMode == EditMode.Normal);

            var board = GetBoard(control);

            if (board == null)
            {
                return;
            }

            if (e.Command == GotoFirstState)
            {
                e.CanExecute = board.CanUndo && canEdit;
            }
            else if (e.Command == GotoLastState)
            {
                e.CanExecute = board.CanRedo && canEdit;
            }

            else if (e.Command == MoveUndo)
            {
                e.CanExecute = board.CanUndo && canEdit;
            }
            else if (e.Command == MoveRedo)
            {
                e.CanExecute = board.CanRedo && canEdit;
            }
            else if (e.Command == MoveUndoContinue)
            {
                e.CanExecute = board.CanUndo && canEdit;
            }
            else if (e.Command == MoveRedoContinue)
            {
                e.CanExecute = board.CanRedo && canEdit;
            }

            else if (e.Command == MoveStop)
            {
                e.CanExecute = (control.AutoPlayState == AutoPlayState.Playing);
            }
            else
            {
                e.CanExecute = true;
            }

            e.Handled = true;
        }
Example #12
0
        /// <summary>
        /// 1手進めます。
        /// </summary>
        private static void ExecuteMoveRedo(ShogiUIElement3D control)
        {
            if (control.EditMode != EditMode.Normal)
            {
                return;
            }

            var board = GetBoard(control);

            if (board == null)
            {
                return;
            }

            board.Redo();
        }
Example #13
0
        /// <summary>
        /// 駒描画用のイメージブラシを作成します。
        /// </summary>
        private static ImageBrush CreateBrush(ShogiUIElement3D shogi, BoardPiece piece)
        {
            if (piece == null || piece.PieceType == PieceType.None)
            {
                return(null);
            }

            var y = ImageIndexY(shogi, piece) + (!piece.IsPromoted ? 0 : 1);
            var x = (int)piece.PieceType - 1;

            // 画像にはすべての駒の絵が入っています。
            return(new ImageBrush(shogi.PieceImage)
            {
                ViewboxUnits = BrushMappingMode.RelativeToBoundingBox,
                Viewbox = new Rect(x / 8.0, y / 4.0, 1.0 / 8.0, 1.0 / 4.0),
                Stretch = Stretch.Fill,
            }.Apply(_ => _.Freeze()));
        }
Example #14
0
        /// <summary>
        /// 棋譜ファイルの読み込みを行います。
        /// </summary>
        public static void LoadKif(ShogiUIElement3D control, TextReader reader)
        {
            try
            {
                if (reader == null)
                {
                    return;
                }

                // ファイルを読み込み局面を作成します。
                var file  = KifuReader.Load(reader);
                var board = file.CreateBoard();

                control.Board = board;
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                                     "棋譜ファイルの読み込みに失敗しました( ̄ω ̄;)");
            }
        }
Example #15
0
        /// <summary>
        /// 連続して手を進めます。
        /// </summary>
        private static void ExecuteMoveRedoContinue(ShogiUIElement3D control)
        {
            if (control.EditMode != EditMode.Normal)
            {
                return;
            }

            var board = GetBoard(control);

            if (board == null)
            {
                return;
            }

            var autoPlay = new AutoPlay(board, AutoPlayType.Redo)
            {
                Interval = control.AutoPlayInterval,
            };

            control.StartAutoPlay(autoPlay);
        }
Example #16
0
        /// <summary>
        /// 棋譜ファイルの書き込みを行います。
        /// </summary>
        public static void SaveKif(ShogiUIElement3D control, TextWriter writer)
        {
            try
            {
                if (control == null || writer == null)
                {
                    return;
                }

                //var manager = model.MoveManager;
                //var root = manager.CreateVariationNode(control.Board);

                var headers = new Dictionary<string, string>();
                headers["先手"] = control.BlackPlayerName;
                headers["後手"] = control.WhitePlayerName;

                //var kifu = new KifuObject(headers, null);
                //KifuWriter.Save(writer, kifu);
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                    "棋譜ファイルの出力に失敗しました( ̄ω ̄;)");
            }
        }
Example #17
0
        /// <summary>
        /// 盤面を反転します。
        /// </summary>
        private static void ExecuteSetReverseBoard(ShogiUIElement3D control, ExecutedRoutedEventArgs e)
        {
            try
            {
                var isWhite = (bool)e.Parameter;
                var side = (isWhite ? BWType.White : BWType.Black);

                control.ViewSide = side;
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                    "盤面の反転に失敗しました( ̄ω ̄;)");
            }
        }
Example #18
0
        /// <summary>
        /// 棋譜ファイルを保存します。
        /// </summary>
        private static void ExecuteSaveKifFile(ShogiUIElement3D control)
        {
            try
            {
                var dialog = new SaveFileDialog()
                {
                    AddExtension = true,
                    CheckFileExists = false,
                    OverwritePrompt = true,
                    CreatePrompt = false,
                    Title = "棋譜ファイルの選択",
                    RestoreDirectory = false,
                    Filter = "Kif Files(*.kif)|*.kif|All files (*.*)|*.*",
                    FilterIndex = 0,
                };
                var result = dialog.ShowDialog();
                if (result == null || !result.Value)
                {
                    return;
                }

                using (var writer = new StreamWriter(dialog.FileName, false,
                                                     KifuObject.DefaultEncoding))
                {
                    SaveKif(control, writer);
                }
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                    "棋譜ファイルの保存に失敗しました( ̄ω ̄;)");
            }
        }
Example #19
0
        /// <summary>
        /// 棋譜ファイルのコピーを行います。
        /// </summary>
        private static void ExecuteCopyKifFile(ShogiUIElement3D control)
        {
            using (var writer = new StringWriter())
            {
                SaveKif(control, writer);

                Clipboard.SetText(writer.ToString());
            }
        }
Example #20
0
        /// <summary>
        /// 棋譜ファイルの読み込みを行います。
        /// </summary>
        public static void LoadKif(ShogiUIElement3D control, TextReader reader)
        {
            try
            {
                if (reader == null)
                {
                    return;
                }

                // ファイルを読み込み局面を作成します。
                var file = KifuReader.Load(reader);
                var board = file.CreateBoard();

                control.Board = board;
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                    "棋譜ファイルの読み込みに失敗しました( ̄ω ̄;)");
            }
        }
Example #21
0
        /// <summary>
        /// 最終局面へ。
        /// </summary>
        private static void ExecuteGotoLastState(ShogiUIElement3D control)
        {
            if (control.EditMode != EditMode.Normal)
            {
                return;
            }

            // 局面をRedoします。
            var cloned = control.Board.Clone();
            cloned.RedoAll();
            control.Board = cloned;
        }
Example #22
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public PieceObject(ShogiUIElement3D shogi, BoardPiece piece, Square square)
        {
            this.shogi = shogi;

            IsFastInitialize = true;
            Piece = piece;
            Square = square;
        }
Example #23
0
 /// <summary>
 /// イメージのY方向インデックスを取得します。
 /// </summary>
 private static int ImageIndexY(ShogiUIElement3D shogi, BoardPiece piece)
 {
     if (piece.BWType == BWType.None)
     {
         // 駒箱の駒は常に0
         return 0;
     }
     else
     {
         // 駒台の駒は視点と同じなら0
         return (piece.BWType == shogi.ViewSide ? 0 : 2);
     }
 }
Example #24
0
        /// <summary>
        /// 連続して手を進めます。
        /// </summary>
        private static void ExecuteMoveRedoContinue(ShogiUIElement3D control)
        {
            if (control.EditMode != EditMode.Normal)
            {
                return;
            }

            var board = GetBoard(control);
            if (board == null)
            {
                return;
            }

            var autoPlay = new AutoPlay(board, AutoPlayType.Redo)
            {
                Interval = control.AutoPlayInterval,
            };

            control.StartAutoPlay(autoPlay);
        }
Example #25
0
        /// <summary>
        /// 1手進めます。
        /// </summary>
        private static void ExecuteMoveRedo(ShogiUIElement3D control)
        {
            if (control.EditMode != EditMode.Normal)
            {
                return;
            }

            var board = GetBoard(control);
            if (board == null)
            {
                return;
            }

            board.Redo();
        }
Example #26
0
 /// <summary>
 /// 再生中の手を停止します。
 /// </summary>
 private static void ExecuteMoveStop(ShogiUIElement3D control)
 {
     control.StopAutoPlay();
 }
Example #27
0
 /// <summary>
 /// 再生中の手を停止します。
 /// </summary>
 private static void ExecuteMoveStop(ShogiUIElement3D control)
 {
     control.StopAutoPlay();
 }
Example #28
0
        /// <summary>
        /// コマンドをバインディングします。
        /// </summary>
        public static void Binding(ShogiUIElement3D control,
                                   CommandBindingCollection bindings)
        {
            bindings.Add(
                new CommandBinding(
                    LoadKifFile,
                    (_, e) => ExecuteLoadKifFile(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    SaveKifFile,
                    (_, e) => ExecuteSaveKifFile(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    PasteKifFile,
                    (_, e) => ExecutePasteKifFile(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    CopyKifFile,
                    (_, e) => ExecuteCopyKifFile(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    SetReverseBoard,
                    (_, e) => ExecuteSetReverseBoard(control, e),
                    (_, e) => CanExecute(control, e)));

            bindings.Add(
                new CommandBinding(
                    GotoFirstState,
                    (_, e) => ExecuteGotoFirstState(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    GotoLastState,
                    (_, e) => ExecuteGotoLastState(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveUndo,
                    (_, e) => ExecuteMoveUndo(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveRedo,
                    (_, e) => ExecuteMoveRedo(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveUndoContinue,
                    (_, e) => ExecuteMoveUndoContinue(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveRedoContinue,
                    (_, e) => ExecuteMoveRedoContinue(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveStop,
                    (_, e) => ExecuteMoveStop(control),
                    (_, e) => CanExecute(control, e)));
        }
Example #29
0
        private static Board GetBoard(ShogiUIElement3D control)
        {
            var board = control.Board;

            if (board == null || !board.Validate())
            {
                //DialogUtil.ShowError(
                //    "局面が正しくありません (ー_ー)");
                return null;
            }

            return board;
        }
Example #30
0
        /// <summary>
        /// コマンドが実行できるか調べます。
        /// </summary>
        private static void CanExecute(ShogiUIElement3D control, CanExecuteRoutedEventArgs e)
        {
            var canEdit = (control.EditMode == EditMode.Normal);

            var board = GetBoard(control);
            if (board == null)
            {
                return;
            }

            if (e.Command == GotoFirstState)
            {
                e.CanExecute = board.CanUndo && canEdit;
            }
            else if (e.Command == GotoLastState)
            {
                e.CanExecute = board.CanRedo && canEdit;
            }

            else if (e.Command == MoveUndo)
            {
                e.CanExecute = board.CanUndo && canEdit;
            }
            else if (e.Command == MoveRedo)
            {
                e.CanExecute = board.CanRedo && canEdit;
            }
            else if (e.Command == MoveUndoContinue)
            {
                e.CanExecute = board.CanUndo && canEdit;
            }
            else if (e.Command == MoveRedoContinue)
            {
                e.CanExecute = board.CanRedo && canEdit;
            }

            else if (e.Command == MoveStop)
            {
                e.CanExecute = (control.AutoPlayState == AutoPlayState.Playing);
            }
            else
            {
                e.CanExecute = true;
            }

            e.Handled = true;
        }
Example #31
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 public PieceObject(ShogiUIElement3D shogi, BoardPiece piece)
     : this(shogi, piece, null)
 {
 }
Example #32
0
        /// <summary>
        /// 棋譜ファイルを読み込みます。
        /// </summary>
        private static void ExecuteLoadKifFile(ShogiUIElement3D control)
        {
            try
            {
                var dialog = new OpenFileDialog()
                {
                    DefaultExt = ".kif",
                    Title = "棋譜ファイルの選択",
                    Multiselect = false,
                    RestoreDirectory = false,
                    Filter = "Kif Files(*.kif,*.ki2)|*.kif;*.ki2|All files (*.*)|*.*",
                    FilterIndex = 0,
                };
                var result = dialog.ShowDialog();
                if (result == null || !result.Value)
                {
                    return;
                }

                using (var reader = new StreamReader(dialog.FileName,
                                                     KifuObject.DefaultEncoding))
                {
                    LoadKif(control, reader);
                }
            }
            catch (Exception ex)
            {
                DialogUtil.ShowError(ex,
                    "棋譜ファイルの読み込みに失敗しました。( ̄ω ̄;)");
            }
        }
Example #33
0
        /// <summary>
        /// 駒描画用のイメージブラシを作成します。
        /// </summary>
        private static ImageBrush CreateBrush(ShogiUIElement3D shogi, BoardPiece piece)
        {
            if (piece == null || piece.PieceType == PieceType.None)
            {
                return null;
            }

            var y = ImageIndexY(shogi, piece) + (!piece.IsPromoted ? 0 : 1);
            var x = (int)piece.PieceType - 1;

            // 画像にはすべての駒の絵が入っています。
            return new ImageBrush(shogi.PieceImage)
            {
                ViewboxUnits = BrushMappingMode.RelativeToBoundingBox,
                Viewbox = new Rect(x / 8.0, y / 4.0, 1.0 / 8.0, 1.0 / 4.0),
                Stretch = Stretch.Fill,
            }.Apply(_ => _.Freeze());
        }
Example #34
0
 /// <summary>
 /// 棋譜ファイルの貼り付けを行います。
 /// </summary>
 private static void ExecutePasteKifFile(ShogiUIElement3D control)
 {
     var text = Clipboard.GetText(TextDataFormat.Text);
     using (var reader = new StringReader(text))
     {
         LoadKif(control, reader);
     }
 }
Example #35
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 public PieceObject(ShogiUIElement3D shogi, BoardPiece piece)
     : this(shogi, piece, null)
 {
 }
Example #36
0
        /// <summary>
        /// コマンドをバインディングします。
        /// </summary>
        public static void Binding(ShogiUIElement3D control,
                                   CommandBindingCollection bindings)
        {
            bindings.Add(
                new CommandBinding(
                    LoadKifFile,
                    (_, e) => ExecuteLoadKifFile(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    SaveKifFile,
                    (_, e) => ExecuteSaveKifFile(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    PasteKifFile,
                    (_, e) => ExecutePasteKifFile(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    CopyKifFile,
                    (_, e) => ExecuteCopyKifFile(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    SetReverseBoard,
                    (_, e) => ExecuteSetReverseBoard(control, e),
                    (_, e) => CanExecute(control, e)));

            bindings.Add(
                new CommandBinding(
                    GotoFirstState,
                    (_, e) => ExecuteGotoFirstState(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    GotoLastState,
                    (_, e) => ExecuteGotoLastState(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveUndo,
                    (_, e) => ExecuteMoveUndo(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveRedo,
                    (_, e) => ExecuteMoveRedo(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveUndoContinue,
                    (_, e) => ExecuteMoveUndoContinue(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveRedoContinue,
                    (_, e) => ExecuteMoveRedoContinue(control),
                    (_, e) => CanExecute(control, e)));
            bindings.Add(
                new CommandBinding(
                    MoveStop,
                    (_, e) => ExecuteMoveStop(control),
                    (_, e) => CanExecute(control, e)));
        }