使用QT简单制作中国象棋之棋盘
最近在网上看了一些QT的教学视频,就想着将学习的知识运用一下,学到绘图后就想着制作一个简易的中国象棋。目前只做出了棋盘,大概有点样子了。
本例使用的QWidget作为父类创建的加了UI的项目,但目前UI没怎么用,就图方便设置了一下Widget的Size。
Widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
protected:// 绘图事件void paintEvent(QPaintEvent *) override;// 鼠标按下,移动事件void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent*)override;
private:Ui::Widget *ui;QPoint point;// 棋子大小 即 格子大小int ChessSize;
};
#endif // WIDGET_H
Widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMouseEvent>
#include <QPen>
#include <QFont>
#include <QBrush>
#include <QColor>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置 棋子大小, 即格子大小this->ChessSize = 50;}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *){QPen pen;pen.setWidth(3);pen.setColor(Qt::black);QPainter p(this);p.setPen(pen);QBrush brush;brush.setColor(QColor(216, 180, 80));brush.setStyle(Qt::SolidPattern);p.setBrush(brush);// p.drawPixmap(rect(),QPixmap(":/ChessImage/back1.jpg"));// 取窗口的左上角坐标(left, top) 和 宽高(right, bottom)int top = rect().top();int bottom = rect().bottom();int left = rect().left();int right = rect().right();// 通过画刷绘制背景, 并取消画刷(防止后面绘制其他图形继续被刷,当然本项目做的简易中国象棋用于练手,应该不会使用了)p.drawRect(left, top, right, bottom);p.setBrush(Qt::NoBrush);// 绘制棋盘的边框p.drawLine(left + ChessSize - 5, top + ChessSize - 5, left + ChessSize - 5, bottom - ChessSize + 5);p.drawLine(left + ChessSize - 5, top + ChessSize - 5, right - ChessSize + 5, top + ChessSize - 5);p.drawLine(right - ChessSize + 5, top + ChessSize - 5, right - ChessSize + 5, bottom - ChessSize + 5);p.drawLine(left + ChessSize - 5, bottom - ChessSize + 5, right - ChessSize + 5, bottom - ChessSize + 5);pen.setWidth(2);p.setPen(pen);// 绘制棋盘中的细线for(int x = left + ChessSize; x < right; x += ChessSize){for(int y = top + ChessSize; y < bottom; y += ChessSize){if(x == left + ChessSize){p.drawLine(x, y, right - ChessSize, y);}if(y == top + ChessSize){p.drawLine(x, y, x, (bottom - ChessSize) / 2);p.drawLine(x, (bottom + ChessSize) / 2, x, bottom - ChessSize);}}}p.drawLine((right/2 - ChessSize), top + ChessSize, (right/2 + ChessSize), top + 3*ChessSize);p.drawLine((right/2 + ChessSize), top + ChessSize, (right/2 - ChessSize), top + 3*ChessSize);p.drawLine((right/2 - ChessSize), bottom - ChessSize, (right/2 + ChessSize), bottom - 3*ChessSize);p.drawLine((right/2 + ChessSize), bottom - ChessSize, (right/2 - ChessSize), bottom - 3*ChessSize);// 设置分界河标志p.setFont(QFont("Arial", 25));p.drawText(QPoint(right/2-100, bottom/2+15), "楚河 汉界");// 设置炮兵和步兵站位的 '#' 字pen.setWidth(4);p.setPen(pen);int x, y;QPoint point[3];for(int j = 0; j < 2; j++ )for(int i = 1; i <= 9; i++){if(i == 4 || i == 6)continue;x = left + i*ChessSize; // x坐标不会因为上下半区而改变if(j == 0){ // 处理上半区if(i % 2 == 0) // 处理上半区炮兵的 '#'字y = top + 3*ChessSize;else // 处理上半区步兵的'#'字y = top + 4*ChessSize;}else{ // 处理下半区if(i % 2 == 0) // 处理下半区炮兵的 '#'字y = bottom - 3*ChessSize;else // 处理下半区步兵的 '#'字y = bottom - 4*ChessSize;}// 单独处理两边兵的 '#'字(因为只有一半)// drawPokyline第一个参数为数组首地址,第二个参数为数组长度,稍微熟悉点C++就懂了// 它的功能是将数组的点依次连接但不填充,如颜色等。(第一次使用,参考的网上)if(i == 1){point[0] = QPoint(x+5, y-15);point[1] = QPoint(x+5, y-5);point[2] = QPoint(x+15, y-5);p.drawPolyline(point,3);point[0] = QPoint(x+5, y+15);point[1] = QPoint(x+5, y+5);point[2] = QPoint(x+15, y+5);p.drawPolyline(point,3);continue;}if(i == 9){point[0] = QPoint(x-5, y-15);point[1] = QPoint(x-5, y-5);point[2] = QPoint(x-15, y-5);p.drawPolyline(point,3);point[0] = QPoint(x-5, y+15);point[1] = QPoint(x-5, y+5);point[2] = QPoint(x-15, y+5);p.drawPolyline(point,3);continue;}// 其他部分正常(炮兵和中间步兵的 '#'字)point[0] = QPoint(x+5, y-15);point[1] = QPoint(x+5, y-5);point[2] = QPoint(x+15, y-5);p.drawPolyline(point,3);point[0] = QPoint(x+5, y+15);point[1] = QPoint(x+5, y+5);point[2] = QPoint(x+15, y+5);p.drawPolyline(point,3);point[0] = QPoint(x-5, y-15);point[1] = QPoint(x-5, y-5);point[2] = QPoint(x-15, y-5);p.drawPolyline(point,3);point[0] = QPoint(x-5, y+15);point[1] = QPoint(x-5, y+5);point[2] = QPoint(x-15, y+5);p.drawPolyline(point,3);}
}
// 鼠标事件用于后面深入制作棋子的移动等.
void Widget::mousePressEvent(QMouseEvent *e){}void Widget::mouseMoveEvent(QMouseEvent *e){}
效果图如下:
使用QT简单制作中国象棋之棋盘相关推荐
- 使用QT简单制作中国象棋之棋子的摆放
1 引子 要制作象棋,棋子是必不可少的,但是在网上找了很久,没有找到满意且配套的棋子,有的还需要VIP下载就很难受.于是自己通过QT的标签写字功能调整大小,然后使用绘图事件(QPaintEvent ...
- Qt终极教程——用Qt编程实现中国象棋游戏(提供源代码和程序编译运行教程)
Qt终极教程--用Qt编程实现中国象棋游戏 目录 Qt终极教程--用Qt编程实现中国象棋游戏 简介 运行可执行程序体验象棋游戏 Qt 安装 源代码的编译.运行与调试 生成预编译的可执行程序 简介 本文 ...
- QT小游戏——中国象棋
QT小游戏--中国象棋 前言 项目整体结构 棋子类 棋盘类 几个重要方法 1.坐标转化 2.移动规则 3.悔棋和撤销 项目文件 前言 最近用qt做了个中国象棋的小游戏. 目前只能左右互博,支持悔棋.效 ...
- java简单实现中国象棋
java简单实现中国象棋 可以实现简单的人机对战功能,棋子移动会插入关键帧,可以悔棋等功能 运行效果 import java.awt.Canvas; import java.awt.Color; im ...
- Qt实现中国象棋:(三)棋盘绘制的详细分析及实现
一.图片及棋盘分析 1:在上文中已经对单张图片的显示进行了测试,从中可以知道一张图片需要一个QPixmap对象对其进行加载.棋盘图片共有23张,也就需要23个QPixmap的对象.同时要求对象名与图片 ...
- 【C++课程设计】期末大作业 - 基于Qt开发的中国象棋软件
1 题目 基于Qt的中国象棋软件开发 本博客只是简略的描述论文的大致结构.框架,以及软件开发的大致过程.有兴趣的参考原文档资料. 2总体设计与主要功能 2.1概述 中国象棋是起源于中国的一种棋,属于二 ...
- 程序员大佬教你如何用python制作中国象棋!一看就会
中国象棋想必大家都玩过,突发奇想,想着怎么用python把中国国粹的中国象棋做出来呢?????? 首先老样子看看用python做出来的效果: 国粹--中国象棋 第一步:导入资源包 第二步:初始化 第三 ...
- 手把手教学!利用C++制作中国象棋,界面MFC内含详细源码!
VC++中国象棋源码附毕业设计文档资料,源程序编译于VC++6.0或者VS2003版本,二者任选其一都可以,项目文件完整. 总项目展示: 制作过程截图: 代码展示: 效果展示: 这是我要和大家分享的基 ...
- qt pcl设置镜头初始位置_Qt中国象棋二——棋盘与棋子的绘制
上次和大家分享了Qt的2D绘图基础知识,这样可以更好地理解象棋中一些关于绘图的程序.这次要和大家分享的则是棋盘与棋子的绘制,也可以说是Qt 2D绘图的一些具体应用. 源程序是我在网上找的,而且是下载了 ...
最新文章
- 5GtoB即将迎来规模商用,如何共创行业新价值?
- 把Ubuntu 9.04版本的Samba 服务器加入到Active Directory中
- MySQL Proxy 读写分离(实战总结)
- WPF资源的基本概念
- 0408互联网新闻 | 区块链医疗解决方案落地应用,阿里云、支付宝共同研发;安卓全球开发者峰会将于10月23-24日在加州召开...
- Go gin使用html模板
- 【Python数据结构】 抽象数据类型 Python类机制和异常
- 干翻Java_Java第三次作业第一题
- 不懂电容原理?那是你没看到这些动图
- 再记一次 应用服务器 CPU 暴高事故分析
- python实例 81,82
- c语言字符串去除第一个和最后一个_387. 字符串中的第一个唯一字符
- 【VS开发】ConvertBSTRToString(filename) 不能将string转换为BSTR
- 在阿里巴巴如何管理代码分支?
- 抓包工具神器,fiddler全解
- C语言运算符优先级列表(超详细)
- 2014.10.10 ——Jim Foley第二场讲座User Interface Design——An Overview
- Aurora 论坛图片下载
- linux中lv的详细创建流程【化分区-pv-vg-lv创建整套流程】,centos中lv脚本创建vg-pv-lv,-bash: lvs: command not found处理方法
- WIZnet——W5100S震撼来袭!
热门文章
- 企业微信员工离职成员客户,客户群分配接口
- 安誉生物宣布完成数亿元融资,公司背景和达安基因、安杰思均有关
- 车联网布局,阿里领先了百度腾讯多少?
- sikuli java_Sikuli--基于像素的图像识别(JAVA)
- 2022年A特种设备相关管理(电梯)考题模拟考试平台操作
- 免费报表工具知多少?
- 用Android Studio 编写简易计算器
- 康耐视智能相机Insight的FTP存图详细讲解
- 2021,烦死了,烦死了,烦死了!
- Python报错:ProgrammingError: LOB variable no longer valid after subsequent fetch