基于Qt实现五子棋代码
时间: 2024-05-10 21:14:10 浏览: 83
以下是基于Qt实现五子棋的代码:
mainwindow.h
```cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QMouseEvent>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
private:
enum {ROW = 15, COL = 15}; // 棋盘行列数
enum {WIDTH = 40, HEIGHT = 40}; // 棋子大小
QPushButton *startButton; // 开始按钮
QPushButton *backButton; // 悔棋按钮
QPushButton *exitButton; // 退出按钮
QLabel *turnLabel; // 提示当前轮到哪个玩家
QLabel *blackCountLabel; // 黑方棋子数
QLabel *whiteCountLabel; // 白方棋子数
QPoint mousePos; // 鼠标点击位置
int board[ROW][COL] = {0}; // 棋盘,0表示空,1表示黑,2表示白
int turn = 1; // 当前轮到哪个玩家,1表示黑,2表示白
int blackCount = 0; // 黑方棋子数
int whiteCount = 0; // 白方棋子数
bool isGameOver = false; // 是否结束游戏
void initUI(); // 初始化UI
void startGame(); // 开始游戏
void drawBoard(QPainter &painter); // 绘制棋盘
void drawPiece(QPainter &painter, int row, int col); // 绘制棋子
bool checkWin(int row, int col); // 检查是否胜利
void gameOver(); // 游戏结束
void reset(); // 重置游戏
};
#endif // MAINWINDOW_H
```
mainwindow.cpp
```cpp
#include "mainwindow.h"
#include <QPainter>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
initUI();
}
MainWindow::~MainWindow()
{
}
void MainWindow::initUI()
{
setFixedSize(620, 620);
startButton = new QPushButton("开始游戏", this);
startButton->setGeometry(500, 50, 100, 40);
connect(startButton, &QPushButton::clicked, this, &MainWindow::startGame);
backButton = new QPushButton("悔棋", this);
backButton->setGeometry(500, 130, 100, 40);
backButton->setEnabled(false);
connect(backButton, &QPushButton::clicked, [=]() {
if (!isGameOver) { // 游戏未结束才能悔棋
board[mousePos.x()][mousePos.y()] = 0; // 当前位置清空
turn = turn == 1 ? 2 : 1; // 切换玩家
backButton->setEnabled(false); // 禁用悔棋按钮
update(); // 重新绘制
}
});
exitButton = new QPushButton("退出游戏", this);
exitButton->setGeometry(500, 210, 100, 40);
connect(exitButton, &QPushButton::clicked, [=]() {
if (QMessageBox::Yes == QMessageBox::question(this, "提示", "确定要退出吗?")) {
qApp->quit();
}
});
turnLabel = new QLabel("当前轮到黑方下棋", this);
turnLabel->setGeometry(500, 300);
blackCountLabel = new QLabel("黑方棋子数:0", this);
blackCountLabel->setGeometry(500, 350);
whiteCountLabel = new QLabel("白方棋子数:0", this);
whiteCountLabel->setGeometry(500, 400);
}
void MainWindow::startGame()
{
reset(); // 重置游戏
startButton->setEnabled(false); // 开始游戏后禁用开始按钮
}
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
drawBoard(painter); // 绘制棋盘
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (board[i][j] != 0) {
drawPiece(painter, i, j); // 绘制棋子
}
}
}
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) { // 左键点击
int x = event->x();
int y = event->y();
if (x >= 20 && x <= 580 && y >= 20 && y <= 580) { // 在棋盘内点击
int row = (y - 20) / HEIGHT;
int col = (x - 20) / WIDTH;
if (board[row][col] == 0) { // 当前位置没有棋子
board[row][col] = turn; // 下棋
if (checkWin(row, col)) { // 检查是否胜利
gameOver();
} else {
turn = turn == 1 ? 2 : 1; // 切换玩家
backButton->setEnabled(true); // 开启悔棋按钮
}
update(); // 重新绘制
}
}
}
}
void MainWindow::drawBoard(QPainter &painter)
{
painter.setPen(QPen(Qt::black, 2));
for (int i = 0; i < ROW; i++) {
painter.drawLine(20, 20 + i * HEIGHT, 20 + (ROW - 1) * WIDTH, 20 + i * HEIGHT);
painter.drawLine(20 + i * WIDTH, 20, 20 + i * WIDTH, 20 + (COL - 1) * HEIGHT);
}
}
void MainWindow::drawPiece(QPainter &painter, int row, int col)
{
if (board[row][col] == 1) { // 黑方棋子
painter.setBrush(QBrush(Qt::black));
} else if (board[row][col] == 2) { // 白方棋子
painter.setBrush(QBrush(Qt::white));
}
painter.drawEllipse(QPoint(col * WIDTH + 20, row * HEIGHT + 20), WIDTH / 2, HEIGHT / 2);
}
bool MainWindow::checkWin(int row, int col)
{
int i, j, k, count;
// 横向
count = 1;
for (i = col - 1; i >= 0; i--) { // 向左
if (board[row][i] == turn) {
count++;
} else {
break;
}
}
for (i = col + 1; i < COL; i++) { // 向右
if (board[row][i] == turn) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
// 纵向
count = 1;
for (i = row - 1; i >= 0; i--) { // 向上
if (board[i][col] == turn) {
count++;
} else {
break;
}
}
for (i = row + 1; i < ROW; i++) { // 向下
if (board[i][col] == turn) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
// 斜向(左上到右下)
count = 1;
for (i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { // 向左上
if (board[i][j] == turn) {
count++;
} else {
break;
}
}
for (i = row + 1, j = col + 1; i < ROW && j < COL; i++, j++) { // 向右下
if (board[i][j] == turn) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
// 斜向(左下到右上)
count = 1;
for (i = row + 1, j = col - 1; i < ROW && j >= 0; i++, j--) { // 向左下
if (board[i][j] == turn) {
count++;
} else {
break;
}
}
for (i = row - 1, j = col + 1; i >= 0 && j < COL; i--, j++) { // 向右上
if (board[i][j] == turn) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
return false;
}
void MainWindow::gameOver()
{
isGameOver = true;
backButton->setEnabled(false); // 禁用悔棋按钮
QString message = turn == 1 ? "黑方胜利!" : "白方胜利!";
QMessageBox::information(this, "游戏结束", message);
startButton->setEnabled(true); // 开启开始按钮
}
void MainWindow::reset()
{
memset(board, 0, sizeof(board)); // 清空棋盘
turn = 1; // 黑方先手
blackCount = 0;
whiteCount = 0;
isGameOver = false;
backButton->setEnabled(false); // 禁用悔棋按钮
update(); // 重新绘制
}
```
在.pro文件中添加:
```pro
QT += widgets
```
编译运行即可看到五子棋界面。
阅读全文