一、MVC框架

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于数据、业务逻辑,界面显示的分离。将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中的三个元素为:

  1. Model, 表示数据的模型
  2. View,  表示用户界面的视图
  3. Controller, 定义了用户在界面上的操作控制

二、Qt的MVC——InterView框架(MVD)

MVC框架类似,Qt引入了模型/视图结构用于完成数据与界面的分离,即InterView框架。但不同的是,Qt的InterView框架中把视图和控制部件结合在一起,使得框架更为简洁。为了灵活地处理用户输入,InterView框架引入了代理(Delegate)。通过使用代理,能够自定义数据条目(item)的显示和编辑方式。

MVD

Qt的模型/视图结构分为了三种部分:模型(Model)、视图(View)、代理(Delegate)。其中,模型与数据通信,并为了其它部件提供接口;而视图从模型中获得用来引用数据条目的模型索引(Model Index);在视图中,代理负责绘制数据条目,当编辑条目时,代理和模型直接进行通信。

通信机制:信号槽

模型/视图/代理之间通过信号和槽进行通信,如下图所示。数据发生改变时,模型发出信号通知视图; 用户对界面进行操作,视图发生信号; 代理发出信号告知模型和视图编辑器目前的状态。

Qt的MVD框架

三、A*算法

详细的A*算法介绍见这篇英文文档

核心原理

A*算法成功的秘决在于,它把Dijkstra算法(靠近初始点的结点)和BFS算法(靠近目标点的结点)的信息块结合起来。在讨论A*的标准术语中,g(n)表示从初始结点到任意结点n的代价,h(n)表示从结点n到目标点的启发式评估代价(heuristic estimated cost)。在上图中,yellow(h)表示远离目标的结点而teal(g)表示远离初始点的结点。当从初始点向目标点移动时,A*权衡这两者。每次进行主循环时,它检查f(n)最小的结点n,其中f(n) = g(n) + h(n)。

算法简单实现

 如果不考虑具体实现代码,A*算法是相当简单的。有两个集合,OPEN集和CLOSED集。其中OPEN集保存待考查的结点。开始时,OPEN集只包含一个元素:初始结点。CLOSED集保存已考查过的结点。开始时,CLOSED集是空的。如果绘成图,OPEN集就是被访问区域的边境(frontier)而CLOSED集则是被访问区域的内部(interior)。每个结点同时保存其父结点的指针因此我们可以知道它是如何被找到的。

  在主循环中重复地从OPEN集中取出最好的结点n(f值最小的结点)并检查之。如果n是目标结点,则我们的任务完成了。否则,结点n被从OPEN集中删除并加入CLOSED集。然后检查它的邻居n’。如果邻居n’在CLOSED集中,那么它是已经被检查过的,所以我们不需要考虑它[1];如果n’在OPEN集中,那么它是以后肯定会被检查的,所以我们现在不考虑它*。否则,把它加入OPEN集,把它的父结点设为n。到达n’的路径的代价g(n’),设定为g(n) + movementcost(n, n’)。[1]这里我忽略了一个小细节.你确实需要检查结点的g值是否更小了,如果是的话,需要重新打开(re-open)它。

OPEN = priority queue containing START
CLOSED = empty set
while lowest rank in OPEN is not the GOAL:current = remove lowest rank item from OPENadd current to CLOSEDfor neighbors of current:cost = g(current) + movementcost(current, neighbor)if neighbor in OPEN and cost less than g(neighbor):remove neighbor from OPEN, because new path is betterif neighbor in CLOSED and cost less than g(neighbor): ⁽²⁾remove neighbor from CLOSEDif neighbor not in OPEN and neighbor not in CLOSED:set g(neighbor) to costadd neighbor to OPENset priority queue rank to g(neighbor) + h(neighbor)set neighbor's parent to currentreconstruct reverse path from goal to start
by following parent pointers⁽²⁾ This should never happen if you have an consistent admissible heuristic. However in games we often want inadmissible heuristics.

