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

需求分析

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

程序设计

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

代码设计

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

蓝图实现


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


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

  1. acm入门 第二周活动记录(李主持)

  2. UE5学习笔记(六)——蓝图基础之入门

    目录 一.蓝图前言 1.蓝图是什么? 2.蓝图的优劣势 3.哪些地方用蓝图 二.蓝图入门 1.进入方式 2.面板说明 工具栏 我的蓝图 细节面板 图表编辑器 3.基础步骤 1.开始流程 2.添加节点 ...

  3. 开源软件通识基础:第二周课程回顾与总结

    接第一篇<开源软件通识基础:第一周课程回顾与总结>,本文为第二周课程内容的回顾与总结. 本导学班在调研全球开源教育与课程的基础上,通过收集.整理.理解.拓展国际最新的前沿开源课程,采取众创 ...

  4. Django 学习小组:博客开发实战第二周教程 —— 实现博客详情页面和分类页面

    本教程内容已过时,更新版教程请访问: django 博客开发入门教程. 上周我们完成了博客的 Model 部分,以及 Blog 的首页视图 IndexView. 本节接上周的文档 Django 学习小 ...

  5. 【AI达人创造营第二期】基于Jetson nano的餐厅自助结账系统部署

    基于Jetson nano的餐厅自助结账系统部署 一. 前言 二. 开发环境 2.1 硬件 2.2 软件 三. Jetson nano基础环境配置 3.1 镜像烧录 3.2 网络连接 3.3 更换镜像 ...

  6. 【AI达人创造营第二期】基于PaddleClas的新冠肺炎CT影像的分类

    转自AI Studio,原文链接:[AI达人创造营第二期]基于PaddleClas的新冠肺炎CT影像的分类 - 飞桨AI Studio 一.项目背景 新近爆发的2019新型冠状病毒(SARS-CoV- ...

  7. 2017-2018-1 Java演绎法 第二周 作业

    团队任务:讨论Android上的游戏软件 参考现代软件工程 第一章 [概论]练习与讨论: 软件有很多种,也有各种分类办法,本次团队任务是讨论选取Android上的一个游戏软件,考虑到每位组员接触的游戏 ...

  8. 无人驾驶汽车系统入门(六)——基于传统计算机视觉的车道线检测(1)

    无人驾驶汽车系统入门(六)--基于传统计算机视觉的车道线检测(1) 感知,作为无人驾驶汽车系统中的"眼睛",是目前无人驾驶汽车量产和商用化的最大障碍之一(技术角度), 目前,高等级 ...

  9. Java 第二周学习总结

    Java 第二周学习总结 一.数组 数组即一组用于存储相同数据类型的数据结构:数组是一种典型的线性结构(连续).比如将一些商品数据呈现到页面中,此时可以将所有商品存储到数组中进行传递.数组是一种引用数 ...

最新文章

  1. 7、Zabbix微信告警
  2. 浅析一般网站建设的需要耗费多长时间?
  3. 计算机房装修对门的要求,防火门尺寸要求有哪些 防火门尺寸规范
  4. 迅雷第四季度净亏损3240万美元 环比亏损幅度扩大
  5. 微信适配国产操作系统:原生支持 Linux
  6. Maven命令 install 和 package的区别
  7. maven jetty
  8. 镜像数据库上SQL Server复制
  9. Apache Rewrite 理解
  10. 【ICLR 2018】模型集成的TRPO算法【附代码】
  11. 【转】 C#泛型集合—Dictionary使用技巧
  12. Linux报文硬件时间戳,linux 时间戳,打戳代码分析,用于PTP报文协议(示例代码)...
  13. 使用matlab的appdesigner制作分析固定简单电路的APP
  14. IT行业适合去的城市
  15. 创业怎么写商业计划书?
  16. 自定义滚动条文档(mCustomScrollbar使用文档)
  17. 蓝桥杯:填字母游戏(第八届决赛javaB第五题) 博弈+递归+回溯+map记忆化
  18. node.js setup wizard ended prematurely 失败解决方法
  19. 如何守住项目管理的质量“底线”?
  20. 产品研究:WPS如何在Office的“围剿”下突围

热门文章

  1. Dangling meta character ‘+‘ near index 1异常
  2. 矩阵乘法的几种观点,内积外积的理解
  3. 人工智能|只要你敢画,我就能找到!
  4. java 判断是否夏令时_怎么在linux下 使用java代码正确获取夏令时的时间
  5. WAIC2023记录
  6. mysql创建hash索引
  7. jquery 定时器的使用
  8. 【论文笔记】LiDAR Iris for Loop-Closure Detection
  9. “华为杯”研究生数学建模竞赛2020年-【华为杯】E题:基于深度学习的大雾条件下能见度估计与预测(附优秀论文及Python代码)
  10. VMware虚拟机连接无线网