当前位置: 首页 > news >正文

VS+QT五子棋游戏开发

1、首先安装好VS软件和QT库,将其配置好,具体不在此展开说明。

2、文件结构如下图:

3、绘制棋盘代码,如下:

void Qwzq::paintEvent(QPaintEvent* event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);//防锯齿QBrush brush;brush.setStyle(Qt::SolidPattern);for (int i = 0; i < kGridCount+1; i++){painter.drawLine(kBoardMargin,kBoardMargin+i*kBlockSize,size().width()-kBoardMargin,kBoardMargin+i*kBlockSize);painter.drawLine(kBoardMargin+i*kBlockSize, kBoardMargin,kBoardMargin+i*kBlockSize,size().height()-kBoardMargin);}for (int i = 0; i < kGridCount; i++){for (int j = 0; j < kGridCount; j++){if (game->gameMap[i][j] == 1){brush.setColor(Qt::white);painter.setBrush(brush);painter.drawEllipse(kBoardMargin+kBlockSize*j-kRadius,kBoardMargin+kBlockSize*i-kRadius,kRadius*2,kRadius*2);}else if (game->gameMap[i][j]==-1){brush.setColor(Qt::black);painter.setBrush(brush);painter.drawEllipse(kBoardMargin + kBlockSize * j - kRadius, kBoardMargin + kBlockSize * i - kRadius, kRadius * 2, kRadius * 2);}}}QString str;if (game->isWin(clickPosRow, clickPosCol)){str = "Win!";QMessageBox::StandardButton btnValue = QMessageBox::information(this, tr("result"), str);close();}if (game->isDead()){str = "Over!";QMessageBox::StandardButton btnValue = QMessageBox::information(this, tr("result"), str);close();}
}

 4、绘制旗子代码,如下:

void Qwzq::mousePressEvent(QMouseEvent* event)
{int x = event->x();int y = event->y();int kr = kBoardMargin + kBlockSize * kGridCount;int kd = kBoardMargin + kBlockSize*kGridCount;if (x>=kBoardMargin&&x<=kr&&y>=kBoardMargin&&y<=kd){int x1 = (x - kBoardMargin) / kBlockSize;int y1 = (y - kBoardMargin) / kBlockSize;x1 = x - (kBoardMargin + kBlockSize * x1);y1 = y - (kBoardMargin + kBlockSize * y1);if (x1 > kBlockSize / 2)x = (x-kBoardMargin) / kBlockSize + 1;elsex = (x - kBoardMargin) / kBlockSize;if (y1 > kBlockSize / 2)y = (y-kBoardMargin) / kBlockSize + 1;elsey = (y - kBoardMargin) / kBlockSize;game->updateMap(y, x);clickPosRow = y;clickPosCol = x;}update();
}

5、gameModel.cpp代码如下:

