中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制
本项目都使用QT来实现绘图,没有任何第三方的资源。
工程详情:Github
首先将棋盘设计为一个类Board
// Board.h // Board类实现了棋盘的绘制以及显示 // #ifndef BOARD_H #define BOARD_H #include <QWidget> #include "Stone.h" class Board : public QWidget { Q_OBJECT public: explicit Board(QWidget *parent = 0); Stone _s[32]; // 定义32个棋子 int _r; // 棋子的半径 // 返回棋盘行列对应的像素坐标 QPoint center(int row, int col); QPoint center(int id); void drawStone(QPainter &painter, int id); // 绘制棋子 virtual void paintEvent(QPaintEvent *); void DrawBackground(); // 设置背景颜色 signals: public slots: }; #endif // BOARD_H
// Board.cpp #include "Board.h" #include <QPainter> // 绘制棋盘需要 Board::Board(QWidget *parent) : QWidget(parent) { for (int i = 0; i < 32; ++i) { _s[i].init(i); } } // 绘制棋盘 void Board::paintEvent(QPaintEvent *) { DrawBackground(); QPainter painter(this); int d = 40; // d表示棋盘格子的直径,也就是棋子的直径 _r = d / 2; // 绘制10条横线 for (int i = 1; i <= 10; ++i) { painter.drawLine(QPoint(d, i * d), QPoint(9 * d, i * d)); } // 绘制9条竖线 for (int i = 1; i <= 9; ++i) { if (1 == i || 9 == i) { // 中间有楚河汉界,不能全部都画通 painter.drawLine(QPoint(i * d, d), QPoint(i * d, 10 * d)); } else { painter.drawLine(QPoint(i * d, d), QPoint(i * d, 5 * d)); painter.drawLine(QPoint(i * d, 6 * d), QPoint(i * d, 10 * d)); } } // 绘制九宫格 painter.drawLine(QPoint(4 * d, d), QPoint(6 * d, 3 * d)); painter.drawLine(QPoint(4 * d, 3 * d), QPoint(6 * d, d)); painter.drawLine(QPoint(4 * d, 8 * d), QPoint(6 * d, 10 * d)); painter.drawLine(QPoint(4 * d, 10 * d), QPoint(6 * d, 8 * d)); // 绘制32个棋子 for (int i = 0; i < 32; ++i) { drawStone(painter, i); } } // 设置背景颜色 void Board::DrawBackground() { QPalette p = this->palette(); <pre style="margin-top: 0px; margin-bottom: 0px;"> p.setColor(<span style=" color:#800080;">QPalette</span>::<span style=" color:#800080;">Window</span>,<span style=" color:#c0c0c0;"> </span><span style=" color:#800080;">QColor</span>(<span style=" color:#000080;">224</span>,<span style=" color:#c0c0c0;"> </span><span style=" color:#000080;">255</span>,<span style=" color:#c0c0c0;"> </span><span style=" color:#000080;">255</span>));
this->setPalette(p);}QPoint Board::center(int row, int col){ QPoint ret; ret.rx() = (col + 1) * _r * 2; ret.ry() = (row + 1) * _r * 2; return ret;}// 重载center函数,方便调用QPoint Board::center(int id){ return center(_s[id]._row, _s[id]._col);}void
Board::drawStone(QPainter &painter, int id){ QPoint c = center(id); QRect rect = QRect(c.x() - _r, c.y() - _r, _r * 2, _r * 2); painter.setBrush(QBrush(QColor(255, 228, 181))); // 将棋子底色设置为鹿皮色 painter.setPen(Qt::black); // 先将画笔设置成黑色绘制圆形 painter.drawEllipse(center(id),
_r, _r); // 绘制圆形 if (_s[id]._red) { // 将上方的棋子字体颜色设置为红色 painter.setPen(Qt::red); } painter.setFont(QFont("system", _r, 700)); // 设置字体大小和类型 painter.drawText(rect, _s[id].getText(), QTextOption(Qt::AlignCenter));}
然后将其中的棋子也设计为一个类Stone
// Stone.h // 棋子类,存储了棋子的基础信息 #ifndef STONE_H #define STONE_H #include <QString> class Stone { public: Stone(); enum TYPE{JIANG, CHE, PAO, MA, BING, SHI, XIANG}; int _row; // 棋子所处的行 int _col; // 棋子所处的列 int _id; // 棋子的id bool _dead; bool _red; TYPE _type; // 棋子的初始化 void init(int id); // 判断_type返回相应字符串 QString getText(); }; #endif // STONE_H
// Stone.cpp #include "Stone.h" Stone::Stone() { } void Stone::init(int id) { struct { int row, col; Stone::TYPE type; } pos[16] = { {0, 0, Stone::CHE}, {0, 1, Stone::MA}, {0, 2, Stone::XIANG}, {0, 3, Stone::SHI}, {0, 4, Stone::JIANG}, {0, 5, Stone::SHI}, {0, 6, Stone::XIANG}, {0, 7, Stone::MA}, {0, 8, Stone::CHE}, {2, 1, Stone::PAO}, {2, 7, Stone::PAO}, {3, 0, Stone::BING}, {3, 2, Stone::BING}, {3, 4, Stone::BING}, {3, 6, Stone::BING}, {3, 8, Stone::BING}, }; _id = id; _dead = false; _red = id < 16; if (_red) { // 上方的棋子 _row = pos[id].row; _col = pos[id].col; _type = pos[id].type; } else { // 下方的棋子 _row = 9 - pos[id - 16].row; _col = 8 - pos[id - 16].col; _type = pos[id - 16].type; } } QString Stone::getText() { switch (this->_type) { case CHE: return "车"; case MA: return "马"; case PAO: return "炮"; case BING: return "兵"; case JIANG: return "将"; case SHI: return "士"; case XIANG: return "相"; } return "错误"; }
最后实现的棋盘效果为:
中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制的更多相关文章
- 中国象棋游戏Chess(3) - 实现走棋规则
棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...
- 中国象棋游戏Chess(2) - 走棋
之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制 现在实现走棋的功能. 首先需要获取点击到的棋子,用QWidget中的函数 mouseReleaseEvent 实现函数: vo ...
- C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!
中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于用具简单,趣味性强,成为流行极为广泛的棋艺活动. 它是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规 ...
- 基于HTML5实现的中国象棋游戏
棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电 ...
- C#中国象棋+游戏大厅 服务器 + 客户端源码
来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...
- 【原创】使用HTML5+canvas+JavaScript开发的原生中国象棋游戏及源码分享
目前已经实现的功能: V1.0 : 实现棋子的布局,画布及游戏场景的初始化V2.0 : 实现棋子的颜色改变V3.0 :实现所有象棋的走棋规则V4.0 : 实现所有棋子的吃子功能 GItHub源码下载地 ...
- GMchess Linux下的中国象棋游戏
gmchess,一款Linux下的中国象棋程序
- 亲自动手实现Python+pygame中国象棋游戏
功能1:实现游戏整体界面显示 一.创建基本的结构 代码如下: import time import pygame def main(): # 初始化pygame pygame.init() # 创建用 ...
- cocos2dx 3.2 的中国象棋游戏
改编来源:http://cn.cocos2d-x.org/tutorial/lists?id=103 在cocos2dx官网看到了这么个教程,是cocos2dx 2.x版本的,于是用 cocos2dx ...
随机推荐
- 浅析"Sublabel-Accurate Relaxation of Nonconvex Energies" CVPR 2016 Best Paper Honorable Mention
今天作了一个paper reading,感觉论文不错,马克一下~ CVPR 2016 Best Paper Honorable Mention "Sublabel-Accurate Rela ...
- 合成/聚合复用原则(CARP)
组合/聚合复用原则(Composite/Aggregate Reuse Principle或CARP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到 ...
- springMVC+Hibernate4+spring整合实例二(实例代码部分)
UserController.java 代码: package com.edw.controller; import java.io.IOException; import java.io.Print ...
- FFmpeg源代码简单分析:avformat_write_header()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- 2.2、Android Studio通过注解提升代码检测
使用像Lint这样的代码检测工具可以帮助你发现问题和提升代码,但是代码检测在有些地方很难应用.例如,Android的资源ID,使用一个int类型来表示字符.图像.颜色或者其他资源类型所以代码检测工具不 ...
- 2.1、Android Studio通过Lint提升你的代码
为了测试你的Android应用符合功能需求.最重要的是确保你的代码没有结构性问题.结构差的代码影响你的Android应用的可靠性,让你的代码难以维护.比如,如果你的XML资源文件包含未使用的明明空间, ...
- 【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇
我的唠叨 不知不觉,从发表第一篇关于<Unity Shaders and Effects Cookbook>已经快十个月了.一开始的初衷就是学习笔记,毕竟将来回过头去看的时候,再看英文难免 ...
- android分包方案
当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时 ...
- ROS_Kinetic_18 使用V-Rep3.3.1和Matlab2015b(vrep_ros_bridge)续
ROS_Kinetic_18 使用V-Rep3.3.1和Matlab2015b(vrep_ros_bridge)续 上一节配置的v-rep在ros kinetic中是可以看图像,并订阅主题的,但是无法 ...
- UNIX环境高级编程——信号说明列表
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGK ...