原来的代码全部删除,进行了深层次重构,得其意而忘其言。得意之处有二:

1.关于显示

以 StoneSize 属性为依托,在 set 中加了一句:Width = Height = m_StoneSize * 19;以此来控制棋盘大小。所有的对象在 Init() 方法中创建,而具体的渲染在 Redraw() 方法中完成。这种创建与重绘相分开的办法,使调整大小时进行重绘更简单易行。这两个方法的代码如下:

 1 void Init()
 2         {
 3             // 线
 4             for (int i = 0; i < 19; i++) {
 5                 m_LinesH[i] = new Line();
 6                 m_LinesH[i].Stroke = Brushes.Black;
 7                 m_Canvas.Children.Add(m_LinesH[i]);
 8 
 9                 m_LinesV[i] = new Line();
10                 m_LinesV[i].Stroke = Brushes.Black;
11                 m_Canvas.Children.Add(m_LinesV[i]);
12             }
13 
14             //
15             for (int j = 0; j < 3; j++) {
16                 for (int i = 0; i < 3; i++) {
17                     m_Stars[i, j] = new Ellipse();
18                     m_Stars[i, j].Fill = Brushes.Black;
19                     m_Canvas.Children.Add(m_Stars[i, j]);
20                 }
21             }
22 
23             for (int i = 0; i < 19; i++) {
24                 for (int j = 0; j < 19; j++) {
25                     m_Stones[i, j] = new Ellipse();
26                     m_Stones[i, j].Visibility = Visibility.Hidden;
27                     m_Canvas.Children.Add(m_Stones[i, j]);
28 
29                     m_Numbers[i, j] = new TextBlock();
30                     m_Numbers[i, j].Background = Brushes.Transparent;
31                     m_Numbers[i, j].Visibility = Visibility.Hidden;
32                     m_Canvas.Children.Add(m_Numbers[i, j]);
33 
34                     m_Steps[i, j] = new Step();
35                     m_Steps[i, j].Row = i;
36                     m_Steps[i, j].Col = j;
37                     m_EmptySteps.Add(m_Steps[i, j]);
38                     m_AllSteps.Add(m_Steps[i, j]);
39                 }
40             }
41 
42             // 当前标志
43             m_CurrentRect.Visibility = System.Windows.Visibility.Hidden;
44             m_CurrentRect.Fill = Brushes.Red;
45             m_Canvas.Children.Add(m_CurrentRect);
46 
47             for (int i = 0; i < 19; i++) {
48                 for (int j = 0; j < 19; j++) {
49                     Rectangle rect = new Rectangle();
50                     rect.Visibility = System.Windows.Visibility.Hidden;
51                     m_EmptyRects[i, j] = rect;
52                     m_Canvas.Children.Add(m_EmptyRects[i,j]);
53 
54                 }
55             }
56         }
Init()

相关文章: