基于qt:五子棋游戏

这个博客介绍了如何使用Qt框架来开发一个五子棋游戏。在`paintEvent`函数中,分别调用了`DrawChessboard`、`DrawItems`和`DrawItemWithMouse`方法来绘制棋盘、棋子和鼠标位置。当一方达到五子连珠时,游戏结束并清空棋盘。`DrawItems`方法遍历所有棋子并根据颜色设置画刷,然后调用`DrawChessAtPoint`绘制棋子。
摘要由CSDN通过智能技术生成

实例:

 部分代码:

 

​
void MainWindow::paintEvent(QPaintEvent *e)
{
	DrawChessboard();		//画棋盘
	DrawItems();			//画棋子
	DrawItemWithMouse();	//画鼠标

	update();
}

​
private:
	void DrawChessboard();
	void DrawItems();
	void DrawItemWithMouse();

	void DrawChessAtPoint(QPainter& painter,QPoint& pt);
	int CountNearItem(Item item,QPoint ptDirection);
void MainWindow::DrawItems()
{
	QPainter painter(this);
	painter.setPen(QPen(QColor(Qt::transparent)));

	for (int i = 0; i<mItems.size(); i++)
	{
		Item item = mItems[i];
		if (item.mBlack)
		{
			painter.setBrush(Qt::black);
		}
		else
		{
			painter.setBrush(Qt::white);
		}
		DrawChessAtPoint(painter,item.mPt);
	}
}

介绍:

如果白棋或者黑棋一方率先到达五颗,则赢得比赛,棋盘清空。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于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 ``` 编译运行即可看到五子棋界面。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值