在一个完整的中国象棋游戏中,一般界面上都显示了中文着法,为了简单起见,我开发的这个用了两个着法列表,红方一个,黑方一个,其实用一个就够了,只是感觉那样稍微会麻烦些。着法列表显示了每一步的走棋。下图是着法列表的截图:

 

着法列表用的是一个叫StepList的类来实现的,因为有两个着法列表,所以用了两个StepList对象。实例化的时候,指定一个特殊的参数用来标示是左边的还是右边的。像下面那样。

    leftStepList = new StepList(this, true);rightStepList = new StepList(this, false);

StepList类包括以下数据成员:

一个QPixmap对象:用来标示是哪一方。

一个QTableView指针对象:用于显示中文着法。

一个QStandardItemModel指针对象:用于向tableView赋值。

四个QPushButton指针对象:用于实现翻页和翻行功能。

一个QLabel指针对象:用于显示当前页面信息。

一个int类型成员:用于标示当前是第几步。在翻页和翻行中用到。

一个QVector容器:用于保存所有的着法历史。

有哪些成员函数,我就不介绍了,大家可以去看代码。

关于tableView,下面是创建的代码:

void StepList::initTableView()
{tableView = new QTableView(this);tableView->move(0, 60);model = new QStandardItemModel(15, 3);model->setHeaderData(0, Qt::Horizontal, tr("序号"));model->setHeaderData(1, Qt::Horizontal, tr("走法"));model->setHeaderData(2, Qt::Horizontal, tr("时间"));tableView->setSelectionBehavior(QAbstractItemView::SelectRows);tableView->setModel(model);tableView->setColumnWidth(0, 30);tableView->setColumnWidth(1, 70);tableView->setColumnWidth(2, 75);tableView->setFixedSize(200, 480);
}

我们指定了tableView是3列15行,显示哪些内容。每列的大小。

翻页和翻行是整个类中最主要的内容,用一个currentOrderNumber的成员变量记录当前走法的序号,根据这个我们可以确定当前页是第几页以及当前页的序号范围,这样我们就可以从vector中取数据,然后显示到界面上,比如说当我们点击“>”按钮后,当前选中的记录就是下一条记录,序号就会加一。下面是下一行和下一页所做的事情:

void StepList::nextRecord()
{currentOrderNumber++;updateHistoryDisplay();
}void StepList::nextPage()
{currentOrderNumber = std::min(currentOrderNumber + MOVE_STEP_PER_PAGE, vecMoveHistory.size());updateHistoryDisplay();
}void StepList::updateHistoryDisplay()
{QModelIndex modelIndex;for (int i = 0; i < MOVE_STEP_PER_PAGE; ++i){for (int j = 0; j < COLUMN_PER_STEP; ++j){modelIndex = model->index(i, j, QModelIndex());model->setData(modelIndex, tr(""));}}int currentPage = getPageNumber(currentOrderNumber);int totalPage = getPageNumber(vecMoveHistory.size());int currentRecordIndex = getRecordIndex(currentOrderNumber);if (vecMoveHistory.size() == 0){btnPrevPage->setEnabled(false);btnPrevRecord->setEnabled(false);btnNextRecord->setEnabled(false);btnNextPage->setEnabled(false);tableView->clearSelection();}else{int startIndex = (currentPage - 1) * MOVE_STEP_PER_PAGE;int endIndex = std::min(currentPage * MOVE_STEP_PER_PAGE, vecMoveHistory.size()) - 1;for (int i = startIndex; i <= endIndex; i++){modelIndex = model->index(i % MOVE_STEP_PER_PAGE, 0, QModelIndex());model->setData(modelIndex, vecMoveHistory.at(i).orderNumber);modelIndex = model->index(i % MOVE_STEP_PER_PAGE, 1, QModelIndex());model->setData(modelIndex, vecMoveHistory.at(i).moveStepInfo);modelIndex = model->index(i % MOVE_STEP_PER_PAGE, 2, QModelIndex());model->setData(modelIndex, vecMoveHistory.at(i).moveStepTime);}modelIndex = model->index(currentRecordIndex - 1, 0, QModelIndex());tableView->setCurrentIndex(modelIndex);btnPrevRecord->setEnabled(currentRecordIndex > 1);btnPrevPage->setEnabled(currentPage > 1);btnNextRecord->setEnabled(currentOrderNumber < vecMoveHistory.size());btnNextPage->setEnabled(currentPage < totalPage);}QString pageInfo;pageInfo.sprintf("当前页:%d/%d", currentPage, totalPage);lblPageInfo->setText(pageInfo);
}

翻行和翻页,都是先设置currentOrderNumber的值,让后调用updateHistoryDisplay更新列表显示。我们每走一步完整的棋,记录就会下移一行,就相当于调用nextRecord。