#include"GameModel.h"
#include<utility>
#include<qDebug>void GameModel::startGame()
{gameMap.clear();for (int i = 0; i < kBoardSize; i++){std::vector<int> lineBoard;for (int j = 0; j < kBoardSize; j++){lineBoard.push_back(0);}gameMap.push_back(lineBoard);}playerFlag = true;
}void GameModel::updateMap(int row, int col)
{if (playerFlag)gameMap[row][col] = 1;elsegameMap[row][col] = -1;playerFlag = !playerFlag;
}void GameModel::actionByPerson(int row, int col)
{updateMap(row,col);
}bool GameModel::isWin(int row, int col)
{//水平方向检查for (int i = 0; i <= kBoardSize - 5; i++){if (gameMap[row][i] == 1||gameMap[row][i]==-1){if (gameMap[row][i] == gameMap[row][i + 1]){if (gameMap[row][i + 1] == gameMap[row][i + 2]){if (gameMap[row][i + 2] == gameMap[row][i + 3]){if (gameMap[row][i + 3] == gameMap[row][i + 4]){return true;}}}}}}//竖直方向检查for (int i = 0; i <= kBoardSize - 5; i++){if (gameMap[i][col] == 1 || gameMap[i][col] == -1){if (gameMap[i][col] == gameMap[i+1][col]){if (gameMap[i+1][col] == gameMap[i+2][col]){if (gameMap[i+2][col] == gameMap[i+3][col]){if (gameMap[i+3][col] == gameMap[i+4][col]){return true;}}}}}}//135度方向检查int krow = kBoardSize -1- row;if (krow <= col){int i_135 = row + krow;int j_135 = col - krow;for (j_135; j_135 <= kBoardSize - 5; j_135++){if (gameMap[i_135][j_135] == 1){if (gameMap[i_135][j_135] == gameMap[i_135 - 1][j_135 + 1]){if (gameMap[i_135 - 1][j_135 + 1] == gameMap[i_135 - 2][j_135 + 2]){if (gameMap[i_135 - 2][j_135 + 2] == gameMap[i_135 - 3][j_135 + 3]){if (gameMap[i_135 - 3][j_135 + 3] == gameMap[i_135 - 4][j_135 + 4]){return true;}}}}}i_135--;}}if (krow > col){int i_135 = row + col;int j_135 = col - col;for (i_135; i_135 >= 4; i_135--){if (gameMap[i_135][j_135] == 1){if (gameMap[i_135][j_135] == gameMap[i_135 - 1][j_135 + 1]){if (gameMap[i_135 - 1][j_135 + 1] == gameMap[i_135 - 2][j_135 + 2]){if (gameMap[i_135 - 2][j_135 + 2] == gameMap[i_135 - 3][j_135 + 3]){if (gameMap[i_135 - 3][j_135 + 3] == gameMap[i_135 - 4][j_135 + 4]){return true;}}}}}j_135++;}}//45度方向检查if (row >= col){int i_45 = row - col;int j_45 = col - col;for (i_45; i_45 < kBoardSize; i_45++){if (gameMap[i_45][j_45] == 1){if (gameMap[i_45][j_45] == gameMap[i_45 + 1][j_45 + 1]){if (gameMap[i_45 + 1][j_45 + 1] == gameMap[i_45 + 2][j_45 + 2]){if (gameMap[i_45 + 2][j_45 + 2] == gameMap[i_45 + 3][j_45 + 3]){if (gameMap[i_45 + 3][j_45 + 3] == gameMap[i_45 + 4][j_45 + 4]){return true;}}}}}j_45++;}}if (row < col){int i_45 = row - row;int j_45 = col - row;for (j_45; j_45 < kBoardSize; j_45++){if (gameMap[i_45][j_45] == 1){if (gameMap[i_45][j_45] == gameMap[i_45 + 1][j_45 + 1]){if (gameMap[i_45 + 1][j_45 + 1] == gameMap[i_45 + 2][j_45 + 2]){if (gameMap[i_45 + 2][j_45 + 2] == gameMap[i_45 + 3][j_45 + 3]){if (gameMap[i_45 + 3][j_45 + 3] == gameMap[i_45 + 4][j_45 + 4]){return true;}}}}}i_45++;}}return false;
}bool GameModel::isDead()//死局,即棋盘被下满了
{for(int i=0;i<kBoardSize;i++)for (int j = 0; j < kBoardSize; j++){if (gameMap[i][j] == 0)return false;}return true;
}

6、gameModel.h代码如下:

#ifndef GAMEMODEL_H
#define GAMEMODEL_H#include<QObject>
#include<vector>enum GameStatus
{playing,win,dead
};const int kBoardSize = 15;class GameModel
{
public:public:std::vector<std::vector<int>>gameMap;bool playerFlag;GameStatus gameStatus;void startGame();void actionByPerson(int row, int col);void updateMap(int row, int col);bool isWin(int row, int col);bool isDead();};
#endif // !GAMEMODEL_H

7、Qwzq.cpp代码如下:

