华容道问题求解第一部分_详细设计(一)之棋子和游戏类_初始化部分
按:因为自控力和能力的原因,这个其实是在和代码同时进行的。
主要 类 说明
这一层是整个项目的基础,将对未来的算法的效率产生重要影响。为了和界面隔离,以及自身逻辑的清晰,下面的两个类是必须的,棋子类和游戏类。棋子类定义了棋子相关属性,游戏类中重点是算法方面的方法设计。
UML 略图如下

生成一个HrdGame的实例,就可以进行基本的处理了。HrdGame有默认的布局,即经典的“横刀立马”布局,并且实现了UI部分的功能,只要传入标准的C#控件,就可以进行图形部分的渲染。主要的Class 即HrdGame和Prece,其余类都是辅助类,用于对棋子形状和尺寸的刻画,以及求解过程中队列或者堆栈元素的记录。
Piece Class

PIece中的Key property 是 位置和形状,由于华容道形状都是矩形,因此形状属性弱化为SIze,即只保留了形状中的尺寸属性。
这两个属性是
HrdPos :位置
HrdSize:大小
具体刻画使用 HrdPoint 进行定义,HrdPoint 是一个用户定制类的基本类,定义如下:

使用这个定制类的目的,是为了和系统的Point 类进行区分。
这里的X,Y属性一个抽象的数据,它表示系统用于显示棋子控件的相对大小。并不对应屏幕的像素数值,是一个相对的数据。这样做的目的,是便于将棋子显示在不同大小的控件中。
#HRDGame 类



