首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • C#中一个象棋算法[高手来挑战一下] [已结贴,结贴人:rczjp]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • rczjp
    • 等级:
    发表于:2008-05-24 14:31:56 楼主
    [code=C#]说明:moveChessPosition棋子源坐标的位置,每颗棋子是相隔58像素
    宽484 高:542
    ---------------------------
    int Num = 58;
                    //横着走的时候[四个点]
                    if (((x == moveChessPosition.X + 2 * Num ¦ ¦ x == moveChessPosition.X - 2 * Num) && (y == moveChessPosition.Y + 1 * Num ¦ ¦ y == moveChessPosition.Y - 1 * Num)))
                    {
                        int LeftX = 20, RightX = 484;
                        foreach (DictionaryEntry de in CChessCommon.CChessHT)
                        {
                            //纵坐标相同[左右位置]
                            if (((Point)de.Value).Y == moveChessPosition.Y)
                            {
                                //棋子在左边
                                if (((Point)de.Value).X < moveChessPosition.X && ((Point)de.Value).X > LeftX)
                                {
                                    LeftX = ((Point)de.Value).X;
                                }
                                //棋子在右边
                                else if (((Point)de.Value).X > moveChessPosition.X && ((Point)de.Value).X < RightX)
                                {
                                    RightX = ((Point)de.Value).X;
                                }
                            }
                        }
                        //蹩脚马[判断往左边跳和往右边跳的情况]
                        if ((moveChessPosition.X - Num == LeftX && x < LeftX) ¦ ¦ (moveChessPosition.X + Num == RightX && x > RightX))
                        {
                            return false;
                        }
                        else
                        {
                            return true;
                        }
                    }
    马的规则是正确的 可以蹩马的脚
    ---------------------------------------
    int Num = 58;
                    //右上和左下
                    if ((x == moveChessPosition.X + 2 * Num && y == moveChessPosition.Y - 2 * Num) ¦ ¦ (x == moveChessPosition.X - 2 * Num && y == moveChessPosition.Y + 2 * Num))
                    {
                        int LeftX = 20, RightX = 484, UpY = 20, DownY = 542;
                        foreach (DictionaryEntry de in CChessCommon.CChessHT)
                        {
                            //找出左上角和右上角最近的棋子
                            if (((Point)de.Value).X != moveChessPosition.X)
                            {
                                if (((((Point)de.Value).Y - moveChessPosition.Y) / (((Point)de.Value).X - moveChessPosition.X)) == 1)
                                {
                                    //右上角的棋子
                                    if (((Point)de.Value).X > moveChessPosition.X && ((Point)de.Value).X < RightX && ((Point)de.Value).Y > UpY)
                                    {
                                        RightX = ((Point)de.Value).X;
                                        UpY = ((Point)de.Value).Y;
                                    }
                                    //左下角的棋子
                                    else if (((Point)de.Value).X < moveChessPosition.X && ((Point)de.Value).X > LeftX && ((Point)de.Value).Y < DownY)
                                    {
                                        LeftX = ((Point)de.Value).X;
                                        DownY = ((Point)de.Value).Y;
                                    }
                                }
                            }
                            //塞象眼
                            if ((moveChessPosition.X + Num == RightX && moveChessPosition.Y - Num == UpY && x > RightX && y < UpY) ¦ ¦ (moveChessPosition.X - Num == LeftX && moveChessPosition.Y + Num == DownY && x < LeftX && y > DownY))
                            {
                                return false;
                            }
                            else
                            {
                                return true;
                            }
                        }
                    }
    code]象眼却堵不住,已经三天了,还没有解决,实在没有办法了,拿来问问高手,不知道这点代码可以了吗?[/
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-24 14:37:451楼 得分:1
    sf
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • rczjp
    • 等级:
    发表于:2008-05-24 14:43:312楼 得分:0
    C# code
    int Num = 58; //横着走的时候[四个点] if (((x == moveChessPosition.X + 2 * Num ¦ ¦ x == moveChessPosition.X - 2 * Num) && (y == moveChessPosition.Y + 1 * Num ¦ ¦ y == moveChessPosition.Y - 1 * Num))) { int LeftX = 20, RightX = 484; foreach (DictionaryEntry de in CChessCommon.CChessHT) { //纵坐标相同[左右位置] if (((Point)de.Value).Y == moveChessPosition.Y) { //棋子在左边 if (((Point)de.Value).X < moveChessPosition.X && ((Point)de.Value).X > LeftX) { LeftX = ((Point)de.Value).X; } //棋子在右边 else if (((Point)de.Value).X > moveChessPosition.X && ((Point)de.Value).X < RightX) { RightX = ((Point)de.Value).X; } } } //蹩脚马[判断往左边跳和往右边跳的情况] if ((moveChessPosition.X - Num == LeftX && x < LeftX) ¦ ¦ (moveChessPosition.X + Num == RightX && x > RightX)) { return false; } else { return true; } } 马的规则是正确的 可以蹩马的脚 --------------------------------------- int Num = 58; //右上和左下 if ((x == moveChessPosition.X + 2 * Num && y == moveChessPosition.Y - 2 * Num) ¦ ¦ (x == moveChessPosition.X - 2 * Num && y == moveChessPosition.Y + 2 * Num)) { int LeftX = 20, RightX = 484, UpY = 20, DownY = 542; foreach (DictionaryEntry de in CChessCommon.CChessHT) { //找出左上角和右上角最近的棋子 if (((Point)de.Value).X != moveChessPosition.X) { if (((((Point)de.Value).Y - moveChessPosition.Y) / (((Point)de.Value).X - moveChessPosition.X)) == 1) { //右上角的棋子 if (((Point)de.Value).X > moveChessPosition.X && ((Point)de.Value).X < RightX && ((Point)de.Value).Y > UpY) { RightX = ((Point)de.Value).X; UpY = ((Point)de.Value).Y; } //左下角的棋子 else if (((Point)de.Value).X < moveChessPosition.X && ((Point)de.Value).X > LeftX && ((Point)de.Value).Y < DownY) { LeftX = ((Point)de.Value).X; DownY = ((Point)de.Value).Y; } } } //塞象眼 if ((moveChessPosition.X + Num == RightX && moveChessPosition.Y - Num == UpY && x > RightX && y < UpY) ¦ ¦ (moveChessPosition.X - Num == LeftX && moveChessPosition.Y + Num == DownY && x < LeftX && y > DownY)) { return false; } else { return true; } } }



    主要就是在那个判断象同线[斜线]的地方卡住了  不知道高手可以通过我这点代码帮我解决或给个思路什么的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • rczjp
    • 等级:
    发表于:2008-05-24 15:46:443楼 得分:0
    给点想法就OK了  Come ON~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-24 16:52:244楼 得分:1
    没写过这方面的东西  帮你顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-24 21:27:495楼 得分:1
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-24 21:47:536楼 得分:1
    路过的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zplhl
    • 等级:
    发表于:2008-05-24 21:52:157楼 得分:1
    本人喜欢下象棋,不过可惜的是我不会自己写这样的代码?
    帮你顶....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-24 22:40:348楼 得分:4
    没写过象棋软件,看你写的好像没什么oo的成分,我觉得
    1.棋盘做成一个类,封装交叉点像素大小,只提供64个点的坐标。
    2.棋子做成一个类,像素大小与棋盘一致,可以放入棋盘的坐标。
    这样要判断蹩马脚和堵象眼就很简单了。比如马,原坐标(Xo,Yo),新坐标(X1,Y1)
    //下面判断新坐标是合法的,当然,还要验证不要超过边界等,省略哈。
    if( ¦Xo-X1 ¦==1且 ¦Yo-Y1 ¦==2)
    {
      判断(Xo,Yo+(Y1-Yo)/2)这点是否有棋子,有就蹩了
    }
    else if( ¦Xo-X1 ¦==2且 ¦Yo-Y1 ¦==1 )
    {
      ...
    }
    同样,判断象眼只要知道(Xo+(X1-Xo)/2,Yo+(Y1-Yo)/2)这点有没有棋子就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lfywy
    • 等级:
    发表于:2008-05-24 23:20:569楼 得分:10
    象走的方法:
    C# code
    using System; using System.Drawing; namespace ChessItem { /// <summary> /// ChessItemXiang 的摘要说明。 /// </summary> public class ChessItemXiang : ChessItemBase { public ChessItemXiang() { // // TODO: 在此处添加构造函数逻辑 // } public override int StepX { get { return 2; } } public override int StepY { get { return 2; } } public override bool LimitPoint(int ChessX, int ChessY) { if(this.type == IChess.Enums.ChessType.red && ChessY < 5) return false; else if(this.type == IChess.Enums.ChessType.blue && ChessY > 5)return false; bool flag = false; if(ChessX-GridX==-2 && ChessY-GridY==-2) flag=HasChessItemOnPoint(GridX-1,GridY-1); else if(ChessX-GridX==2 && ChessY-GridY==-2) flag=HasChessItemOnPoint(GridX+1,GridY-1); else if(ChessX-GridX==-2 && ChessY-GridY==2) flag=HasChessItemOnPoint(GridX-1,GridY+1); else if(ChessX-GridX==2 && ChessY-GridY==2) flag=HasChessItemOnPoint(GridX+1,GridY+1); if(flag) return false; return base.LimitPoint (ChessX, ChessY); } public override bool MoveItem(int ChessX, int ChessY) { if(!LimitPoint( ChessX ,ChessY)) return false; if( (GetInt32(ChessY-GridY) == StepY)&& ((GetInt32(ChessX-GridX) == StepX))) { this.Location = new Point(ChessX*50,ChessY*50); GridX = ChessX; GridY = ChessY; return true; } return false; } } }

    士走的方法:
    C# code
    using System; using System.Drawing; namespace ChessItem { /// <summary> /// ChessItemShi 的摘要说明。 /// </summary> public class ChessItemShi : ChessItemBase { public ChessItemShi() { // // TODO: 在此处添加构造函数逻辑 // } public override int StepX { get { return 1; } } public override int StepY { get { return 1; } } public override bool LimitPoint(int ChessX, int ChessY) { if(this.type == IChess.Enums.ChessType.red && ( ChessX < 3 || ChessX > 5 || ChessY < 7) ) return false; else if(this.type == IChess.Enums.ChessType.blue && ( ChessX < 3 || ChessX > 5 || ChessY > 2) ) return false; return base.LimitPoint (ChessX, ChessY); } public override bool MoveItem(int ChessX, int ChessY) { if(!LimitPoint( ChessX ,ChessY)) return false; if( (GetInt32(ChessY-GridY) == StepY)&& ((GetInt32(ChessX-GridX) == StepX))) { this.Location = new Point(ChessX*50,ChessY*50); GridX = ChessX; GridY = ChessY; return true; } return false; } } }

    马的走法:
    C# code
    using System; using System.Drawing; namespace ChessItem { /// <summary> /// ChessItemMa 的摘要说明。 /// </summary> public class ChessItemMa : ChessItemBase { public ChessItemMa() { // // TODO: 在此处添加构造函数逻辑 // } public override int StepX { get { return 2; } } public override int StepY { get { return 2; } } public override bool LimitPoint(int ChessX, int ChessY) { bool flag = false; if(ChessX-GridX==-1 && ChessY-GridY==-2) flag = HasChessItemOnPoint(GridX,GridY-1); else if(ChessX-GridX==1 && ChessY-GridY==-2) flag = HasChessItemOnPoint(GridX,GridY-1); else if(ChessX-GridX==-2 && ChessY-GridY==-1) flag = HasChessItemOnPoint(GridX-1,GridY); else if(ChessX-GridX==-2 && ChessY-GridY==1) flag = HasChessItemOnPoint(GridX-1,GridY); else if(ChessX-GridX==2 && ChessY-GridY==1) flag = HasChessItemOnPoint(GridX+1,GridY); else if(ChessX-GridX==2 && ChessY-GridY==1) flag = HasChessItemOnPoint(GridX+1,GridY); else if(ChessX-GridX==-1 && ChessY-GridY==2) flag = HasChessItemOnPoint(GridX,GridY+1); else if(ChessX-GridX==1 && ChessY-GridY==2) flag = HasChessItemOnPoint(GridX,GridY+1); if(flag) return false; return base.LimitPoint (ChessX, ChessY); } public override bool MoveItem(int ChessX, int ChessY) { if(!LimitPoint( ChessX ,ChessY)) return false; if( (GetInt32(ChessX-GridX)==1 &&(GetInt32(ChessY-GridY) == StepY))|| ((GetInt32(ChessX-GridX)==StepX) &&GetInt32(ChessY-GridY)==1)) { this.Location = new Point(ChessX*50,ChessY*50); GridX = ChessX; GridY = ChessY; return true; } return false; } } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lfywy
    • 等级:
    发表于:2008-05-24 23:21:2110楼 得分:0
    方法返回:
    C# code
    using System; using System.Collections; using System.Drawing; using System.Windows.Forms; using IChess; namespace ChessItem { /// <summary> /// ChessItemBase 的摘要说明。 /// </summary> public class ChessItemBase : System.Windows.Forms.Label,IChess.IChessItem { public ChessItemBase() { // // TODO: 在此处添加构造函数逻辑 // } #region override protected override void OnClick(EventArgs e) { if(!IsChecked) { IsChecked = true; this.BorderStyle = BorderStyle.FixedSingle; } base.OnClick (e); } public override ContentAlignment TextAlign { get { return ContentAlignment.MiddleCenter; } set { } } public override Color BackColor { get { // SetStyle(ControlStyles.SupportsTransparentBackColor,true); return Color.Transparent; } set {} } public override Font Font { get { return new Font("隶书",20); } set { } } private Image _bmp; public override Image BackgroundImage { get { if(_bmp==null) { Bitmap bmp = new Bitmap(50,50); Graphics g = Graphics.FromImage( bmp ); Brush brush = new SolidBrush(Color.Tomato); g.FillEllipse(brush,new Rectangle(new Point(0,0),new Size(50,50)));; g.Flush(); g.Dispose(); _bmp= bmp; } return _bmp; } set { } } #endregion /// <summary> /// 将负数转换为正整数 /// </summary> /// <param name="values"></param> /// <returns></returns> public virtual int GetInt32(int values) { if(values<0) return 0-values; return values; } /// <summary> /// 限制坐标点移动 /// </summary> /// <param name="ChessX">棋盘上X坐标</param> /// <param name="ChessY">棋盘上Y坐标</param> /// <returns></returns> public virtual bool LimitPoint(int ChessX,int ChessY) { Form form = (Form)this.Parent;//获取此控件的父系,即form int count = 0; if(GridX == ChessX && GridY > ChessY) GetChildOnPoint(form,ChessX,ChessY,GridX,GridY,out count); else if(GridX == ChessX && GridY < ChessY) GetChildOnPoint(form,GridX,GridY,ChessX,ChessY,out count); else if(GridX > ChessX && GridY == ChessY) GetChildOnPoint(form,ChessX,ChessY,GridX,GridY,out count); else if(GridX < ChessX && GridY == ChessY) GetChildOnPoint(form,GridX,GridY,ChessX,ChessY,out count); if(count>0) return false;//如果此条线上还有其他棋子,将不能移动 if(ChessX>Definition.ChessGirdX || ChessX<0) return false; if(ChessY>Definition.ChessGirdY || ChessY<0) return false; return true; } /// <summary> /// 获取处于开始结束点之间的棋子,如果含有多个棋子则不返回,输出从开始到结束位置共有多少个棋子 /// </summary> /// <param name="form">棋盘</param> /// <param name="startX">开始X</param> /// <param name="startY">开始Y</param> /// <param name="endX">结束X</param> /// <param name="endY">结束Y</param> /// <param name="count">返回在此条线上有多少个棋子</param> /// <returns></returns> protected IChessItem GetChildOnPoint(Form form,int startX,int startY,int endX,int endY,out int count) { count = 0; if((startX != endX) &&(startY!=endY)) return null; ArrayList al = new ArrayList(); for(int i=0;i<form.Controls.Count;i++) { if(form.Controls[i] is IChessItem) { IChessItem ic = (IChessItem)form.Controls[i]; if(startX == endX && startX == ic.GridX) { if(ic.GridY > startY && ic.GridY<endY) al.Add(ic); } else if(startY==endY &&startY== ic.GridY) { if(ic.GridX > startX && ic.GridX<endX) al.Add(ic); } } } count = al.Count; if(al.Count == 1)return (IChessItem)al[0]; return null; } protected bool HasChessItemOnPoint(int ChessX,int ChessY) { Form form = (Form)this.Parent; for(int i=0;i<form.Controls.Count;i++) { if(form.Controls[i] is IChessItem) { IChessItem ic = (IChessItem)form.Controls[i]; if(ic.GridX == ChessX && ic.GridY == ChessY) return true; } } return false; } #region IChessItem 成员实现 private int _gridX; public virtual int