C#如何控制中国象棋棋子的移动

.Net技术 码拜 9年前 (2015-05-10) 1599次浏览 0个评论

就要毕业了,无奈运气不好,选了中国象棋编程这个题目,小弟本身编程能力很弱,而且C#以前就学了一个月,基本连入门都不是。象棋棋盘是用Graphics函数画的,当然借鉴了别人的源码,象棋棋子我用的是PictureBox控件,一个棋子用这么一个控件然后一一贴图,可能是最笨的一种方法了。但是现在贴好之后不知道如何控制这些棋子的移动,求大神指点
C#如何控制中国象棋棋子的移动
这是贴完图后的界面
C#如何控制中国象棋棋子的移动
棋子全部是用PictureBox控件完成的
C#如何控制中国象棋棋子的移动
运行生成后的

10分
根据鼠标点击位置移动坐标,需要给每个类型的棋子指定移动规则。
20分
http://blog.csdn.net/starfd/article/details/44850449
参考上面的图片拖动
引用 2 楼 starfd 的回复:

http://blog.csdn.net/starfd/article/details/44850449
参考上面的图片拖动

不一样的地方在于你的Drag事件是要修改PictureBox位置

背景一个图片,每一个棋子都是一个图片,然后想办法移动这个图片就可以了。
10分
你要先取每个网格的坐标,然后再用鼠标事件点击像棋后,再点那个网格的坐标,就把像棋的Location对应到那个网格的坐标上就可以了
10分
你可以先选中一个棋子 ,也就是picturebox,然后再点击另一个节点,这时将选中的棋子移到另一个节点上,中间要考虑吃子等规则
引用 4 楼 zbdzjx 的回复:

背景一个图片,每一个棋子都是一个图片,然后想办法移动这个图片就可以了。

现在有个想法就是点击棋子后选中它,让它的背景色改变,比如我现在的这个,在棋子四周加一个记号C#如何控制中国象棋棋子的移动
这个控件的名字被我改成了Rpao1(红炮1),用了以下语句

private void Rpao1_MouseDown(object sender, MouseEventArgs e)
        {
            //设置点击选中图像后背景色
            Image img = new Bitmap(“C:\Mask.png”);
            Rpao1.BackgroundImage = img;
        }
但是这个图片的路径是本地硬盘的,我如果使用VS里的Rescourse里的图片文件该如何改写代码呢?
另外因为炮总共有四个,红黑各两个,是每一个炮都这样写呢还是有没有简便的方法,求帮助

引用 3 楼 starfd 的回复:
Quote: 引用 2 楼 starfd 的回复:

http://blog.csdn.net/starfd/article/details/44850449
参考上面的图片拖动

不一样的地方在于你的Drag事件是要修改PictureBox位置

谢谢您的回答,这个例子很详细,只是基础薄弱,另外时间也不是很充足,一时难以完全消化。

引用 6 楼 johnliuyuan 的回复:

你可以先选中一个棋子 ,也就是picturebox,然后再点击另一个节点,这时将选中的棋子移到另一个节点上,中间要考虑吃子等规则

要是暂时不考虑吃子的规则,比如选一个炮,暂时允许它移动到任何地方,但是这刚开始的代码我想了好久不知道如何下手

引用 5 楼 wyd1520 的回复:

你要先取每个网格的坐标,然后再用鼠标事件点击像棋后,再点那个网格的坐标,就把像棋的Location对应到那个网格的坐标上就可以了

这是对的

引用 10 楼 piaopiao_lucky 的回复:
Quote: 引用 5 楼 wyd1520 的回复:

你要先取每个网格的坐标,然后再用鼠标事件点击像棋后,再点那个网格的坐标,就把像棋的Location对应到那个网格的坐标上就可以了

这是对的

我到是能想到这个,但是就是基础薄弱,刚开始的代码不知如何下手

引用 7 楼 lansebinglian009 的回复:
Quote: 引用 4 楼 zbdzjx 的回复:

背景一个图片,每一个棋子都是一个图片,然后想办法移动这个图片就可以了。

现在有个想法就是点击棋子后选中它,让它的背景色改变,比如我现在的这个,在棋子四周加一个记号C#如何控制中国象棋棋子的移动
这个控件的名字被我改成了Rpao1(红炮1),用了以下语句

