/// <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, "棋譜ファイルの読み込みに失敗しました。( ̄ω ̄;)"); } }
/// <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, "棋譜ファイルの出力に失敗しました( ̄ω ̄;)"); } }
/// <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, "棋譜ファイルの保存に失敗しました( ̄ω ̄;)"); } }
/// <summary> /// コンストラクタ /// </summary> public PieceObject(ShogiUIElement3D shogi, BoardPiece piece, Square square) { this.shogi = shogi; IsFastInitialize = true; Piece = piece; Square = square; }
/// <summary> /// 棋譜ファイルのコピーを行います。 /// </summary> private static void ExecuteCopyKifFile(ShogiUIElement3D control) { using (var writer = new StringWriter()) { SaveKif(control, writer); Clipboard.SetText(writer.ToString()); } }
/// <summary> /// 棋譜ファイルの貼り付けを行います。 /// </summary> private static void ExecutePasteKifFile(ShogiUIElement3D control) { var text = Clipboard.GetText(TextDataFormat.Text); using (var reader = new StringReader(text)) { LoadKif(control, reader); } }
private static Board GetBoard(ShogiUIElement3D control) { var board = control.Board; if (board == null || !board.Validate()) { //DialogUtil.ShowError( // "局面が正しくありません (ー_ー)"); return(null); } return(board); }
/// <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; }
/// <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); } }
/// <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, "盤面の反転に失敗しました( ̄ω ̄;)"); } }
/// <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; }
/// <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(); }
/// <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())); }
/// <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, "棋譜ファイルの読み込みに失敗しました( ̄ω ̄;)"); } }
/// <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); }
/// <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, "棋譜ファイルの出力に失敗しました( ̄ω ̄;)"); } }
/// <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); } }
/// <summary> /// 再生中の手を停止します。 /// </summary> private static void ExecuteMoveStop(ShogiUIElement3D control) { control.StopAutoPlay(); }
/// <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))); }
private static Board GetBoard(ShogiUIElement3D control) { var board = control.Board; if (board == null || !board.Validate()) { //DialogUtil.ShowError( // "局面が正しくありません (ー_ー)"); return null; } return board; }
/// <summary> /// コンストラクタ /// </summary> public PieceObject(ShogiUIElement3D shogi, BoardPiece piece) : this(shogi, piece, null) { }
/// <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()); }