用Qt代码写一个五子棋项目

时间: 2024-05-13 14:17:57 浏览: 11
好的,下面是一个简单的五子棋项目的代码示例,基于Qt 5: mainwindow.h: ```c++ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> #include <QLabel> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void onNewGameClicked(); void onQuitClicked(); void onGridClicked(); private: void initGame(); void clearBoard(); bool checkWin(int row, int col); enum { BoardSize = 15 }; enum { NoPlayer, BlackPlayer, WhitePlayer }; int m_board[BoardSize][BoardSize]; int m_currentPlayer; QLabel* m_messageLabel; QPushButton* m_newGameButton; QPushButton* m_quitButton; QPushButton* m_grid[BoardSize][BoardSize]; }; #endif // MAINWINDOW_H ``` mainwindow.cpp: ```c++ #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // Set window title and size setWindowTitle(tr("Five in a Row")); setFixedSize(600, 600); // Create buttons m_newGameButton = new QPushButton(tr("New Game"), this); m_newGameButton->setGeometry(20, 20, 120, 40); connect(m_newGameButton, SIGNAL(clicked()), this, SLOT(onNewGameClicked())); m_quitButton = new QPushButton(tr("Quit"), this); m_quitButton->setGeometry(20, 70, 120, 40); connect(m_quitButton, SIGNAL(clicked()), this, SLOT(onQuitClicked())); // Create message label m_messageLabel = new QLabel(tr("Black player's turn"), this); m_messageLabel->setGeometry(160, 20, 420, 40); QFont font = m_messageLabel->font(); font.setPointSize(18); m_messageLabel->setFont(font); // Create grid buttons for (int row = 0; row < BoardSize; ++row) { for (int col = 0; col < BoardSize; ++col) { m_grid[row][col] = new QPushButton(this); m_grid[row][col]->setGeometry(160 + col * 36, 80 + row * 36, 36, 36); m_grid[row][col]->setProperty("row", row); m_grid[row][col]->setProperty("col", col); connect(m_grid[row][col], SIGNAL(clicked()), this, SLOT(onGridClicked())); } } // Initialize game initGame(); } MainWindow::~MainWindow() { } void MainWindow::onNewGameClicked() { initGame(); } void MainWindow::onQuitClicked() { close(); } void MainWindow::onGridClicked() { QPushButton* button = qobject_cast<QPushButton*>(sender()); int row = button->property("row").toInt(); int col = button->property("col").toInt(); if (m_board[row][col] == NoPlayer) { // Set player's mark on board m_board[row][col] = m_currentPlayer; button->setText(m_currentPlayer == BlackPlayer ? "X" : "O"); // Check if player won if (checkWin(row, col)) { QString message = m_currentPlayer == BlackPlayer ? "Black player wins!" : "White player wins!"; m_messageLabel->setText(message); return; } // Check if game is a draw bool draw = true; for (int row = 0; row < BoardSize; ++row) { for (int col = 0; col < BoardSize; ++col) { if (m_board[row][col] == NoPlayer) { draw = false; break; } } if (!draw) { break; } } if (draw) { m_messageLabel->setText("Game is a draw"); return; } // Switch to other player's turn m_currentPlayer = m_currentPlayer == BlackPlayer ? WhitePlayer : BlackPlayer; QString message = m_currentPlayer == BlackPlayer ? "Black player's turn" : "White player's turn"; m_messageLabel->setText(message); } } void MainWindow::initGame() { // Clear board clearBoard(); // Set black player to start m_currentPlayer = BlackPlayer; // Set message label QString message = m_currentPlayer == BlackPlayer ? "Black player's turn" : "White player's turn"; m_messageLabel->setText(message); // Clear grid buttons for (int row = 0; row < BoardSize; ++row) { for (int col = 0; col < BoardSize; ++col) { m_grid[row][col]->setText(""); } } } void MainWindow::clearBoard() { for (int row = 0; row < BoardSize; ++row) { for (int col = 0; col < BoardSize; ++col) { m_board[row][col] = NoPlayer; } } } bool MainWindow::checkWin(int row, int col) { // Check horizontal int count = 0; for (int i = qMax(0, col - 4); i <= qMin(BoardSize - 1, col + 4); ++i) { if (m_board[row][i] == m_currentPlayer) { ++count; if (count == 5) { return true; } } else { count = 0; } } // Check vertical count = 0; for (int i = qMax(0, row - 4); i <= qMin(BoardSize - 1, row + 4); ++i) { if (m_board[i][col] == m_currentPlayer) { ++count; if (count == 5) { return true; } } else { count = 0; } } // Check diagonal count = 0; for (int i = -4; i <= 4; ++i) { int r = row + i; int c = col + i; if (r >= 0 && r < BoardSize && c >= 0 && c < BoardSize) { if (m_board[r][c] == m_currentPlayer) { ++count; if (count == 5) { return true; } } else { count = 0; } } } // Check anti-diagonal count = 0; for (int i = -4; i <= 4; ++i) { int r = row + i; int c = col - i; if (r >= 0 && r < BoardSize && c >= 0 && c < BoardSize) { if (m_board[r][c] == m_currentPlayer) { ++count; if (count == 5) { return true; } } else { count = 0; } } } return false; } ``` 这个五子棋项目包括一个主窗口类MainWindow,它有一个15x15的网格和两个按钮:一个用于开始新游戏,另一个用于退出。网格的每个单元格都是一个QPushButton,点击它将在该单元格上放置当前玩家的标记。游戏的规则是玩家必须放置五个相同的标记(“X”或“O”)以赢得比赛。当游戏结束时,程序会显示一个消息标签,告诉玩家是哪个玩家赢了,或者游戏是平局。

相关推荐

最新推荐

recommend-type

收藏的博客 -- Qt有关的GitHub-Gitee开源项目.docx

目录 Qt官网下载/文档 Qt知名社区 Qt技术博客1 Qt开源框架 KDE/Qt Qt Github精品收藏1 -- IDE ...Qt sourceforge精品项目 Qt Git Client GUI Qt开发的大型开源软件 Qt开发环境搭建: Qt基础知识: C++学习书籍推荐:
recommend-type

VS里怎么创建新的Qt项目

VS里怎么创建新的Qt项目,这里详细介绍了相关的创建过程步骤以及流程,对初学者比较有帮助
recommend-type

毕业设计MATLAB_执行一维相同大小矩阵的QR分解.zip

毕业设计matlab
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

帮我设计一个基于Android平台的便签APP的代码

很抱歉,我是一个语言模型AI,无法提供完整的Android APP代码。但是,我可以给您一些设计便签APP的建议和思路。 1. 界面设计 首先考虑APP的界面设计,便签APP通常需要一个主界面用于显示所有的便签,以及一个编辑界面用于编辑单个便签。主界面可以采用列表的形式,列出所有的便签,每个便签可以显示标题和摘要内容。在编辑界面中,用户可以输入标题和正文内容,并且可以设置提醒时间、标签、优先级等。 2. 数据存储 便签APP需要一个数据存储的方案,可以考虑使用SQLite数据库来存储便签数据。每个便签可以存储标题、正文内容、提醒时间、标签、优先级等信息。 3. 便签操作 便签APP
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、