该类集中了华容道算法的布局和处理已经UI渲染的全部功能,这里主要介绍其核心方法。
构造函数
public HRDGame(Form form,Control ctrl){_mainForm = form;_ctrl = ctrl;this._ctrl.Paint += new System.Windows.Forms.PaintEventHandler(this.HrdPaint);this._ctrl.Resize += new System.EventHandler(this.Resize);_setDefayultLayout();InitializeTimer();}
构造函数中需要传入 两个参数,调用的Form已经用于显示棋盘的控件。注意构造函数中对Paint 和Resize属性进行了调用,这样就最大程度地减少外部函数对UI的控制。
其中 _setDefayultLayout() 进行了基础布局,即“横刀立马”布局;
(基本)布局函数
布局函数的核心代码如下:
private void _setDefayultLayout(){for (int i = 0; i < gameState.pieces.Length; i++){gameState.pieces[i] = new Piece();}gameState.pieces[0].CreatePiece("空", 0, new HrdPoint(2, 5), new HrdPoint(1, 1), 5, PieceClr[5], "单元方块");gameState.pieces[1].CreatePiece("白", 1, new HrdPoint(3, 5), new HrdPoint(1, 1), 5, PieceClr[5], "单元方块");....// represent the entity. foreach (var pcs in gameState.pieces){FillLayoutArr(pcs);}}
该函数完成对所有棋子的初始逻辑定义,然后根据传进来的控件进行渲染,渲染在 FillLayoutArr(pcs)中完成基本的数据设定,然后调用Paint函数进行具体的施画过程。
FillLayoutArr 函数完成棋子的具体描述。棋盘的底层数据为一个5*4的数组,每个数组元素表示一个单位正方形,利用这些单位正方形来刻画具体的棋子。例如: 小卒 就是一个基本的单位正方形,而曹操由4个单位正方形构成。我们因为棋子的左上角坐标表示整个棋子的位置,其余单位正方形的位置彩色与固定位置描述的方法,具体由棋子的 HrdType 属性决定。
Hrdtype的定义采用Hard Code 定义的,具体如下:
/// _type = 5 , the blank block on the board, size is (1,1) (width, height)/// = 1, the soldier block , size is (1,1)/// = 2, the vertical blcok, size is (2,1) 张飞,赵云,马超,黄忠 /// = 3, the horizaontal blcok , size is (1,2) 关羽/// = 4 , the biggest block , size is (2,2) 曹操/// = 0, null, this area is out of the board
这样做是为了简化程序的数据结构和过程,我们不处理其余更复杂和灵活的布局以及棋子形状。
布局完成后,就进入了求解过程。(待续)
马拉孙于BJFWDQ
2024-03-04
相关文章:
华容道问题求解第一部分_详细设计(一)之棋子和游戏类_初始化部分
按:因为自控力和能力的原因,这个其实是在和代码同时进行的。 主要 类 说明 这一层是整个项目的基础,将对未来的算法的效率产生重要影响。为了和界面隔离,以及自身逻辑的清晰,下面的两个类是必须的,棋子类…...
【框架】Spring 框架重点解析
Spring 框架重点解析 1. Spring 框架中的单例 bean 是线程安全的吗? 不是线程安全的 Spring 框架中有一个 Scope 注解,默认的值是 singleton,即单例的;因为一般在 Spring 的 bean 对象都是无状态的(在生命周期中不被…...
js中的内存泄漏
理解 内存泄漏是计算机,中由于疏忽或者错误造成程序未能释放已经不在使用的内存,知道浏览器结束 垃圾回收机制 js具有自动的垃圾回收机制,垃圾收集器会定期(周期性)的找出那些不在继续使用的变量,然后释放内存 常见的内存泄漏 意外的全局变量 function foo(){bar 123123…...
营业执照年报申报
姿势:营业执照年报申报 借鉴文章:个体工商户年报申报流程(不要再花冤枉钱) 1、国家企业信用信息公示系统 地址:https://www.gsxt.gov.cn/index.html 2、登录(重庆的方式二简单)...
Springboot教程(五)——单元测试
idea中一般使用JUnit进行单元测试 基本使用 我们可以在idea的test文件夹下的XXXXApplicationTests内进行单元测试: 可以在Test标注的方法上写测试代码: SpringBootTest class C0101ApplicationTests {Testfun contextLoads() {println("Hello …...
【Kotlin】函数
1 常规函数 1.1 无参函数 fun main() {myFun() }fun myFun() {println("myFun") // 打印: myFun } 1.2 有参函数 1)常规调用 fun main() {myFun("myFun") // 打印: myFun }fun myFun(str: String) {println(str) } 2)形参指定默…...
Unity生命周期函数解析
本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com Unity生命周期函数解析 Unity 生命周期函数是在游戏对象的不同阶段被调用的方法,通过这些函数,我们可以在不同的时刻执行特定的代码。在这篇文章中,我们将一步步解析 Unit…...
【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进
【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进 文章目录 I - 主要原理II - 代码实现2.1 - 自定义类2.2 - 实现 Tab 缩进2.3 - 实现反缩进 III - 参考链接 I - 主要原理 由于 QTextEdit 和 QPlainTextEdit ,都无法实现多行选中缩进与反缩进ÿ…...
C++缺陷与思考
数组隐式转换为指针 size_t func(int a[10]) {return sizeof(a); }int a[100]; func(a); // 指针大小 sizeof(a); // 数组大小函数的参数看似是一个数组形式,但事实上他已经退化为指针了,也就是等价于size_t func(int* a),而数组作为参数传…...
无公网ip环境使用DS file软件远程访问内网群晖NAS中储存的文件
文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接 DS file 是一个由群晖公司开发的文件管理应用程序,主要用于浏览、访问和管理存储在群晖NAS(网络附加存储)中的文件。这个应用程序具有…...
软件工程基础
本博客地址:https://security.blog.csdn.net/article/details/136446772 一. 软件工程 1、软件危机。具体表现为:软件开发进度难以预测、软件开发成本难以控制、软件功能难以满足用户期望、软件质量无法保证、软件难以维护和软件缺少适当的文档资料。 …...
alzet供应商你值得拥有
在20世纪70年代,ALZE公司研发出来一款巧妙的药物输送装置——Alzet osmotic pump。这款产品如胶囊般精致小巧,它既有胶囊的外表,也具有胶囊的作用。在Alzet osmotic pump中藏有可以装配药物溶液的空间。此款胶囊泵如同一个小投递员࿰…...
x86中的TSS与任务切换
前言 今天在学习《深入理解Linux内核》的时候,发现出现了一个新的名词TSS(Task-State Segment),这还是我第一次了解到原来x86提供了硬件级别的任务切换功能,之前以为任务切换都是操作系统实现的来着,这里也…...
打造去中心化透明储蓄罐:Solidity智能合约的又一实践
一、案例背景 传统的储蓄罐通常是由个人或家庭使用,用于存放硬币或小额纸币。然而,这样的储蓄罐缺乏透明性,用户无法实时了解储蓄情况,也无法确保资金的安全性。 通过Solidity智能合约,我们可以构建一个去中心化…...
Java Mybatis数据库面试题
Java Mybatis数据库面试题 前言1、什么是 Mybatis?2、Mybaits 的优缺点:3、SQL 注入如何防止?4、MyBatis 框架适用场合:5、MyBatis 与 Hibernate 有哪些不同?6、#{}和${}的区别是什么?7、当表中的字段名和实…...
LeetCode-第14题-最长公共前缀
1.题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 2.样例描述 3.思路描述 按字符串数组每个数组的长度,将字符串数组从小到大排序;他们的公共前缀一定小于或等于最长元素长度…...
TCP/UDP模型:2024/2/29
作业1:TCP模型 服务器端: #include <myhead.h> #define SER_IP "192.168.199.129" #define SER_PORT 8899int main(int argc, const char *argv[]) {//1.创建用于连接的套接字文件int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){per…...
微信如何设置自动回复消息,提升沟通效率的?
在日常微信聊天过程中,我们可能会频繁遇到相同问题的客户提问,特别是对于从事销售工作的朋友们而言,客户添加好友后的第一句话常常为“在吗”或“你好”。当我们拥有大量好友,手动逐一回复可能会耗费大量时间。因此,自…...
PCIE的BAR空间
1.PCIe 简介 PCIe(Peripheral Component Interconnect Express)是一种高速 串行计算机扩展总线标准,主要用于连接主板上的中央处理器(CPU)和 各种外部设备,如显卡、声卡、硬盘等。PCIe 总线取代了传统的 PC…...
11.互信息-机器学习模型性能的常用的评估指标
互信息(Mutual Information)是机器学习中常用的一种评估指标,特别是在无监督学习和聚类分析中。它用于衡量两个随机变量之间的相关性或相似性。 定义 给定两个随机变量X和Y,它们的互信息I(X;Y)定义如下: 其中&…...
抖音小店搜索排名规则及优化方法
一、抖音商城搜索排名规则1.商品相关性:商品标题、关键词与用户搜索词的匹配程度是重要因素。精准匹配的商品会在搜索结果中更靠前展示。例如,用户搜索"夏季连衣裙”,标题中明确包含该关键词且商品属性也相符的连衣裙,会优先被展示。商品…...
AI 教研科研一体化平台,以智能技术打通高校教研发展新路径
当前高校教学与科研工作普遍存在脱节割裂的问题,教学、教研、科研各成体系,资源分散、流程独立、数据不通。传统模式下,教师备课教学、课题研究、成果沉淀依靠人工完成,存在资源复用率低、科研选题盲目、教研过程无溯源、成果转化…...
为小型创业团队搭建经济可控的大模型应用开发平台
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为小型创业团队搭建经济可控的大模型应用开发平台 对于资源有限的创业团队而言,在拥抱大模型技术的同时,必…...
工业机器视觉工控机选型指南:从硬件配置到现场调试
1. 产品定位与核心价值解析在工业自动化领域,尤其是机器视觉应用场景中,稳定、可靠且性能强劲的硬件平台是整套系统能够7x24小时无间断运行的基石。朗锐智科推出的这款机器视觉工控机,从其核心配置来看,精准地瞄准了中高端视觉检测…...
手把手教你用STM32CubeMX和HAL库搞定PAJ7620U2手势传感器(附完整初始化代码)
STM32CubeMX与HAL库实战:PAJ7620U2手势传感器全流程开发指南 当你第一次拿到PAJ7620U2手势传感器模块时,可能会被它强大的功能所吸引——它能识别9种手势动作,包括上下左右滑动、前后推拉、顺时针/逆时针旋转以及挥手动作。但随之而来的问题是…...
2026固态电池冬季续航实测:零下20℃仍跑600公里?
2026年固态电池量产车型对冬季续航提升的实际数据与技术解析 针对2026年固态电池量产车型在冬季续航方面的表现,目前尚无公开的、基于大规模量产车型的完整冬季实测数据。然而,结合固态电池的技术原理、已发布的实验室及小规模测试数据,以及…...
SAP ABAP实战:用cl_md_bp_maintain批量维护客户BP,附完整代码与字段拆分逻辑
SAP ABAP实战:基于cl_md_bp_maintain的客户主数据批量处理框架 在SAP系统集成项目中,客户主数据的批量创建与更新是高频需求场景。当需要对接电商平台、CRM系统或进行历史数据迁移时,传统单条处理方式效率低下且难以保证数据一致性。本文将深…...
Vitis 2021.2自定义IP从Platform到App的完整避坑指南:头文件、宏定义与QEMU报错一网打尽
Vitis 2021.2自定义IP全流程开发实战:从Platform构建到多核调试的深度解析 在FPGA开发领域,Xilinx的Vitis统一软件平台为开发者提供了从硬件设计到软件开发的完整工具链。然而,当涉及到自定义IP集成时,即使是经验丰富的工程师也常…...
终极字体压缩指南:如何用Fontmin让网页字体加载快3倍
终极字体压缩指南:如何用Fontmin让网页字体加载快3倍 【免费下载链接】fontmin Minify font seamlessly 项目地址: https://gitcode.com/gh_mirrors/fo/fontmin Fontmin是一款基于纯JavaScript开发的字体压缩工具,能够将庞大的字体文件压缩成仅包…...
5分钟掌握跨平台资源下载:res-downloader视频号批量下载终极指南
5分钟掌握跨平台资源下载:res-downloader视频号批量下载终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …...
