[求助]C#如何编写中国象棋翻转棋盘与悔棋

lansebinglian009 2015-04-24 02:03:39
象棋程序在大家的帮助下基本完成了,但是有个比较重要的部分就是翻转棋盘和悔棋,感觉悔棋难度比翻转棋盘更大一些,但现在问题是红黑双方交换的时候棋子是过来了,不过棋子上的字也跟着倒了,如下图所示(图片是自己截图翻转的,自己并没有实现棋盘翻转功能),如何设置棋盘翻转和翻转过来后字还不能倒着?以及如何设置悔棋

PS://棋盘是一个背景图片,翻转的时候用PS弄个转过来的一换就行,棋子是用一个二维数组存放的,求大神帮忙
...全文
450 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lansebinglian009 2015-04-25
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
[quote=引用 4 楼 lansebinglian009 的回复:] 实际尝试了下,交换的时候没有出现图片上的字倒了这种情况,和我想的有些不一样,只是我用数组交换的时候红方的棋子换到黑方那边去了(不包括已经过河的),但是黑方的棋子却没有到红方这边来,从棋盘消失了,求解~ 如下图,原先红方的棋子完整的到了黑方那边,位置也对应,已经过河的红方棋子从棋盘消失;黑方棋子整体消失,红方原先棋子不变
纠结所谓“数组翻转”就跟纠结所谓“图片翻转”一样,都是用技术的脑袋来想业务,往往是张冠李戴的。要设计程序流程,你要按照业务概念来设计,千万不要过多看那些过分技术化的描述。翻转数组可能就是一个“过分从技术出发”而忽视了业务危害(例如根本没有翻转之实、反而是搞乱了坐标)的想法。 假设你有所谓数组,你就不应该动它(你动数组干什么呢?),而应该把棋子翻转。首先你可以定义一个“二元对照表”,某个棋子翻转之后对应某个棋子,然后对于现在数组中的每一个棋子,查这个对照表,把它(包括图片)重新设置一遍。 从观察实际的业务操作出发来设计数据结构、和分析操作流程,不要从什么技术化的“翻转图片、翻转数组”这类时髦的名词儿出发。有时候就算是后者暂时貌似省点事儿,但是脱离了实际业务映射,往往也长久不了。[/quote] 挺有道理的,谢谢您的详细解答
lansebinglian009 2015-04-25
  • 打赏
  • 举报
回复
引用 5 楼 gamefinity 的回复:
你需要两个数组来进行翻转,你用一个数组的话,有可能你翻红方棋子的时候吧黑方的棋子清除掉了。一个更好的办法是你的数组根本不用翻转,而是显示的方法翻转,或者说坐标系翻转。 对你原帖的第二个问题,你应该有记录每一步走了什么吧,吧那个倒过来走就可以了。当然如果吃了子的话,要记住吃了啥
谢谢你的提示,茅塞顿开的感觉,只是悔棋还没来得及做,VS出问题了。
  • 打赏
  • 举报
回复
引用 4 楼 lansebinglian009 的回复:
实际尝试了下,交换的时候没有出现图片上的字倒了这种情况,和我想的有些不一样,只是我用数组交换的时候红方的棋子换到黑方那边去了(不包括已经过河的),但是黑方的棋子却没有到红方这边来,从棋盘消失了,求解~ 如下图,原先红方的棋子完整的到了黑方那边,位置也对应,已经过河的红方棋子从棋盘消失;黑方棋子整体消失,红方原先棋子不变
纠结所谓“数组翻转”就跟纠结所谓“图片翻转”一样,都是用技术的脑袋来想业务,往往是张冠李戴的。要设计程序流程,你要按照业务概念来设计,千万不要过多看那些过分技术化的描述。翻转数组可能就是一个“过分从技术出发”而忽视了业务危害(例如根本没有翻转之实、反而是搞乱了坐标)的想法。 假设你有所谓数组,你就不应该动它(你动数组干什么呢?),而应该把棋子翻转。首先你可以定义一个“二元对照表”,某个棋子翻转之后对应某个棋子,然后对于现在数组中的每一个棋子,查这个对照表,把它(包括图片)重新设置一遍。 从观察实际的业务操作出发来设计数据结构、和分析操作流程,不要从什么技术化的“翻转图片、翻转数组”这类时髦的名词儿出发。有时候就算是后者暂时貌似省点事儿,但是脱离了实际业务映射,往往也长久不了。
  • 打赏
  • 举报
