private void InitListViewContents() { var setting = TheApp.app.Config.GameResultSetting; var csv = new GameResultTable(); var lines = csv.ReadOrCreate(setting.CsvFilePath()); var items = new List <ListViewItem>(); // 逆順にしないといけないのでいったんここに入れる。 foreach (var result in lines) { // 解析できなかった行はnullになってしまうので、この判定必要。 if (result == null) { continue; } string[] list; try { if (!string.IsNullOrEmpty(result.Comment)) { // コメント行なら、とりあえず対局日時のところに表示しておく。 list = new[] { result.Comment }; } else { var game_result = result.LastMove.GameResult(); if (result.LastColor == SCore.Color.WHITE) // 後手から見た結果なので反転させる。 { game_result = game_result.Not(); } var game_result_string = game_result.Pretty(result.Handicapped); var special_move_string = result.LastMove.SpecialMoveToKif(); list = new[] { result.StartTime.ToString(), result.PlayerNames[0], result.PlayerNames[1], result.BoardType.Pretty(), result.GamePly.ToString(), game_result_string, special_move_string, result.TimeSettingString, result.KifuFileName, }; } } catch (Exception ex) { list = new[] { $"行の解析に失敗しました。{ex.Message}" }; } var item = new ListViewItem(list); items.Add(item); } // 逆順にする。 items.Reverse(); listView1.Items.AddRange(items.ToArray()); }
/// <summary> /// 棋譜の自動保存処理 /// </summary> private void AutomaticSaveKifu(Move lastMove) { try { var lastColor = Position.sideToMove; // 1) 勝敗のカウンターを加算 // (これは棋譜の自動保存が無効であってもなされなくてはならない) continuousGame.IncResult(lastMove, lastColor); // この対局棋譜を保存しなければならないなら保存する。 var setting = TheApp.app.Config.GameResultSetting; if (!setting.AutomaticSaveKifu) { return; } // 2) 棋譜ファイルを保存する。 // プレイヤー名を棋譜上に反映させる。 // → これは、DisplayName()と同等であればすでに設定されている。 var kifu = kifuManager.ToString(setting.KifuFileType); var filename = $"{continuousGame.GetKifuSubfolder()}{DefaultKifuFileName()}{setting.KifuFileType.ToExtensions()}"; var filePath = Path.Combine(setting.KifuSaveFolder, filename); FileIO.WriteFile(filePath, kifu); // 3) csvファイルに情報をappendする。 var table = new GameResultTable(); var csv_path = setting.CsvFilePath(); var handicapped = Position.Handicapped; var timeSettingStrings = !handicapped ? $"先手:{TimeSettingString(Color.BLACK)},後手:{TimeSettingString(Color.WHITE)}" : $"下手:{TimeSettingString(Color.BLACK)},上手:{TimeSettingString(Color.WHITE)}"; var result = new GameResultData() { PlayerNames = new[] { DisplayNameWithPreset(Color.BLACK), DisplayNameWithPreset(Color.WHITE) }, StartTime = continuousGame.StartTime, EndTime = continuousGame.EndTime, KifuFileName = filename, LastMove = lastMove, LastColor = lastColor, GamePly = Position.gamePly - 1 /* 31手目で詰まされている場合、棋譜の手数としては30手であるため。 */, BoardType = kifuManager.Tree.rootBoardType, TimeSettingString = timeSettingStrings, Handicapped = handicapped, Comment = null, }; table.AppendLine(csv_path, result); // 連続対局の最終局であるなら、連続対局のトータルの結果を出力する。 if (continuousGame.IsLastGame()) { // これが連続対局の最終局であったのなら、結果を書き出す。 result = new GameResultData() { Comment = continuousGame.GetGameResultString() }; table.AppendLine(csv_path, result); } } catch (Exception ex) { // ファイルの書き出しに失敗などで例外が出て落ちるのはちょっと格好が悪いので捕捉しておく。 TheApp.app.MessageShow(ex, false); } }