#include "Qwzq.h"
#include <QMouseEvent>
#include <QMenuBar>
#include <QPainter>
#include <QDebug>
#include<QMessageBox>const int kBoardMargin = 30;
const int kRadius = 15;
const int kBlockSize = 40;
const int kGridCount = 15;Qwzq::Qwzq(QWidget *parent): QMainWindow(parent)
{//ui.setupUi(this);setFixedSize(kBoardMargin * 2 + kGridCount * kBlockSize, kBoardMargin * 2 + kGridCount * kBlockSize);setMouseTracking(true);QMenu* gameMenu = menuBar()->addMenu(tr("Game Model:"));QAction* actionPVP = new QAction("PVP", this);menuBar()->addAction(actionPVP);connect(actionPVP, SIGNAL(triggered()), this, SLOT(initPVPGame()));initGame();
}void Qwzq::initGame()
{game = new GameModel;initPVPGame();clickPosRow = clickPosCol = 0;
}void Qwzq::initPVPGame()
{game->gameStatus = playing;game->startGame();
}Qwzq::~Qwzq()
{if (game){delete game;game = nullptr;}}void Qwzq::paintEvent(QPaintEvent* event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);//防锯齿QBrush brush;brush.setStyle(Qt::SolidPattern);for (int i = 0; i < kGridCount+1; i++){painter.drawLine(kBoardMargin,kBoardMargin+i*kBlockSize,size().width()-kBoardMargin,kBoardMargin+i*kBlockSize);painter.drawLine(kBoardMargin+i*kBlockSize, kBoardMargin,kBoardMargin+i*kBlockSize,size().height()-kBoardMargin);}for (int i = 0; i < kGridCount; i++){for (int j = 0; j < kGridCount; j++){if (game->gameMap[i][j] == 1){brush.setColor(Qt::white);painter.setBrush(brush);painter.drawEllipse(kBoardMargin+kBlockSize*j-kRadius,kBoardMargin+kBlockSize*i-kRadius,kRadius*2,kRadius*2);}else if (game->gameMap[i][j]==-1){brush.setColor(Qt::black);painter.setBrush(brush);painter.drawEllipse(kBoardMargin + kBlockSize * j - kRadius, kBoardMargin + kBlockSize * i - kRadius, kRadius * 2, kRadius * 2);}}}QString str;if (game->isWin(clickPosRow, clickPosCol)){str = "Win!";QMessageBox::StandardButton btnValue = QMessageBox::information(this, tr("result"), str);close();}if (game->isDead()){str = "Over!";QMessageBox::StandardButton btnValue = QMessageBox::information(this, tr("result"), str);close();}
}void Qwzq::mousePressEvent(QMouseEvent* event)
{int x = event->x();int y = event->y();int kr = kBoardMargin + kBlockSize * kGridCount;int kd = kBoardMargin + kBlockSize*kGridCount;if (x>=kBoardMargin&&x<=kr&&y>=kBoardMargin&&y<=kd){int x1 = (x - kBoardMargin) / kBlockSize;int y1 = (y - kBoardMargin) / kBlockSize;x1 = x - (kBoardMargin + kBlockSize * x1);y1 = y - (kBoardMargin + kBlockSize * y1);if (x1 > kBlockSize / 2)x = (x-kBoardMargin) / kBlockSize + 1;elsex = (x - kBoardMargin) / kBlockSize;if (y1 > kBlockSize / 2)y = (y-kBoardMargin) / kBlockSize + 1;elsey = (y - kBoardMargin) / kBlockSize;game->updateMap(y, x);clickPosRow = y;clickPosCol = x;}update();
}

8、Qwzq.h代码如下:

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_Qwzq.h"
#include <GameModel.h>class Qwzq : public QMainWindow
{Q_OBJECTpublic:Qwzq(QWidget *parent = nullptr);~Qwzq();GameModel* game;int clickPosRow, clickPosCol;void initGame();private slots:void initPVPGame();private:private:Ui::QwzqClass ui;void paintEvent(QPaintEvent* event);void mousePressEvent(QMouseEvent* event);
};

