这是偶们用C#类写的中国象棋其中一个炮的类,算法和结构估计和你看到的代码都不一样。
都是单独的一个文件。
////////////////////////////////////////////////////
ClsBoard.cs 棋盘类
ClsChess.cs 棋子类
ClsPoint.cs 点类
ClsCannon.cs 炮类
ClsCarriage.cs 车类
ClsElephant.cs 象类
ClsHorse.cs 马类
ClsKavass.cs 士类
ClsKing.cs 王类
ClsSoldier.cs 兵类
///////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace CnChess
{
/// <summary>
/// 中国象棋--炮类,继承自ClsChess棋子基类
/// </summary>
class ClsCannon : ClsChess
{
/// <summary>
/// 默认的构造方法
/// </summary>
public ClsCannon(string color)
{
if(color == "红")
{
this._chessType = EnumChessType.红;
this.ChessImage = Image.FromFile(@"Images\红炮.gif");
}
else
{
this._chessType = EnumChessType.黑;
this.ChessImage = Image.FromFile(@"Images\黑炮.gif");
}
this._chessName = EnumChessName.炮;
}
/// <summary>
/// 重写基类的方法,实现炮的走法规则
/// </summary>
/// <param name="point"></param>
/// <returns></returns>
public override bool MoveTo(ClsPoint point)
{
int offset;
//判断是否是移动炮的走法,和车走法类似.
if (point.currChess == null)
{
//竖走判断
if (this._currPoint.point_x == point.point_x)
{
offset = Math.Abs(_currPoint.point_y - point.point_y);
//计算路上是否有棋子阻隔
if (BeelineCheck(point, offset, false) == 0)
{
return base.MoveTo(point);
}
}
//横走判断
if (this._currPoint.point_y == point.point_y)
{
offset = Math.Abs(_currPoint.point_x - point.point_x);
//计算路上是否有棋子阻隔
if (BeelineCheck(point, offset, true) == 0)
{
return base.MoveTo(point);
}
}
}
//判断炮打翻山吃子的情况
if (point.currChess != null && this._chessType != point.currChess._chessType)
{
if (this._currPoint.point_x == point.point_x)
{
offset = Math.Abs(_currPoint.point_y - point.point_y);
//计算直线上是否有一个棋子
if (BeelineCheck(point, offset, false) == 1)
{
return base.MoveTo(point);
}
}
if (this._currPoint.point_y == point.point_y)
{
offset = Math.Abs(_currPoint.point_x - point.point_x);
//计算直线上是否有一个棋子
if (BeelineCheck(point, offset, true) == 1)
{
return base.MoveTo(point);
}
}
}
return false;
}
}
}