华容道问题求解第一部分_详细设计(一)之棋子和游戏类_初始化部分
按:因为自控力和能力的原因,这个其实是在和代码同时进行的。
主要 类 说明
这一层是整个项目的基础,将对未来的算法的效率产生重要影响。为了和界面隔离,以及自身逻辑的清晰,下面的两个类是必须的,棋子类和游戏类。棋子类定义了棋子相关属性,游戏类中重点是算法方面的方法设计。
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)定义如下: 其中&…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...