C++基于qt 的五子棋复盘的代码
时间: 2023-07-15 14:10:34 浏览: 119
以下是基于Qt的五子棋复盘的代码示例:
```cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QMouseEvent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化棋盘
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
board[i][j] = 0;
}
}
// 读取并解析棋谱文件
QFile file("chess.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine(); // 读取一行
QStringList list = line.split(","); // 逗号分隔
if (list.size() == 3) {
int x = list[0].toInt();
int y = list[1].toInt();
int player = list[2].toInt();
board[x][y] = player;
}
}
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
// 绘制棋盘
painter.setBrush(QBrush(Qt::yellow));
painter.drawRect(LEFT, TOP, COLS * GRID_SIZE, ROWS * GRID_SIZE);
for (int i = 0; i < ROWS; ++i) {
painter.drawLine(LEFT, TOP + i * GRID_SIZE, LEFT + COLS * GRID_SIZE, TOP + i * GRID_SIZE);
}
for (int j = 0; j < COLS; ++j) {
painter.drawLine(LEFT + j * GRID_SIZE, TOP, LEFT + j * GRID_SIZE, TOP + ROWS * GRID_SIZE);
}
// 绘制棋子
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
if (board[i][j] == BLACK) {
painter.setBrush(QBrush(Qt::black));
painter.drawEllipse(getCenter(i, j), RADIUS, RADIUS);
}
else if (board[i][j] == WHITE) {
painter.setBrush(QBrush(Qt::white));
painter.drawEllipse(getCenter(i, j), RADIUS, RADIUS);
}
}
}
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
int x = event->y();
int y = event->x();
if (x >= TOP && x <= TOP + ROWS * GRID_SIZE &&
y >= LEFT && y <= LEFT + COLS * GRID_SIZE) {
int row = (x - TOP) / GRID_SIZE;
int col = (y - LEFT) / GRID_SIZE;
qDebug() << "row:" << row << " col:" << col;
}
}
}
QPoint MainWindow::getCenter(int row, int col)
{
return QPoint(LEFT + col * GRID_SIZE, TOP + row * GRID_SIZE);
}
```
其中,`ROWS`和`COLS`分别表示棋盘的行数和列数,`LEFT`和`TOP`表示棋盘的左上角坐标,`GRID_SIZE`表示每个格子的大小,`BLACK`和`WHITE`分别表示黑棋和白棋,`RADIUS`表示棋子的半径。`board`是一个二维数组,用于存储棋盘上每个位置的棋子类型,0表示空,1表示黑棋,2表示白棋。
在`MainWindow`的构造函数中,我们读取并解析棋谱文件。棋谱文件的格式为每行三个数,分别表示棋子的行、列、类型(1表示黑棋,2表示白棋)。
在`paintEvent`函数中,我们首先绘制棋盘,然后根据`board`数组中的棋子类型来绘制棋子。
在`mousePressEvent`函数中,我们判断鼠标点击的位置是否在棋盘范围内,如果是,就计算出对应的行列数,并输出到控制台。
最后,`getCenter`函数用于根据行列数计算出棋子的中心坐标。
阅读全文