中国象棋游戏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 ...
随机推荐
- Swift:消除Null值
由于在现代编程语言中这个无所不在的概念,许多程序猿可能倾向于相信null值是一个必须存在的瑕疵,创建一个没有它的编程语言是不可能的.他们可能会惊奇那些许多没有null值活的也很好的语言,这带来的结果就 ...
- cassandra eclipse 环境构建
摘要 本文主要介绍如何在eclipse中搭建cassandra环境 更多cassandra,nosql 相关知识请访问http://www.webpersonaldeveloper.cn 正文 1.f ...
- “出错了”和报告Bug的艺术
"出错了." 没有那句话能像"出错了"一样让程序员/开发者如此沮丧,心里翻江倒海,怒火一点即燃,还要死掉一大片脑细胞. 这句生硬的开场白通常标志着让开发者恐惧的 ...
- 开发人员需要熟知的常用Linux命令Version、Kernel查看
当我们需要在Linux系统中安装一些软件而去下载安装文件时,一般都需要确认到底下载哪个版本的安装包,这就需要我们知道自己的Linux系统到底是什么版本.什么内核,常见的版本.内核查看命令或者文件有如下 ...
- UNIX网络编程——原始套接字SOCK_RAW
实际上,我们常用的网络编程都是在应用层的报文的收发操作,也就是大多数程序员接触到的流式套接字(SOCK_STREAM)和数据包式套接字(SOCK_DGRAM).而这些数据包都是由系统提供的协议栈实现, ...
- 错误 frm-40654 记录已经被另一个用户更新,重新查询以查看修改
导致这问题的原因有多个,有些是最近在项目上发现不同于网上其他人遇到的 网上一般来说大家都说有如下几个原因.但是在项目上做返利时 对AP invoice 的有做更改,导致更改或插入的数据在界面上修 ...
- Linux_Oracle命令大全
一,启动 1.#su - oracle 切换到oracle用户且切换到它的环境 2.$lsnrctl status 查看监听及数据库状态 3.$ls ...
- HTML中锚点的使用
说到锚点,我们也许会需要稍微的思考一下,什么是锚点? 官方的答案是这样的: 那么你可能就会有下面的疑问,锚点能做什么啊? 回答就是,锚点可以理解为一个标记,一个用于而且便于寻找的标记.常用于网页制作的 ...
- java加载外部文件数据到代码中:外部数据文件放到jar包中,调用方法getResourceAsStream
任务要将数据文件geo.txt加载进行.因为是别人写的总体项目,不能乱动位置.只能将geo.txt打包到jar中某目录.比如,放到.class文件下怎么加载:http://riddickbryant. ...
- iOS开发之六:常用控件--UIImageView的使用
UIImageView是我们做iOS开发用的非常多的一个控件,IOS中的各种图片,包括头像,有的背景图片等基本都要用到这个控件. 1.常用的属性以及方法 <span style="fo ...