华容道问题求解第一部分_详细设计(一)之棋子和游戏类_初始化部分
按:因为自控力和能力的原因,这个其实是在和代码同时进行的。
主要 类 说明
这一层是整个项目的基础,将对未来的算法的效率产生重要影响。为了和界面隔离,以及自身逻辑的清晰,下面的两个类是必须的,棋子类和游戏类。棋子类定义了棋子相关属性,游戏类中重点是算法方面的方法设计。
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)定义如下: 其中&…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
