zoukankan      html  css  js  c++  java
  • x01.Weiqi.2 保存棋谱

    高手对决:上官金虹环在心,小李飞刀刀已发。牵强到编程:设计,时时刻刻环在心;实现,勇往直前刀已发。虽然最终小李飞刀战胜了上官金虹,但这并不表示实践高于理论。
    —— 实践,理论,再实践 ... 这是个无穷递归!
          此中有深意,欲辨已忘言。
    保存棋谱的功能,相对提子算法,要简单得多。
    首先,添加一个数据库文件:DbStep.mdf;建立表:Steps;添加两个字段:ID,StepContent。ID 为自动加一,StepContent 为 text 类型。需要说明的是,在程序中,Steps 表示所有的棋步,即一局棋。而在数据库中,Steps却表示所有的棋局。单独一局棋的内容,保存在 StepContent 字段中。这是冲突的地方,但将表名改为 Stepses,又显得不伦不类。使用 Entity Framework 技术,剩下的不值一提,Skip!
    将保存的棋谱加载并显示运行,需用到 x01.Weiqi.1 中的功能。所以,到了重构的时候。
    重构后的关键类图如下:
    主要功能都在 BoardBase 中实现。加载并运行的逻辑,单独写入 StepBoard 类。
    代码文件 StepBoard.cs 的内容如下:
    StepBoard
    namespace x01.Weiqi.Board
    {
    class StepBoard : BoardBase
    {
    List
    <StepContent> m_StepContent =new List<StepContent>();
    int m_count =1;

    struct StepContent
    {
    publicint Col;
    publicint Row;
    publicint Count;
    }

    public StepBoard(int chessSize =38)
    :
    base(chessSize)
    {
    SettingsWindow settingsWin
    =new SettingsWindow();
    settingsWin.ShowDialog();
    int id = settingsWin.ID;
    GetStepContent(id);
    }

    publicvoid GetStepContent(int id)
    {
    string steps = StepService.GetSteps(id);
    if (string.IsNullOrEmpty(steps))
    {
    MessageBox.Show(
    "Cannot get step content!");
    return;
    }

    m_StepContent.Clear();
    StepContent stepContent
    =new StepContent();
    string[] step = steps.Split(',');
    for (int i =0; i < step.Length; i++)
    {
    if (i %3==0)
    {
    stepContent
    =new StepContent();
    stepContent.Col
    = Convert.ToInt32(step[i]);
    }
    elseif (i %3==1)
    {
    stepContent.Row
    = Convert.ToInt32(step[i]);
    }
    elseif (i %3==2)
    {
    stepContent.Count
    = Convert.ToInt32(step[i]);
    m_StepContent.Add(stepContent);
    }
    }
    }

    publicvoid NextOne()
    {
    if (m_count >= m_StepContent.Count)
    {
    return;
    }

    foreach (var item in m_StepContent)
    {
    // If 内为复制,但并不以为不好
    if (item.Count == m_count)
    {
    int col = item.Col;
    int row = item.Row;

    if (Steps[col, row].Color != ChessColor.Empty)
    {
    return;
    }

    if (NotInPos.X == col && NotInPos.Y == row)
    {
    return;
    }
    else
    {
    // If Pos(struct) is property, must use new.
    NotInPos =new Pos(-1, -1);
    }

    DrawChess(col, row);

    Eat(col, row);
    }
    }
    m_count
    ++;
    }

    protectedoverridevoid OnMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e)
    {
    base.OnMouseLeftButtonDown(e);

    NextOne();
    }

    protectedoverridevoid OnMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
    {
    base.OnMouseRightButtonDown(e);

    if (m_count <=1)
    {
    return;
    }

    BackOne();
    m_count
    --;
    }
    }
    }
    源代码可从 http://www.cnblogs.com/china_x01  的 download\code\x01.Weiqi 获取。
    Copyright (c) 2011 by x01(china_x01@qq.com),未经许可,请勿转载。
  • 相关阅读:
    马士兵_聊天系统_知识储备库
    最近一些情况
    JAVA坦克大战项目练习日4
    JAVA坦克大战项目练习日3
    JAVA坦克大战项目练习日2
    JAVA坦克大战项目练习日1
    课后实战String的一些细节
    Java从入门到精通之数组篇
    58_自定义标签打包以及使用自定义标签教程
    javaWeb安全篇(1)——防盗链技术的实现
  • 原文地址:https://www.cnblogs.com/china_x01/p/2046000.html
Copyright © 2011-2022 走看看