什么是棋盘覆盖问题?请看 —> 百度百科 - 棋盘覆盖问题
那么,UI方面需要做的工作有:
1,绘制一个 2^k * 2^k 大小的棋盘。
2,要能接收用户所选取的一个方格,将其作为特殊方格。
3,利用调用算法后所返回的一个二维数组(算法方面请看棋盘覆盖问题 - 分治法(c++)),并使用不同的颜色绘制L型骨牌于棋盘上。
/
//(系统:win10)/
//(编译器:vs2015)/
//(QT版本:5.7.0)//
//
现在开始看代码吧!
(一)从QDialog派生出一个类作为显示棋盘的窗口:
show_board.hpp
#ifndef _SHOW_BOARD_
#define _SHOW_BOARD_
#include <QDialog>
#include <QPushButton>
#include <QPixmap>
#include <vector>
class show_board : public QDialog
{
Q_OBJECT
public:
show_board() = delete;
show_board(unsigned k, QDialog* parent = Q_NULLPTR);
~show_board();
protected:
void paintEvent(QPaintEvent* event) override; // 棋盘的绘制
void mousePressEvent(QMouseEvent* event) override; // 读取特殊点的输入
private:
void distributeColor(); // 随机分配颜色
void drawBoard(const std::vector<std::vector<int>>& result); // 绘制L型骨牌
QPixmap bg; // 棋盘
int gridSize; // 每个方格的边长 (单位像素)
int gridNum; // 每列/每行 方格的个数(2^k)
int spcC; // 特殊点列位置 (0 - 2^k)
int spcR; // 特殊点行位置 (0 - 2^k)
std::vector<QColor> numTcolor; // 存储颜色,QColor是QT的一个类,储存颜色的RGB
QPushButton startButton; // 绘制按钮
bool isCLICK; // 记录按钮是否被按下
};