UE5入门第二周总结:基于蓝图的国际象棋的实现

在C++的学习中,这是一个入门级别的项目。我们的目标是灵活运用蓝图的特性和强大的可视化功能,做出这一入门级项目的同时,思考如何优化并改进算法,并尽可能的用面向对象的方法实现,用蓝图中的继承和多态简化编码过程。

需求分析

按照国际象棋的规则正确的摆放棋子,并让棋子能够按照正确的行走规则在棋盘上根据玩家的指令移动,棋子能够正确的被吃掉。

程序设计

1.分析需求中所需要的要素,无非两点:不同的棋子和玩家与象棋的交互。为了实现这两点,我们需要定义“操作”和“棋子”。
2.一般来说,国际象棋的操作就是点击,所以我们可以通过棋子被点击的事件来实现操作。所以程序设计的重点在于“棋子”。国际象棋的“棋子”共有六种:“Pawn、Rook、Knight、Bishop、Queen、King”。尽管他们的移动规则各不相同,但同为棋子,其“操作”是有共性的:点击棋子后再点击目标位置,如果目标位置是这个棋子可以到达的位置,那么棋子就能移动到目标位置。事实上,区分这些不同棋子的根本特征,就是他们不同的外表和不同的移动规则。我们可以先把这些棋子相同的要素写进他们共同的父类中,用继承的方法减少代码量。

代码设计

1.作为一个入门级项目,棋子行走逻辑的实现是非常简单的。在这里我仅给出我自己使用的一个思路:在棋子基类中维护两个整型数组,其中一个用于记录棋盘上所有棋子的位置,并用PlayerCharactor不停地更新这个数组。第二个数组用于输出当前棋子可以移动的位置,不能到达的位置记为0,可以到达的位置记为1。( 这里其实可以不用整型数组而使用bool变量,但我个人更喜欢使用整型 )找到所有的合法路径后再通过第一个数组来判断是否有棋子阻挡了合法路径,最终得到当前棋子可以走到的所有位置,把这些位置存进第二个数组,实现棋子的行走逻辑。
2.在这里我想着重强调蓝图中的参数传递。事实上,蓝图中大部分函数使用的都是引用传递,再通过Set节点把对象中的内部成员改变,以此来实现对象之间的互动。需要特别注意的是拿到的基类成员必须使用cast to节点转换成子类成员才能调用子类中的特殊功能。

蓝图实现

先给出Player类的蓝图
为了能够实现把鼠标点击到棋盘的位置传给棋子,我定义了ChessBot类,每一个ChessBot类都是平铺在棋盘一格上的透明薄片。当玩家点击一颗棋子,棋子会根据自己当前的位置计算出上述的数组,并触发ChessBot里的Light事件,在屏幕上高亮显示可以移动的位置。当ChessBot被点击且玩家已经选中了一格棋子时,ChessBot会把自己的位置告知棋子,并触发棋子的Move事件。当承载有棋子的ChessBot成为了目标,会触发棋子的Death事件,被吃掉的棋子会移出棋盘。
这是棋子基类的蓝图,第一部分
第二部分
这是Bishop子类,LegalCheck函数实现了输出合法位置数组的功能

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值