中国象棋-双人/人机版相关推荐

  1. 中国象棋纯CSS版--冰极峰

    中国象棋纯CSS版 本站原创:biny       转载请注明出处 先看截图: 图一 用html+css实现的中国象棋,本Demo实现的难点是象棋的米字格棋盘,这里用了一种比较变态的作法,不是用图片来 ...

  2. 单机中国象棋(Java版)

    好长时间没有碰java了,在网络上找到一个纯java写的单机版中国象棋,感兴趣的研究了一下,结果发现了几个错误:1.没有胜负结果的判定,老将死掉后还可以继续下棋:2.老将的活动范围没有仅限在田字格内. ...

  3. 仿qq中国象棋(web版)

    仿qq中国象棋(web版) 这是完全可以在线玩的webgame. 用到的技术:jsp + dwr(comet) + spring + jquery 只实现了百分之六七十的功能. 主要有注册,登陆,进入 ...

  4. 中国象棋的人机博弈程序

    对此题目有兴趣的朋友们: 感谢你们抽出宝贵的时间来阅读这些浅显的文字. 很多人可能都知道chess的人机大战: 1996年,卡斯帕罗夫以4比2战胜"深蓝"(Deep Blue): ...

  5. java中国象棋棋盘放置棋子,JAVA简易文字版中国象棋

    大二时制作的JAVA简易文字版中国象棋,现在放出,希望大家喜欢! // Java core packages import java.awt.*; import java.awt.event.*; / ...

  6. 中国象棋程序的设计与实现(二)--源码

    本篇将正式公布 中国象棋程序–高级版–楚汉棋兵 的所有源码.介绍一些相关信息,如源码下载地址.QQ交流群.源码结构.版权声明.其它更多文档,如 毕业设计论文.项目架构图图.心得体会.开发记录,将在本月 ...

  7. 中国象棋程序的设计与实现 二 --源码

    本篇将正式公布 中国象棋程序–高级版–楚汉棋兵 的所有源码.介绍一些相关信息,如源码下载地址.QQ交流群.源码结构.版权声明.其它更多文档,如 毕业设计论文.项目架构图图.心得体会.开发记录,将在本月 ...

  8. 中国象棋程序的设计与实现(三)--2012本科毕业论文等重要文档资料

    最近陆续发表了中国象棋程序的截图和源码,受到了不少CSDN网友的好评.中国象棋程序是我大学时期的最佳原创作品,同时这也是我的毕业设计选题.当然,我开发中国象棋主要还是为了锻炼.今天,正式向广大网友分享 ...

  9. 使用C++写的中国象棋(单机版)

    C++在游戏领域应用很广,其最大有点是运行效率高,对内存的操作比较直接,因此,我利用此有点写了中国象棋的简洁版,来进行一些简单的下棋操作.接下来是代码 #ifndef PUTTEXT_H_ #defi ...

最新文章

  1. Efficient Hybrid De Novo Error Correction and Assembly for Long Reads
  2. OpenCV Sobel检测算子和Scharr检测算子
  3. python爬取基金历史净值_Python爬取天天基金网历史净值数据
  4. 架构宣言: MDA 实战
  5. nginx 高并发优化参数
  6. 解决yum锁定Another app is currently holding the yum lock; waiting for it to exit...
  7. 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...
  8. 底层实现红黑树_【单选题】下列数据结构中,哪一个是ArrayList类的底层实现( ) A. 数组结构 B. 链表结构 C. 哈希表结构 D. 红黑树结构...
  9. idea快捷键汇总mac_IntelliJ IDEA for MAC 快捷键设置汇总
  10. linux语音识别_linux语音识别 arm_linux 语音识别引擎 - 云+社区 - 腾讯云
  11. 开心网(kaixin001.com)服务器架构的一点猜想
  12. Spark源码分析之Spark Shell(下)
  13. vue 圆形百分比进度条_vue圆形进度条
  14. c#开发条形码生成器
  15. 锤子终究走起了小米的路子
  16. Hibernate的Disjunction和Conjunction
  17. java5的新特性fore和可变参数
  18. 在QTCreator中保存某个文件出现:保存文件时发生错误:无法写入文件D:\test\test.h.磁盘已满?
  19. 手机号格式校验和手机号添加空格
  20. 和平精英灵敏度分享码服务器没有响应,和平精英主播灵敏度

热门文章

  1. 四轴飞行器实现定点、巡线和跟踪
  2. 用手机作为显示屏打造树莓派的移动电脑形态
  3. 周大福家源信物 | 连心携梦,点亮璀璨星愿
  4. Android的视频通话的Java代码
  5. dwg转成shape格式
  6. 华为Android面试真题解析,附赠课程+题库
  7. 怎样维护ERP,ERP维护需要具备什么知识?
  8. 天线理论知识5——微带天线
  9. 简历中种种你想不到的“致命”细节
  10. 如何酷酷的找回迅雷私人空间的密码