介绍
本项目基于 Qt C++ 实现了一个完整的五子棋游戏,支持 人机对战 和 人人对战 模式,并提供了三种难度选择(简单、中等、困难)。界面美观,逻辑清晰,是一个综合性很强的 Qt 小项目
标题项目核心功能
- 棋盘绘制:通过 QPainter 实现网格棋盘和棋子的绘制,使用坐标映射鼠标点击位置到棋盘。
- 落子规则:处理玩家或 AI 的落子,并检查是否获胜。
- 人机对战:根据难度,AI 实现从简单的随机落子到基于评分系统的智能落子。
- 模式切换:支持人人对战和人机对战模式,切换后自动重置棋盘。
- 难度选择:通过下拉框提供“简单”、“中等”、“困难”三种难度。
本项目是一个典型的五子棋游戏,涵盖了 Qt 界面开发、绘图、事件处理以及简单的 AI 逻辑实现。通过界面美化和模式选择功能,为玩家提供了良好的用户体验,非常适合作为 Qt 项目的学习和展示案例。
上代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPainter>
#include <QMouseEvent>
#include <QVector>
#include <QPushButton>
#include <QLabel>
#include <QComboBox>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void paintEvent(QPaintEvent *event) override; // 绘制棋盘和棋子
void mousePressEvent(QMouseEvent *event) override; // 处理鼠标点击落子
private slots:
void onNewGameClicked(); // 新游戏按钮事件
void onSwitchModeClicked(); // 切换模式按钮事件
void onDifficultyChanged(int index); // 选择难度下拉框事件
private:
Ui::MainWindow *ui;
// 界面控件
QLabel *modeLabel; // 显示当前模式
QLabel *statusLabel; // 显示当前轮次
QComboBox *difficultyComboBox; // 难度选择下拉框
QPushButton *newGameButton; // 新游戏按钮
QPushButton *switchModeButton; // 切换模式按钮
// 游戏状态
const int gridSize = 40; // 棋盘格子大小
const int boardSize = 15; // 棋盘行列数
QVector<QVector<int>> board; // 棋盘状态,0为空,1为黑棋,2为白棋
bool isBlackTurn = true; // 当前是否轮到黑棋
bool isPlayerVsAI = false; // 是否是人机对战模式
int difficultyLevel = 1; // 默认难度为简单模式
// 内部方法
void checkWin(int x, int y); // 检查胜负
void resetGame(); // 重置棋盘
void aiMove(); // AI 落子逻辑
int calculateScore(int x, int y, int player); // 计算分数
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <cstdlib> // 用于随机数生成(AI 落子)
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow), board(boardSize, QVector<int>(boardSize, 0)) {
ui->setupUi(this);
// 设置窗口大小
setFixedSize(gridSize * boardSize, gridSize * boardSize + 80);
// 初始化按钮
newGameButton = new QPushButton("新游戏", this);
switchModeButton = new QPushButton("切换模式", this);
// 初始化标签
statusLabel = new QLabel("当前轮到黑棋", this);
modeLabel = new QLabel("当前模式:人人对战", this);
// 初始化难度选择下拉框
difficultyComboBox = new QComboBox(this);
difficultyComboBox->addItem("简单");
difficultyComboBox->addItem("中等");
difficultyComboBox->addItem("困难");
difficultyComboBox->setCurrentIndex(difficultyLevel - 1); // 默认选中“简单”
// 设置控件位置
newGameButton