private void Rpao1_MouseDown(object sender, MouseEventArgs e)
        {
            //设置点击选中图像后背景色
            Image img = new Bitmap(“C:\Mask.png”);
            Rpao1.BackgroundImage = img;
        }
但是这个图片的路径是本地硬盘的,我如果使用VS里的Rescourse里的图片文件该如何改写代码呢?
另外因为炮总共有四个,红黑各两个,是每一个炮都这样写呢还是有没有简便的方法,求帮助

如何调用Rescourse里的资源问题已经解决了,不过后面的那个还得麻烦您

10分
引用 7 楼 lansebinglian009 的回复:
Quote: 引用 4 楼 zbdzjx 的回复:

背景一个图片,每一个棋子都是一个图片,然后想办法移动这个图片就可以了。

现在有个想法就是点击棋子后选中它,让它的背景色改变,比如我现在的这个,在棋子四周加一个记号C#如何控制中国象棋棋子的移动
这个控件的名字被我改成了Rpao1(红炮1),用了以下语句

private void Rpao1_MouseDown(object sender, MouseEventArgs e)
        {
            //设置点击选中图像后背景色
            Image img = new Bitmap(“C:\Mask.png”);
            Rpao1.BackgroundImage = img;
        }
但是这个图片的路径是本地硬盘的,我如果使用VS里的Rescourse里的图片文件该如何改写代码呢?
另外因为炮总共有四个,红黑各两个,是每一个炮都这样写呢还是有没有简便的方法,求帮助

不要改变图片。棋盘上应该叠加另外一个“手”的控件。

能不能这样:制定好每个棋子的规则,每个坐标点都设置一个Pbox 
鼠标点击一个Pbox后,标记 ——》获取再次点击的坐标,就可以按棋子行动规则在新坐标显示棋子?
我也是半吊子
引用 14 楼 hangtongilu 的回复:

能不能这样:制定好每个棋子的规则,每个坐标点都设置一个Pbox 
鼠标点击一个Pbox后,标记 ——》获取再次点击的坐标,就可以按棋子行动规则在新坐标显示棋子?
我也是半吊子

我也一样,不过总得把东西弄出来

20分

private void Rpao1_MouseDown(object sender, MouseEventArgs e) 中记录当前的鼠标位置
ax = e.X; ay = e.Y;

private void Rpao1_MouseMove(object sender, MouseEventArgs e)  中
            if (e.Button == MouseButtons.Left)
            {
                Rpao1.Left = Rpao1.Left + (e.X – ax);
                Rpao1.Top = Rpao1.Top + (e.Y – ay);
            }
图片就跟着鼠标走了
10分
把棋盘上的每个位置,首先固定好坐标,左上角是(0,0)
你可以看看window资源管理器是如何管理移动资源的。你把一个文件用鼠标拽到另外一个窗口里,或者拽到windows任务栏的某个应用上,这些在 .net 的桌面编程中都是非常成熟的“拖放”界面设计。

先把比较规范和通用的“拖放”界面编程方法搞明白了。先不要给每一个棋子都去设计什么“两套图片”,那是跟现有最重要的事情背道而驰的。

谢谢您的回答,棋子已经弄好了,现在的问题是这样的:举个简单的例子,就拿下面那张图片来说,这种情况下黑方已经将死了,但是黑方下一步还能走棋,例如撑士形成照面或者直接将移过去,如果红方不用炮或者帅直接去吃的话黑方是不会死的,我现在的程序正是这种情况,如何设置当炮下去的时候直接判定黑方输呢?或者当黑方要走下一步的时候提示:将帅不能照面,或者“将被将军”之类的语句
C#如何控制中国象棋棋子的移动
引用 18 楼 sp1234 的回复:

你可以看看window资源管理器是如何管理移动资源的。你把一个文件用鼠标拽到另外一个窗口里,或者拽到windows任务栏的某个应用上,这些在 .net 的桌面编程中都是非常成熟的“拖放”界面设计。

先把比较规范和通用的“拖放”界面编程方法搞明白了。先不要给每一个棋子都去设计什么“两套图片”,那是跟现有最重要的事情背道而驰的。

