Go-Probleme nach Anzahl der Züge sortieren

Was ich schon lange vorhatte, aber immer zu faul dazu war: Ich möchte meine Tesuji-Probleme (Tesuji – Taktiken des Nahkampfs im Go-Spiel), die ich mühsam per Hand aus James Davies Buch in einen SGF-Editor eingetippt habe, nach Schwierigkeit sortieren. Sie sind mir nämlich immer noch zu schwer. Zumindest einige davon. Nun, da ich .NET und C# lernen will, kommt dazu die passende Gelegenheit.

Also importiere ich mir alle 434 einzelne SGF (Smart Game Format)- Dateien in ebenso viele Objekte vom Typ GoProblem:

namespace GoProblemsSort
{
    public class GoProblem
    {
        public GoProblem(string filename, string content)
        {
            Topic = GetDescription(filename);
            Content = content;

            int count = Content.Split(';').Length - 1;
            Number = (count-1);

            int descpos = Content.IndexOf("C[");
            if (descpos > 0)
            {
                Content = Content.Insert(descpos + 2, Topic + " ");
            }
            else
            {
                int last = Content.IndexOf(")");
                Content = Content.Insert(last, "C[" + Topic + "]");

            }

        }
        public int Number { get; set; }
        public string Content { get; set; }

        private string GetDescription(string filename)
        {
            int index = filename.IndexOf("_");
            string chapter = filename.Substring(0, index);

            switch (chapter)
            {
                case "2":
                    return "Capture the Cutting Stones";

                case "3":
                    return "Amputate the Cutting Stones";

                case "4":
                    return "Ko";

                case "5":
                    return "When Liberties Count";

                case "6":
                    return "Linking Groups together";

                case "7":
                    return "Into Enemy Territory";

                case "8":
                    return "Escape";

                case "9":
                    return "Sacrifice to gain Tempo";

                case "a9":
                    return "Tesuji for Attack";

                case "b9":
                    return "How to connect";

                case "c9":
                    return "Making Shape";

                case "d9":
                    return "Ignore the Atari";

                case "e9":
                    return "Double-Threat Tesuji";

                default:
                    return "Default Description";
            }
        }

    }

}

Nun schreibe ich mir ein Programm, dass auf Knopfdruck alle Objekte mit dem Dateinamen und dem Dateiinhalt initialisiert. Da ich den Namen der Datei früher so gewählt habe, dass er der Schlüssel für ein Kapitel ist, habe ich jetzt die Gelegenheit mittels String-Manipulation den Kapitel-Text in den SGF-Code Content des Objekts hinein zu schreiben. Die Anzahl der Züge der Lösung interpretiere ich einfach mal als Schwierigkeit und schreibe sie in das Feld Nummer des Objekts. Mit nur einer Zeile sortiere ich alle Objekte, die ich in einer Liste festhalte nach Nummer. Nun lasse ich einen Verzeichnisauswahl-Dialog aufploppen und schreibe alle SGF-Inhalte der Objekte in der von mir geschaffenen Reihenfolge in eine große Datei. Diese Datei kann ich uligo, ein Go-Problemtrainer zu fressen geben


namespace GoProblemsSort
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            GoProblems = new List<GoProblem>();
        }

        public List<GoProblem> GoProblems { get; set; }

        private void Button_LoadFile_Click(object sender, RoutedEventArgs e)
        {
            DirectoryInfo dir = new DirectoryInfo(@"C:\Users\Oliver\Backup\go\tesuji\tesuji");
            foreach (FileInfo f in dir.GetFiles("*.sgf"))
            {

                using (FileStream fs = f.OpenRead())
                {

                    string filecontent = "";

                    byte[] b = new byte[1024];
                    UTF8Encoding temp = new UTF8Encoding(true);
                    while (fs.Read(b, 0, b.Length) > 0)
                    {
                        filecontent += temp.GetString(b);
                    }

                    GoProblem gp = new GoProblem(f.Name, filecontent);
                    GoProblems.Add(gp);

                }

            }

            GoProblems = GoProblems.OrderBy(i => i.Number).ToList();

            FolderBrowserDialog folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();

            DialogResult result = folderBrowserDialog1.ShowDialog();
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                string folderName = folderBrowserDialog1.SelectedPath;
                string filename = "Tesujis.sgf";
                string path = @folderName + "\\" + filename;
                FileInfo fi = new FileInfo(path);

                FileStream fs = fi.Create();
                StreamWriter sw = new StreamWriter(fs);

                foreach (GoProblem gp in GoProblems)
                    sw.Write(gp.Content);
            }

        }
    }

}
 

Hinterlassen Sie eine Antwort