1.棋子基类
抽象类,是所有棋子的基类, 注意几个重要的方法:如CanMoveTo移动算法及MoveTo移动棋子。


using System; 
 
using System.Collections.Generic; 
 
using System.Text; 
 
using System.Drawing; 
 
using www.vjsdn.com.ChineseChess.Library; 
 

namespace www.vjsdn.com.ChineseChess.Library 
 
{ 
 
    
 /// <summary> 
 
    
 /// 棋子类 
 
    
 /// </summary> 
 
    
 public 
 abstract 
 class Chess 
 
   { 
 
       
 protected ChessColor _color; 
 
       
 protected ChessPoint _currentPoint; 
 
       
 protected ChessBoard _chessboard; 
 
       
 
       
 /// <summary> 
 
       
 /// 构造函数 
 
       
 /// </summary> 
 
       
 public Chess(ChessColor color, ChessPoint tragpoint, ChessBoard board) 
 
      { 
 
          
 this._color = color; 
 
          
 this._currentPoint = tragpoint; 
 
          
 this._chessboard = board; 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 棋子颜色 
 
       
 /// </summary> 
 
       
 public ChessColor Color 
 
      { 
 
          
 get { 
 return _color; } 
 
          
 set { _color = value; } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 当前坐标 
 
       
 /// </summary> 
 
       
 public ChessPoint CurrentPoint 
 
      { 
 
          
 get { 
 return _currentPoint; } 
 
          
 set { _currentPoint = value; } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 棋盘 
 
       
 /// </summary> 
 
       
 public ChessBoard Chessboard 
 
      { 
 
          
 get { 
 return _chessboard; } 
 
          
 set { _chessboard = value; } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 棋子图片:抽象的属性 
 
       
 /// </summary> 
 
       
 public 
 abstract Image ChessImage { 
 get;} 
 
       
 
       
 /// <summary> 
 
       
 /// 是否能够移动 
 
       
 /// </summary> 
 
       
 protected 
 abstract 
 bool CanMoveTo(ChessPoint p); 
 
       
 
       
 /// <summary> 
 
       
 /// 移动方法 
 
       
 /// </summary> 
 
       
 public 
 void MoveTo(ChessPoint targetPoint) 
 
      { 
 
          
 //目标棋子和当前棋子颜色不能一致 
 
         Chess targetChess = _chessboard[targetPoint]; 
 
          
 
          
 if (targetChess != 
 null && targetChess.Color == 
 this._color) 
 return; 
 
          
 
          
 //是否满足规则 
 
          
 if (!CanMoveTo(targetPoint)) 
 return; 
 
          
 
          
 //吃掉对方老王 
 
          
 if (_chessboard[targetPoint] 
 is King) 
 
          
 throw 
 new GameLoseException( 
 this.Color == ChessColor.Red ? "红方胜" : "黑方胜"); 
 
          
 
          
 //移动 
 
         _chessboard[_currentPoint] = 
 null; 
 //吃掉棋子或移动棋子 
 
         _chessboard[targetPoint] = 
 this; 
 
          
 
          
 this._currentPoint = targetPoint; 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 获取两点之间的棋子数 
 
       
 /// </summary> 
 
       
 public 
 int GetChessCount(ChessPoint start, ChessPoint end) 
 
      { 
 
          
 //如果Y相同 
 
          
 if (start.Y == end.Y) 
 
         { 
 
             
 //获取最大X和最小X值 
 
             
 int min = Math.Min(start.X, end.X); 
 
             
 int max = Math.Max(start.X, end.X); 
 
             
 
             
 //棋子计数器 
 
             
 int count = 0; 
 
             
 for ( 
 int i = min + 1; i < max; i++) 
 
            { 
 
                
 if (_chessboard[i, start.Y] != 
 null) 
 
               count++; 
 
            } 
 
             
 return count; 
 
         } 
 
          
 else 
 
         { 
 
             
 int min = Math.Min(start.Y, end.Y); 
 
             
 int max = Math.Max(start.Y, end.Y); 
 
             
 
             
 int count = 0; 
 
             
 for ( 
 int i = min + 1; i < max; i++) 
 
            { 
 
                
 if (_chessboard[start.X, i] != 
 null) 
 
               count++; 
 
            } 
 
             
 return count; 
 
         } 
 
      } 
 
       
 
   } 
 
}


2.车(Rooks)
学习车移动算法CanMoveTo. 移动规则: 1.两点在一条直线上 ,2.中间不能有棋子


using System; 
 
using System.Collections.Generic; 
 
using System.Text; 
 
using System.Drawing; 
 

namespace www.vjsdn.com.ChineseChess.Library 
 
{ 
 
    
 /// <summary> 
 
    
 /// 车 
 
    
 /// </summary> 
 
    
 public 
 class Rooks : Chess 
 
   { 
 
       
 /// <summary> 
 
       
 /// 构造函数 
 
       
 /// </summary> 
 
       
 public Rooks(ChessColor color, ChessPoint tragPoint, ChessBoard board) 
 
      : 
 base(color, tragPoint, board) 
 
      { 
 
          
 // 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 重写图片的属性 
 
       
 /// </summary> 
 
       
 public 
 override Image ChessImage 
 
      { 
 
          
 get 
 
         { 
 
             
 //红车 
 
             
 if (_color == ChessColor.Red) 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 1); 
 
             
 else //黑车 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 8); 
 
         } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 棋子是否能够移动到目标点 
 
       
 /// </summary> 
 
       
 protected 
 override 
 bool CanMoveTo(ChessPoint targetPoint) 
 
      { 
 
          
 //两点在一条直线上 
 
          
 if (targetPoint.X != _currentPoint.X && targetPoint.Y != _currentPoint.Y) 
 
          
 return 
 false; 
 
          
 
          
 //中间不能有棋子 
 
          
 if (GetChessCount(_currentPoint, targetPoint) > 0) 
 
          
 return 
 false; 
 
          
 
          
 return 
 true; 
 
      } 
 
       
 
   } 
 
}


3.马(Knights)
学习马移动算法
移动规则:蹩脚算法,直线一侧不能有棋子


using System; 
 
using System.Collections.Generic; 
 
using System.Text; 
 

namespace www.vjsdn.com.ChineseChess.Library 
 
{ 
 
    
 /// <summary> 
 
    
 /// 马 
 
    
 /// </summary> 
 
    
 public 
 class Knights : Chess 
 
   { 
 
       
 
       
 /// <summary> 
 
       
 /// 构造函数 
 
       
 /// </summary> 
 
       
 public Knights(ChessColor color, ChessPoint tragPoint, ChessBoard board) 
 
      : 
 base(color, tragPoint, board) 
 
      { 
 
          
 // 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 象棋图片 
 
       
 /// </summary> 
 
       
 public 
 override System.Drawing.Image ChessImage 
 
      { 
 
          
 get 
 
         { 
 
             
 //红马 
 
             
 if ( 
 this._color == ChessColor.Red) 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 2); 
 
             
 //黑马 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 9); 
 
         } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 马移动算法 
 
       
 /// </summary> 
 
       
 protected 
 override 
 bool CanMoveTo(ChessPoint p) 
 
      { 
 
          
 //蹩脚算法 
 
          
 //横向移动 
 
          
 if (Math.Abs(_currentPoint.X - p.X) == 2 && Math.Abs(_currentPoint.Y - p.Y) == 1) 
 
         { 
 
             
 if (_chessboard[(_currentPoint.X + p.X) / 2, _currentPoint.Y] == 
 null) 
 
             
 return 
 true; 
 
         } 
 
          
 if (Math.Abs(_currentPoint.X - p.X) == 1 && Math.Abs(_currentPoint.Y - p.Y) == 2) 
 
         { 
 
             
 if (_chessboard[_currentPoint.X, (_currentPoint.Y + p.Y) / 2] == 
 null) 
 
             
 return 
 true; 
 
         } 
 
          
 return 
 false; 
 
      } 
 
   } 
 
}


4.象/相(Elephants)学习移动算法

移动规则:1.田子中间不能有棋子 2.不能过河

using System; 
 
using System.Collections.Generic; 
 
using System.Text; 
 

namespace www.vjsdn.com.ChineseChess.Library 
 
{ 
 
    
 /// <summary> 
 
    
 /// 象--相 
 
    
 /// </summary> 
 
    
 public 
 class Elephants : Chess 
 
   { 
 
       
 /// <summary> 
 
       
 /// 构造函数 
 
       
 /// </summary> 
 
       
 public Elephants(ChessColor color, ChessPoint p, ChessBoard board) 
 
      : 
 base(color, p, board) 
 
      { 
 
          
 // 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 象棋图片 
 
       
 /// </summary> 
 
       
 public 
 override System.Drawing.Image ChessImage 
 
      { 
 
          
 get 
 
         { 
 
             
 //红相 
 
             
 if ( 
 this._color == ChessColor.Red) 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 6); 
 
             
 //黑象 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 13); 
 
         } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 象移动算法 
 
       
 /// </summary> 
 
       
 protected 
 override 
 bool CanMoveTo(ChessPoint p) 
 
      { 
 
          
 //绝对值法 
 
          
 if (Math.Abs(_currentPoint.X - p.X) != 2 || Math.Abs(_currentPoint.Y - p.Y) != 2) 
 
          
 return 
 false; 
 
          
 
          
 //中间不能有棋子 
 
          
 if (_chessboard[(_currentPoint.X + p.X) / 2, (_currentPoint.Y + p.Y) / 2] != 
 null) 
 
          
 return 
 false; 
 
          
 
          
 //越界算法 
 
          
 if (_currentPoint.Y <= 4 && p.Y > 4) 
 return 
 false; 
 
          
 if (_currentPoint.Y >= 5 && p.Y < 5) 
 return 
 false; 
 
          
 
          
 return 
 true; 
 
      } 
 
   } 
 
}


5.士/仕(Mandarins)
移动规则:1.“士”不能出城 2.“士”每次只能走一步且只能是斜线

using System; 
 
using System.Collections.Generic; 
 
using System.Text; 
 
using www.vjsdn.com.ChineseChess.Library; 
 

namespace www.vjsdn.com.ChineseChess.Library 
 
{ 
 
    
 /// <summary> 
 
    
 /// 士 
 
    
 /// </summary> 
 
    
 public 
 class Mandarins : Chess 
 
   { 
 
       
 /// <summary> 
 
       
 /// 构造函数 
 
       
 /// </summary> 
 
       
 public Mandarins(ChessColor color, ChessPoint tragPoint, ChessBoard board) 
 
      : 
 base(color, tragPoint, board) 
 
      { 
 
          
 // 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 象棋图片 
 
       
 /// </summary> 
 
       
 public 
 override System.Drawing.Image ChessImage 
 
      { 
 
          
 get 
 
         { 
 
             
 //红士 
 
             
 if ( 
 this._color == ChessColor.Red) 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 5); 
 
             
 //黑士 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 12); 
 
         } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 兵移动算法 
 
       
 /// </summary> 
 
       
 protected 
 override 
 bool CanMoveTo(ChessPoint tragPoint) 
 
      { 
 
          
 //“士”不能出城 
 
          
 if (!((tragPoint.X >= 3 && tragPoint.X <= 5) && (tragPoint.Y <= 2 || tragPoint.Y >= 7))) 
 
          
 return 
 false; 
 
          
 
          
 //“士”每次只能走一步且只能是斜线 
 
          
 if (!(Math.Abs(tragPoint.X - 
 this._currentPoint.X) == 1 && Math.Abs(tragPoint.Y - 
 this._currentPoint.Y) == 1)) 
 
          
 return 
 false; 
 
          
 
          
 return 
 true; 
 
      } 
 
   } 
 
}


6.将/帅(King)
移动规则: 1.“将”不能出城 2.“将”每次只能走一步

using System; 
 
using System.Collections.Generic; 
 
using System.Text; 
 
using www.vjsdn.com.ChineseChess.Library; 
 

namespace www.vjsdn.com.ChineseChess.Library 
 
{ 
 
    
 /// <summary> 
 
    
 /// 将/帅 
 
    
 /// </summary> 
 
    
 public 
 class King : Chess 
 
   { 
 
       
 /// <summary> 
 
       
 /// 构造函数 
 
       
 /// </summary> 
 
       
 public King(ChessColor color, ChessPoint tragPoint, ChessBoard board) 
 
      : 
 base(color, tragPoint, board) 
 
      { 
 
          
 // 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 象棋图片 
 
       
 /// </summary> 
 
       
 public 
 override System.Drawing.Image ChessImage 
 
      { 
 
          
 get 
 
         { 
 
             
 //红将 
 
             
 if ( 
 this._color == ChessColor.Red) 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 4); 
 
             
 //黑将 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 11); 
 
         } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 将移动算法 
 
       
 /// </summary> 
 
       
 protected 
 override 
 bool CanMoveTo(ChessPoint tragPoint) 
 
      { 
 
          
 //“将”不能出城 
 
          
 if (!((tragPoint.X >= 3 && tragPoint.X <= 5) && (tragPoint.Y <= 2 || tragPoint.Y >= 7))) 
 
          
 return 
 false; 
 
          
 
          
 //“将”每次只能走一步 
 
          
 if ((Math.Abs(tragPoint.X - 
 this._currentPoint.X) + Math.Abs(tragPoint.Y - 
 this._currentPoint.Y)) != 1) 
 
          
 return 
 false; 
 
          
 
          
 return 
 true; 
 
      } 
 
       
 
   } 
 
}

7.炮/砲(Connons)
移动规则: 1.两点在一条直线上 2.目标点不为空,中间只能由一个棋子  3.目标点为空,中间不能有棋子


using System; 
 
using System.Collections.Generic; 
 
using System.Text; 
 
using System.Drawing; 
 

namespace www.vjsdn.com.ChineseChess.Library 
 
{ 
 
    
 /// <summary> 
 
    
 /// 炮 
 
    
 /// </summary> 
 
    
 public 
 class Cannons : Chess 
 
   { 
 
       
 /// <summary> 
 
       
 /// 构造函数 
 
       
 /// </summary> 
 
       
 public Cannons(ChessColor color, ChessPoint tragPoint, ChessBoard board) 
 
      : 
 base(color, tragPoint, board) 
 
      { 
 
          
 // 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 重写图片的属性 
 
       
 /// </summary> 
 
       
 public 
 override Image ChessImage 
 
      { 
 
          
 get 
 
         { 
 
             
 //红炮 
 
             
 if (_color == ChessColor.Red) 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 3); 
 
             
 //黑炮 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 10); 
 
         } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 棋子是否能够移动到目标点 
 
       
 /// </summary> 
 
       
 protected 
 override 
 bool CanMoveTo(ChessPoint targPoint) 
 
      { 
 
          
 //两点在一条直线上 
 
          
 if (targPoint.X != _currentPoint.X && targPoint.Y != _currentPoint.Y) 
 
          
 return 
 false; 
 
          
 
          
 //目标点不为空,中间只能由一个棋子 
 
          
 if (_chessboard[targPoint] != 
 null && GetChessCount(_currentPoint, targPoint) != 1) 
 
          
 return 
 false; 
 
          
 
          
 //目标点为空,中间不能有棋子 
 
          
 if (_chessboard[targPoint] == 
 null && GetChessCount(_currentPoint, targPoint) > 0) 
 
          
 return 
 false; 
 
          
 
          
 return 
 true; 
 
          
 
      } 
 
       
 
   } 
 
}


8.兵/卒 (Pawns)

移动规则:1.兵不能往后走 2.兵一步一步走 3.过河前只能向前走

using System; 
 
using System.Collections.Generic; 
 
using System.Text; 
 
using www.vjsdn.com.ChineseChess.Library; 
 

namespace www.vjsdn.com.ChineseChess.Library 
 
{ 
 
    
 /// <summary> 
 
    
 /// 兵 
 
    
 /// </summary> 
 
    
 public 
 class Pawns : Chess 
 
   { 
 
       
 //是否过河 
 
       
 private 
 bool _isRiverd = 
 false; 
 
       
 private 
 int _step = 0; 
 //记录步数 
 
       
 
       
 /// <summary> 
 
       
 /// 构造函数 
 
       
 /// </summary> 
 
       
 public Pawns(ChessColor color, ChessPoint tragPoint, ChessBoard board) 
 
      : 
 base(color, tragPoint, board) 
 
      { 
 
          
 if (_currentPoint.Y > 4) 
 
         _step = -1; 
 
          
 else 
 
         _step = 1; 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 象棋图片 
 
       
 /// </summary> 
 
       
 public 
 override System.Drawing.Image ChessImage 
 
      { 
 
          
 get 
 
         { 
 
             
 //红兵 
 
             
 if ( 
 this._color == ChessColor.Red) 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 7); 
 
             
 //黑卒 
 
             
 return ImageHelper.GetImageByAverageIndex(ChineseChess.Res.Properties.Resources.xchess, 14, 14); 
 
         } 
 
      } 
 
       
 
       
 /// <summary> 
 
       
 /// 兵移动算法 
 
       
 /// </summary> 
 
       
 protected 
 override 
 bool CanMoveTo(ChessPoint p) 
 
      { 
 
          
 //兵不能往后走 
 
          
 if (p.Y - _currentPoint.Y == -_step) 
 
          
 return 
 false; 
 
          
 
          
 //兵一步一步走 
 
          
 if (Math.Abs(_currentPoint.X - p.X) + Math.Abs(_currentPoint.Y - p.Y) != 1) 
 
          
 return 
 false; 
 
          
 
          
 //过河 
 
          
 if (!_isRiverd) 
 
         { 
 
             
 if (_currentPoint.Y == 4 && p.Y == 5) _isRiverd = 
 true; 
 
             
 if (_currentPoint.Y == 5 && p.Y == 4) _isRiverd = 
 true; 
 
         } 
 
          
 
          
 //过河前只能向前走 
 
          
 if (!_isRiverd) 
 
         { 
 
             
 if (p.Y - _currentPoint.Y != _step) 
 
             
 return 
 false; 
 
         } 
 
          
 
          
 return 
 true; 
 
      } 
 
   } 
 
}