9、main.cpp代码如下:

#include "Qwzq.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Qwzq w;w.show();return a.exec();
}

10、运行界面如下:

相关文章:

VS+QT五子棋游戏开发

1、首先安装好VS软件和QT库&#xff0c;将其配置好&#xff0c;具体不在此展开说明。 2、文件结构如下图&#xff1a; 3、绘制棋盘代码&#xff0c;如下&#xff1a; void Qwzq::paintEvent(QPaintEvent* event) {QPainter painter(this);painter.setRenderHint(QPainter::An…...

SpringBoot中动态注册接口

1. 说明 接口注册&#xff0c;使用RequestMappingHandlerMapping来实现mybatis中动态执行sql使用github上的SqlMapper工具类实现 2. 核心代码片段 以下代码为spring动态注册接口代码示例 Autowired private RequestMappingHandlerMapping requestMappingHandlerMapping;publ…...

CSS 实现两个圆圈重叠部分颜色不同

这是期望实现的效果&#xff0c;由图可知&#xff0c;圆圈底图透明度是0.4&#xff0c;左侧要求重叠部分透明度是0.7&#xff0c;所以不能通过简单的透明度叠加来实现最右侧的效果。 这就需要另外新建一个图层来叠加在两个圆圈重叠上方。 直接看代码 .circle_hight {width: 1…...

【数据库系统概念】第7-14章集合

文章目录 第七章 数据库设计和E-R模型&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09;~~7.1 设计过程概览&#xff08;了解&#xff09;~~7.1.1 设计阶段7.1.2 设计选择 7.2 实体-联系模型&#xff08;重点掌握&#xff09;7.2.1 实体集7.2.2 联系集联系集的…...

Kibana

Kibana是一个针对Elastic Search的开源分析及可视化的平台&#xff0c;使用kibana可以查询、查看并与存储在ES索引的数据进行交互操作&#xff0c;可以理解为一个客户端的工具&#xff0c;比如mysql和navicat。 使用kibana能执行高级的数据分析&#xff0c;并能以图表、表格和地…...

C#使用 OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率相关方式

C# 去获取电脑相关的基础信息&#xff0c;还是需要借助 外部的库&#xff0c;我这边尝试了自己去实现它 网上有一些信息&#xff0c;但不太完整&#xff0c;都比较零碎&#xff0c;这边尽量将代码完整的去展示出来 OpenHardwareMonitor获取CPU的温度和频率需要管理员权限 在没…...

K8S--- volumesvolumeMount

一、Volume 简介 在容器当中的磁盘文件(on-disk file )是短暂的(ephemeral),这会对重要的应用程序或者数据产生一些问题。当容器崩溃或停止时,会出现一个问题,即容器状态不会被保存,因此在容器生命周期内被创建或者修改的文件都将丢失。在容器崩溃期间,kubelet会以干净状…...

AntV-G6 -- 将G6图表应用到项目中