刚才貌似回复错地方了
谢谢您的回答,棋子已经弄好了,现在的问题是这样的:举个简单的例子,就拿下面那张图片来说,这种情况下黑方已经将死了,但是黑方下一步还能走棋,例如撑士形成照面或者直接将移过去,如果红方不用炮或者帅直接去吃的话黑方是不会死的,我现在的程序正是这种情况,如何设置当炮下去的时候直接判定黑方输呢?或者当黑方要走下一步的时候提示:将帅不能照面,或者“将被将军”之类的语句
C#如何控制中国象棋棋子的移动

引用 16 楼 xuzuning 的回复:


private void Rpao1_MouseDown(object sender, MouseEventArgs e) 中记录当前的鼠标位置
ax = e.X; ay = e.Y;

private void Rpao1_MouseMove(object sender, MouseEventArgs e)  中
            if (e.Button == MouseButtons.Left)
            {
                Rpao1.Left = Rpao1.Left + (e.X – ax);
                Rpao1.Top = Rpao1.Top + (e.Y – ay);
            }
图片就跟着鼠标走了

谢谢版主的回复,现在的问题是如何设定:“将帅不能照面”,或者当前处于将军状态下时如果你下一步要走的棋子不能缓解“将军”这个状态,弹出提示 “帅被将军”之类的规则呢?

10分
被将死的情况太多,太复杂
不可能用代码判断,应建立知识库,查表解决
引用 3 楼 娃都会打酱油了的回复:
Quote: 引用 2 楼 starfd 的回复:

http://blog.csdn.net/starfd/article/details/44850449
参考上面的图片拖动

不一样的地方在于你的Drag事件是要修改PictureBox位置

棋盘非常简洁漂亮哦!
哇,楼上真恐怖
引用 25 楼 mni2005 的回复:

1000 元帮你搞定代码

没那个必要

看到黑炮画成了”包”,瞬间想起了NES游戏机上面那个古老的象棋游戏
引用 28 楼 sugar13 的回复:

看到黑炮画成了”包”,瞬间想起了NES游戏机上面那个古老的象棋游戏

自己懒得弄棋子,直接从某个棋软里拉出来的棋子图片

引用 22 楼 xuzuning 的回复:

被将死的情况太多,太复杂
不可能用代码判断,应建立知识库,查表解决

麻烦请教下,现在棋子是用pictureBox控件画的,我先选择棋子以后,当我单击我要移动的那个位置的坐标范围时如何触发事件?举个例子如下图所示,现在选择炮,炮目前位于中心坐标为(120.210)半径是30的圆内,我要移动的位置圆心坐标为(120.330)半径还是30,但是我点击的时候不可能很准确的点到(120.330)这个坐标,只要鼠标进入以(120.330)为坐标,30为半径的圆内部的时候就触发这个事件,这该如何写代码呢?
点A是炮的当前位置,中心坐标(120.210)半径30,B是将要移动的位置,圆心坐标(120.330)半径30
C#如何控制中国象棋棋子的移动

你的虚线框把棋盘分为 9×10 的网格
要想知道鼠标落在了哪个格子里只需
gx = e.X / 网格宽;
gy = e.Y / 网格高;

至于是否落在了棋子上,你再用勾股定律算一下就可以了

看这个。献丑了。

【中国象棋】C#206行代码编写象棋游戏
http://bbs.cskin.net/forum.php?mod=viewthread&tid=579&fromuid=2

引用 33 楼 lyx_520 的回复:

看这个。献丑了。

【中国象棋】C#206行代码编写象棋游戏
http://bbs.cskin.net/forum.php?mod=viewthread&tid=579&fromuid=2

谢谢您的回复,但是想看看的话需要金钱

引用 34 楼 lansebinglian009 的回复:
Quote: 引用 33 楼 lyx_520 的回复:

看这个。献丑了。

【中国象棋】C#206行代码编写象棋游戏
http://bbs.cskin.net/forum.php?mod=viewthread&tid=579&fromuid=2

谢谢您的回复,但是想看看的话需要金钱

随便注册个账号,签到,做下任务就有了。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#如何控制中国象棋棋子的移动
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!