回复
悔棋跟翻转的要点类似。 “棋谱”中数据结构可以是
public class 棋谱
{
    public 棋子 q;   //枚举值,例如 棋子.红车1
    public 位置 起点;   //例如 E8
    public 位置 终点;  //例如 E5

    pubic 棋谱 前一步;
}
可见,棋谱是一个“链表结构”,并且以最后一步作为棋谱。当新增加一个步骤时,就创建一个新的棋谱做最新的棋谱,并且把之前的棋谱赋值给新的棋谱对象的“前一步”属性。 这样也就知道了如何悔棋。只要把当前棋谱的相应棋子放回起点,并且将其“前一步”属性重新恢复为当前棋谱。
  • 打赏
  • 举报
回复
恩,如果是合理的结构了,那么就很容易为“翻转”定义概念了。 红车换为黑车、红兵换为黑卒、红帅换为黑将......这样一写就行了。
xuzuning 2015-04-24
  • 打赏
  • 举报
回复
翻转棋盘时,棋盘是不动的只是棋子做中心对称交换 如 八八位的炮交换到88位,当坐标的文字也交换后,依然是八八位 在实际实现时并不需要真实地交换棋子在数组中的位置,只是对显示坐标加一个偏移 悔棋也很简单,你本来就需要记谱的。 悔棋只是依记录从后往前倒过来走,直到开局。想悔几步都可以
知常曰明 2015-04-24
  • 打赏
  • 举报
回复
你需要两个数组来进行翻转,你用一个数组的话,有可能你翻红方棋子的时候吧黑方的棋子清除掉了。一个更好的办法是你的数组根本不用翻转,而是显示的方法翻转,或者说坐标系翻转。 对你原帖的第二个问题,你应该有记录每一步走了什么吧,吧那个倒过来走就可以了。当然如果吃了子的话,要记住吃了啥
lansebinglian009 2015-04-24
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
棋盘是不动的,每一个棋子是一个独立的控件,可以随时放到(用鼠标拖动到)棋盘任意位置。要是你连这个都没有做到,怎能说“基本完成那个了”呢?

被人忽悠了吧?不然为什么自己想不到这种要求呢?

实际尝试了下,交换的时候没有出现图片上的字倒了这种情况,和我想的有些不一样,只是我用数组交换的时候红方的棋子换到黑方那边去了(不包括已经过河的),但是黑方的棋子却没有到红方这边来,从棋盘消失了,求解~
如下图,原先红方的棋子完整的到了黑方那边,位置也对应,已经过河的红方棋子从棋盘消失;黑方棋子整体消失,红方原先棋子不变
翻转前
翻转后
  • 打赏
  • 举报
回复
棋盘是不动的,每一个棋子是一个独立的控件,可以随时放到(用鼠标拖动到)棋盘任意位置。要是你连这个都没有做到,怎能说“基本完成那个了”呢? 被人忽悠了吧?不然为什么自己想不到这种要求呢?
zbdzjx 2015-04-24
  • 打赏
  • 举报
回复
棋盘图片和棋子图片,都弄两套,一正一反。 点翻转棋盘,就将棋盘图片和棋子图片换另一套,存放棋子的二维数组重新计算生成,然后,显示界面重新显示。
  • 打赏
  • 举报
回复
引用 楼主 lansebinglian009 的回复:
象棋程序在大家的帮助下基本完成了,但是有个比较重要的部分就是翻转棋盘和悔棋,感觉悔棋难度比翻转棋盘更大一些,但现在问题是红黑双方交换的时候棋子是过来了,不过棋子上的字也跟着倒了,如下图所示(图片是自己截图翻转的,自己并没有实现棋盘翻转功能),如何设置棋盘翻转和翻转过来后字还不能倒着?以及如何设置悔棋 PS://棋盘是一个背景图片,翻转的时候用PS弄个转过来的一换就行,棋子是用一个二维数组存放的,
晕死。你从一开始就走上了不归路、搞不了多少东西就要推倒重来了。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