1. 效果图 2. 安装依赖 npm install --save antv/g6 3. 代码 import { useEffect } from alipay/bigfish/react; import G6 from antv/g6;const data {id: root,label: 利息收入,subLabel: 3,283.456,ratio: 3,children: [{id: child-a,label: 平均利息,subLabel: 9%,ratio:…...

第二百五十回

文章目录 1. 概念介绍2. 使用方法2.1 简单用法2.2 自定义用法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"三方包open_settings"相关的内容&#xff0c;本章回中将介绍另外一个三方包&#xff1a;bluetooth_enable_fork.闲话休提&#xff0c;让我们一起Talk Flu…...

如何把硬盘(分区)一分为二?重装系统的小伙伴不可不看

注意事项&#xff1a;本教程操作不当会导致数据丢失 请谨慎操作 请谨慎操作 请谨慎操作 前言 相信各位小伙伴都会切土豆吧&#xff0c;本教程就是教大家如何切土豆切得好的教程。 啊哈哈哈&#xff0c;开玩笑的。 比如你有一个D盘是200GB&#xff0c;想要把它变成两个100G…...

【AI视野·今日NLP 自然语言处理论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 31 Oct 2023 (showing first 100 of 141 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers The Eval4NLP 2023 Shared Task on Prompting Large Language Models a…...

解决Canvas画图清晰度问题

最近在开发Web端远程桌面的时候遇到的一个问题&#xff0c;解决记录一下&#xff0c;分享给各位有需要用到的朋友。 先吹下水&#xff1a;远程桌面的连接我们是通过Websocket连接后&#xff0c;后端不断返回远程端的界面二进制数据流&#xff0c;我接收到之后转为图像&#xf…...

zookeeper经典应用场景之分布式锁

1. 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候&#xff0c;大家往往采用Synchronized&#xff08;同步&#xff09;或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中&#xff0c;就需要一种更加高级的锁机制来处理跨机器的进…...

红队专题-Web安全/渗透测试-文件上传/下载/包含

文件上传/下载/包含 招募六边形战士队员利用目录穿越反弹SHELL实战测试2.2 提交报文修改检测3.2 文件内容检测绕过完整文件结构 检测 第四章&#xff1a;解析漏洞第一节 常见解析漏洞iis/nginx php fastcgi 取值错误 解析漏洞 &#xff08;配置错误&#xff09;nginx 文件名逻…...

安装阿里云CLI之配置阿里云凭证信息

有时候需要再主机上通过 OpenAPI 的调用访问阿里云&#xff0c;并完成控制&#xff0c;此时就需要在服务器上安装阿里云CLI&#xff0c;并完成账号的设置。 1. 登录阿里云创建账号 1.1 点击阿里云头像 ——》 控制访问 ——》创建一个拥有DNS权限的用户 这个用户不用太多权限…...

阿里云和腾讯云2核2G3M服务器上传速度多少?

2核2G3M服务器上传速度多少&#xff1f;上传是按10M带宽算&#xff0c;上传速度是1280KB/秒&#xff0c;即1.25M/秒&#xff1b;下载速度按3M带宽计算&#xff0c;下载速度是384KB/秒。本文阿腾云atengyun.com是以阿里云为例的&#xff0c;阿里云服务器当公网带宽小于10M及10M以…...

Python中的cls语法

在Python中&#xff0c;cls 是一个用于指代类本身的约定性名称&#xff0c;通常用作类方法&#xff08;class method&#xff09;中的第一个参数。cls 类似于 self&#xff0c;它是对类的引用&#xff0c;而不是对实例的引用。cls 通常在类方法中用于访问类级别的属性和方法。举…...

【Java】java -jar 读取jar包之外的yml

需求描述 springboot项目接入nacos配置&#xff0c;代码中使用bootstrap.yml来指定nacos信息&#xff0c;为了防止不同环境的来回切换&#xff0c;服务器中都单独在放一个bootstrap.yml&#xff0c;来指定具体环境的nacos配置&#xff0c;如sit服务器使用sit的nacos配置&#…...

遥感影像-语义分割数据集:山体滑坡数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该遥感滑坡数据集由卫星光学图像、滑坡边界的形状文件和数字高程模型组成。该数据集中的所有图像&#xff0c;即770张滑坡图像&#xff08;红点&#xff09;和2003张非滑坡图像&#xff0c;都是从2018年5月至8月拍摄的TripleSat卫星图像中截取…...

ubuntu 22.04 安装r-base时缺少r-recommended

sudo apt-get install r-base时报错&#xff1a; 下列软件包有未满足的依赖关系&#xff1a; r-base : 依赖: r-recommended ( 4.3.2-1.2004.0) 但无法安装它 E: 无法修正错误&#xff0c;因为您要求某些软件包保持现状&#xff0c;就是它们破坏了软件包间的依赖关系。 解决方…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...