前言
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
乱七杂八说两句:
一个多月没碰vs2010了,今天回头看原来的象棋系列代码,感觉到有点陌生了,
好多原来的思路,都忘的差不多了,要续写这系列文章,感觉还得像个新手一样重温下代码才行呢。
本系列为进阶优化系列,会在原来的基础上,慢慢改动很多代码的哦,欢迎持续关注!
正文:
ok,从这图片我知道双方是在下棋了,可是我们并不知道现在该谁下了?
当然了,认真看一下棋谱,还是知道刚刚是黑方下了一步,不过还是要很用力的猜车一平二是怎么个平法。
十字轨迹的出现,解决了这个问题,如果到qq平台下过棋,也见过的,就是那个棋子周围加上的一个边框了,那这个为啥叫十字轨迹?这个这个...
好!大伙知道十字轨迹是什么就好了,现在说说实现思路
大伙想啊,十字轨迹是在棋步移动之后,在棋盘上就有两个出现了,一个在移动的棋子的原来位置,一个在移动后的位置,而且整个棋盘就只能有两个,于是,我们的思路定位就很简单了。
一:在棋盘上先创建好两个十字轨迹,默认隐藏
二:在棋手移动完棋子之后,把两个十字轨迹移动到相应的位置
就这么两步,很简单吧,该出手时就出手。
实现步骤如下:
一:棋盘board类画十字轨迹
1:增加两个十字轨迹属性
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
/// <summary>
/// 棋盘 by 路过秋天
/// http://cyq1162.cnblogs.com
/// </summary>
public class board
{
/// <summary>
/// 十字轨迹框
/// </summary>
public canvas trackfrom
{
get;
set;
}
public canvas trackto
//下面省略n多代码
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
2:增加一函数,用于画十字轨迹
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
private void drawtrack(panel panel)
double width = panel.width - 8;
//横线4条
drawline(0, 0, width / 4, 0, 3, panel, false);//l-
drawline(0, width, width / 4, width, 3, panel, false);//lb-
drawline(width * 3 / 4, 0, width, 0, 3, panel, false);//r-
drawline(width * 3 / 4, width, width, width, 3, panel, false);//rb-
//直线四条
drawline(0, 0, 0, width / 4, 3, panel, false);//l| ok
drawline(width, 0, width, width / 4, 3, panel, false);//r| ok
drawline(0, width, 0, width * 3 / 4, 3, panel, false);//lb|
drawline(width, width * 3 / 4, width, width, 3, panel, false);//rb|
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
说明:
画这么个框,记得以前还真费了不少劲,在那调坐标和宽度;
注意哦,drawline方法变成5个参数了,以前只有四个的。
3:drawline方法小调整
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
private void drawline(double x1, double y1, double x2, double y2)//保留原有方法原型,不用改其它画线代码
drawline(x1, y1, x2, y2, 1, container, true);
private void drawline(double x1, double y1, double x2, double y2, int thick, panel panel, bool auto)
double tempgap = ((x1 + y1) > 19 || !auto) ? 1 : gap;//就这行加了一个!auto,其它没变过
line line = new line()
{
x1 = x1 * tempgap + marginleft,
y1 = y1 * tempgap + margintop,
x2 = x2 * tempgap + marginleft,
y2 = y2 * tempgap + margintop,
stroke = new solidcolorbrush(colors.black),
strokethickness = thick
};
panel.children.add(line);
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
增加一个auto是干虾米用的呢?这是因为在画十字轨迹时,我们传进的是实际像素值,然而又可能出现x1+y1<19的情况,为了保证它是按像素计算,所以...你懂的!
还有,为啥是19,其实应该是17[数一下横线+直线有多少条,索引从0开始],这个问题在以前就说过了,这里不多解释了,保留19也没错。
4:初始化画棋盘时,把十字轨迹也画上
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
private void draw()
//省略画棋盘线代码
#region 画棋步轨迹
//创建两个十字修饰框
trackfrom = new canvas()
width = gap,
height = gap,
margin = new thickness(-marginleft * 12, -marginleft * 12, 0, 0)
trackto = new canvas()
drawtrack(trackfrom);
drawtrack(trackto);
container.children.add(trackfrom);
container.children.add(trackto);
#endregion
#region 画楚河汉界
drawfont("路过秋天");
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
二:chess象棋类增加设置十字焦点方法
1:增加设置十字焦点方法
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
/// 设置轨迹十字框
public void setfocus(point from, point to)
from = switchpixelarray(from);
to = switchpixelarray(to);
double offset = board.trackfrom.width / 2 - board.marginleft * 11 - 4;//要减去默认初始位置,默认是*-12
canvas.setleft(board.trackfrom, from.x - offset);
canvas.settop(board.trackfrom, from.y - offset);
canvas.setleft(board.trackto, to.x - offset);
canvas.settop(board.trackto, to.y - offset);
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
在移动棋步的时候,我们调用一下这个方法,把两个轨迹移动到相应的位置就ok了,
重点是:移动时,要减去原来的默认初始的位置,这个调整起来很麻烦。
三:chessaction棋子动作类
1:棋手移动时调用设置十字轨迹焦点函数
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
/// 移动棋子
/// <param name="chessman">棋子</param>
/// <param name="tox">移动到x坐标</param>
/// <param name="toy">移动到y坐标</param>
public bool moveto(chessman chessman, point moveto)
if (rule.iscanmove(chessman, moveto))
chessman.readymove = false;
chessman.chessman.background = null;
playmove(chessman, moveto);
parent.setfocus(chessman.movepoint, moveto);//就这一行代码增加
helpmovestepevent(chessman, moveto);
chessman.movepoint = moveto;
return true;
}
return false;
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
2:对方棋手下棋手,系统会自动移动棋子,也要自动设置十字轨迹焦点
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
/// <summary>
/// 系统自动移动棋子
public void automoveto(point from, point to)
chessman chessman = parent.findchessman(from);
chessman eatchessman = parent.findchessman(to);
if (chessman != null)
playmove(chessman, to);
parent.setfocus(from, to);//就这一行代码增加
chessman.movepoint = to;
if (eatchessman != null)
{
setisgameend(eatchessman);
eatchessman.gotodead();
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
四:f5看运行结果
1:运行后直接上图了
ok,大伙看到效果了吧!
版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:
http://www.cnblogs.com/cyq1162/archive/2010/10/11/1847625.html