源代码下载链接:http://download.csdn.net/detail/zxywd/9172917

使用Qt开发中国象棋(三):走棋着法列表相关推荐

  1. Qt实现中国象棋:(三)棋盘绘制的详细分析及实现

    一.图片及棋盘分析 1:在上文中已经对单张图片的显示进行了测试,从中可以知道一张图片需要一个QPixmap对象对其进行加载.棋盘图片共有23张,也就需要23个QPixmap的对象.同时要求对象名与图片 ...

  2. 使用Qt开发中国象棋(一):概述

    最近看了一些关于中国象棋的实现书籍,里面讲述了如何开发一个完整的中国象棋游戏,看了里面的内容,感觉里面的内容特别巧妙的,比如书中提到了用位棋盘来表示中国象棋的棋盘以及一些精妙的走棋算法.基于这些,自己 ...

  3. 使用Qt开发中国象棋(六):将军和死棋检测

    下棋的过程中,某一方主帅被对方攻击就是将军,如果不能解除危险,就是死棋.在这个游戏中实现了将军的判断和死棋的检测.具体如下: (1)每走一步棋时,先要判断自己能不能这样走,当然除了走法是否合乎规则,比 ...

  4. Qt实现中国象棋:(七)悔棋

    一.下棋步骤的保存 在设置保存下棋步骤之前,先定义一个bool类型的变量player用于判定是哪一方下子,设定player=true时是红方下棋,player=false时是黑方下棋. 1:要想保存下 ...

  5. C++与Qt开发人机象棋(第二部分)

    C++与Qt开发人机象棋(第二部分) 项目目录 文件名->(包含)类名1->(包含)类名2 ChessBy ChessBy.pro Headers Board.h – – – Source ...

  6. Unity和C#开发 - 中国象棋+源代码工程

    Unity和C#开发 - 中国象棋+高清视频指导+源代码工程 https://item.taobao.com/item.htm?ft=t&id=650971483074

  7. Qt实现中国象棋:(四)棋子绘制的实现

    一.棋子图片的简要介绍 上图就是所要使用到的棋子图片,以"r"开头命名的均为红棋,以"b"开头命名的是黑棋:其中带有红色边框的棋子表示将要被移动的棋子(被选中的 ...

  8. Qt实现中国象棋:(六)棋子移动规则

    一.移动规则的制定 关于中国象棋游戏棋子移动规则有马走日,象走田等说法,下面就将各类棋子的移动规则进行说明及实现(开局时默认红棋在下方,黑棋在上方).棋子移动规则中fromX.fromY为起始点坐标, ...

  9. Cocos2d-X开发中国象棋《九》走棋规则

    在上一节中实现了走棋,这篇博客将介绍中国象棋中的走棋规则 在写博客前先可能一下象棋的走棋规则: 1)将 将的坐标关系:横坐标相等,纵坐标相减绝对值等于1,或者纵坐标相等,横坐标相减绝对值等于1 将的特 ...

最新文章

  1. mybatis的工作原理
  2. java8获取实现某个接口的所有类_Java 试题八
  3. javascript实现面向对象的继承
  4. MongoDB服务无法启动,原因居然是...
  5. 石子合并问题java,石子合并问题 GarsiaWachs算法
  6. oracle配置控制文件快照的位置以及名称为,Oracle 快照控制文件(snapshot control file)...
  7. 2021【第十二届蓝桥杯省赛】 C/C++ B组(第二场)
  8. dj打碟怎么学_学DJ打碟怎么提高学习进度
  9. 北京地区机动车限行交强险保费减免方案
  10. 在项目中后端开发所需要掌握的前端知识
  11. 如何制定SEO文章发布模板?
  12. 谁征服了游戏,谁就征服了智能手机内容
  13. 【工大SCIR笔记】自然语言处理领域的数据增广方法
  14. 支付宝小程序物联网开发
  15. 深圳到武汉四天三夜计划安排
  16. 服务器显卡芯片,Intel服务器独立显卡官方美图:单卡四芯原来如此
  17. QUANT[6] 量化交易常见概念解析
  18. 前端的短信验证码如何做(和后端配合)
  19. java读取docx_java使用poi读取doc和docx文件
  20. “气运”其实是可以改变的,方法也很简单!

热门文章

  1. 全球5G模组厂商型号价格对比
  2. android手机红外代码HAL,Android 红外遥控器适配
  3. Kotlin 之 协程(四)协程并发
  4. Word-embeding 【paper】
  5. [NIPS2017]Attention is all you need
  6. python 2.7.x to exe
  7. 示波器(Oscilloscope)快速入门
  8. 神经网络实现手写数字识别
  9. SQL Round 取整千 整百 整万
  10. DUTOJ-1151: 投硬币