Qt简易的五子棋

        五子棋是个简单的小游戏,尝试使用Qt将他做出来,学习时的练习demo。

        成果展示

        

        需求分析

        五子棋:在棋盘上,黑棋先行,交替下棋,五子练成直线获取胜利。

        实现过程

        1.棋盘绘制:下棋的第一步肯定是绘制棋盘

           这里使用for循环画了15*15个格子数     

//画棋盘
void MainWindow::DrawChessboard()
{QPainter painter(this);//创建一个QPainter对象//设置抗锯齿 用于平滑图形的边缘painter.setRenderHint(QPainter::HighQualityAntialiasing, true);//设置画刷的颜色  用于填充图形的内部painter.setBrush(Qt::darkYellow);//设置画笔的颜色与宽度  黑色,宽度为2painter.setPen(QPen(QColor(Qt::black),2));//for循环画棋盘 15*15个格子for(int i = 0;i<CHESS_COLUMES; i++){for (int j = 0; j<CHESS_ROWS; j++){//画一个格子         横坐标                 纵坐标                    宽         高painter.drawRect( (i+0.5)*RECT_WIDTH,(j+0.5)*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);}}
}

        2.画棋子:棋子是椭圆的,这里是循环将所有下的棋子画在棋盘上,

//画棋子
void MainWindow::DrawItems()
{QPainter painter(this);//创建一个QPainter对象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);}
}//在点击的位置下棋
void MainWindow::DrawChessAtPoint(QPainter& painter,QPoint& pt)
{//painter.drawRect( (pt.x()+0.5)*RECT_WIDTH,(pt.y()+0.5)*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);//圆心的位置  格子的中心QPoint ptCenter((pt.x()+0.5)*RECT_WIDTH,(pt.y()+0.5)*RECT_HEIGHT);//绘制椭圆 也就是棋子painter.drawEllipse(ptCenter,RECT_WIDTH / 2,RECT_HEIGHT / 2);
}

        3.下棋并且判断输赢,这里是重写的鼠标点击事件

        这里判断输赢不能便利整个棋盘,而是以下下去的那个点为中心,判断四个方向是否能够练成五个子。

void MainWindow::mousePressEvent(QMouseEvent * e)
{//求鼠标点击处的棋子点ptQPoint pt;pt.setX( (e->pos().x() ) / RECT_WIDTH);pt.setY( (e->pos().y() ) / RECT_HEIGHT);//如果已存在棋子,就什么也不做for (int i = 0; i<mItems.size(); i++){Item item = mItems[i];if (item.mPt == pt){//已有棋子return;}}//不存在棋子,就下一个Item item(pt,mIsBlackTurn);mItems.append(item);//统计4个方向是否五子连  以下棋的那个子为中心int nLeft =			CountNearItem(item,QPoint(-1,0));int nLeftUp =		CountNearItem(item,QPoint(-1,-1));int nUp =			CountNearItem(item,QPoint(0,-1));int nRightUp =		CountNearItem(item,QPoint(1,-1));int nRight =		CountNearItem(item,QPoint(1,0));int nRightDown =	CountNearItem(item,QPoint(1,1));int nDown =			CountNearItem(item,QPoint(0,1));int nLeftDown =		CountNearItem(item,QPoint(-1,1));//本身下了一个棋子if ( (nLeft + nRight) >= 4 ||(nLeftUp + nRightDown) >= 4 ||(nUp + nDown) >= 4 ||(nRightUp + nLeftDown) >= 4 ){QString str = mIsBlackTurn?"Black":"White";QMessageBox::information(NULL,  "GAME OVER",str, QMessageBox::Yes , QMessageBox::Yes);mItems.clear();//NewGame();return;}//该另一方下棋了mIsBlackTurn = !mIsBlackTurn;
}int MainWindow::CountNearItem(Item item,QPoint ptDirection)
{int nCount = 0;item.mPt += ptDirection;//移动item的位置//从下棋的点往8个放向移动while (mItems.contains(item))//包含{//颜色相同 数目+1 且朝着相同的方向在移动一个nCount++;item.mPt += ptDirection;}return nCount;
}

        以上就是简易的qt五子棋,这是人人,并没有增加人工智能,后续会开发,应该是使用贪心算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA单例模式详解

单例模式 创建型模式提供创建对象的机制,能够提升已有代码的灵活性和复用性 常用的有&#xff1a;单例模式、工厂模式&#xff08;工厂方法和抽象工厂&#xff09;、建造者模式。 不常用的有&#xff1a;原型模式。 1 单例模式介绍 1 ) 定义 单例模式&#xff08;Singlet…

Windows内存管理 - 物理内存概念(Physical Memory Address)

作为windows驱动程序的程序员&#xff0c;需要比普通程序员更多的了解Windows内部的内存管理机制&#xff0c;并在驱动程序中有效地使用内存。在驱动程序编写中&#xff0c;分配和管理内存不能使用熟知的Win32 API函数&#xff0c;取而代之的是DDK提供的高效的内核函数。程序员…

platform总线

1、平台总线模型 平台总线模型是Linux系统虚拟出来的总线&#xff0c;而I2C、SPI等物理总线是真实存在的。 平台总线模型将一个驱动分成两个部分&#xff0c;分别是device.c和driver.c&#xff0c;分别用来描述硬件信息和控制硬件。 平台总线通过字符串比较&#xff0c;将name…

力扣热门100题刷题笔记 - 1.两数之和

力扣热门100题 - 1.两数之和 题目链接&#xff1a;1.两数之和 题目描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答…

Linux网络状态查看与防火墙管理

网络状态查看 netstat [选项] Netstat是一款命令行工具&#xff0c;用于显示Linux系统中网络的状态信息&#xff0c;可以显示网络连接、路由表、连接的数据统计等信息。 使用 选项 -a&#xff1a;显示所有选项&#xff0c;包括监听和未监听的端口。 -t&#xff1a;仅显示tc…

LLM(4) | Attention Is All You Need 论文粗读

LLM(4) | Attention Is All You Need 论文粗读 文章目录 LLM(4) | Attention Is All You Need 论文粗读1. 目的2. 回顾论文精读的第一遍的步骤3. 标题4. 摘要3. 结论4. 稍微看一下实验的图表5. 稍微看一下方法里的图表Reference 1. 目的 LLM 模型都是 transformer 模型&#x…

MUTAN readme文件(翻译)

/!\ VQA的新版本PyTorch代码现已提供&#xff0c;链接在这里: 代码链接 这个仓库是由Remi Cadene&#xff08;LIP6&#xff09;和Hedi Ben-Younes&#xff08;LIP6-Heuritech&#xff09;创建的&#xff0c;他们是在UPMC-LIP6从事VQA研究的两名博士生&#xff0c;以及他们的导…

【python】英语单词文本处理

文章目录 前言一、环境实验所需的库终端指令 二、实现过程Version 1 起源Version 2 listVersion 3 arrayVersion 4 结构化数组Version 5 区分单元且打乱顺序Version 6 可视化 三、txt文件 前言 缘起自懒得考小孩儿单词&#xff0c;最终效果如图&#xff1a; 本文记录了英语单词…

flutter开发实战-Camera自定义相机拍照功能实现

flutter开发实战-Camera自定义相机拍照功能实现 一、前言 在项目中使用image_picker插件时候&#xff0c;在android设备上使用无法默认设置前置摄像头&#xff08;暂时不清楚什么原因&#xff09;&#xff0c;由于项目默认需要使用前置摄像头&#xff0c;所以最终采用自定义…

面试经典150题 -- 区间(总结)

总的链接 : 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台最经典 150 题&#xff0c;掌握面试所有知识点https://leetcode.cn/studyplan/top-interview-150/ 228 汇总区间 直接用双指针模拟即可 ; class Solution { public…

Linux 指令

Linux 指令 1 登入/登出1.1 关机1.2 重启1.3 切用户 2 文件和目录管理2.1 目录操作2.2 文件操作2.3 文件内容操作2.4 归档及压缩 3 文本编辑器 vim3.1 命令模式3.2 输入模式3.3 末行模式 4 用户和组管理4.1 用户和组帐号概述4.1.1 用户帐号4.1.2 UID和GID 4.2 用户管理 5 组管理…

拥抱个人成长与社会进步:自我认知与开放心态的相互影响

拥抱个人成长与社会进步&#xff1a;自我认知与开放心态的相互影响 Embracing Personal Growth and Societal Progress: The Interplay of Self-Awareness and Open-mindedness 一、引言 I. Introduction 在当今急速发展的时代&#xff0c;个人成长与社会进步交织在一起&…

[每周一更]-(第86期):NLP-实战操作-文本分类

NLP文本分类的应用场景 医疗领域 - 病历自动摘要&#xff1a; 应用&#xff1a; 利用NLP技术从医疗文档中自动生成病历摘要&#xff0c;以帮助医生更快速地了解患者的状况。 法律领域 - 法律文件分类&#xff1a; 应用&#xff1a; 使用文本分类技术自动分类法律文件&#xf…

后端软件三层架构

一、三层架构简介 三层架构是软件开发中广泛采用的一种经典架构模式&#xff0c;其核心价值在于通过清晰的任务划分来提高代码的可维护性和重用性。具体来说&#xff0c;三层架构主要包括以下三个层次&#xff1a; 持久层&#xff08;DAO层&#xff09;&#xff1a;这一层主要…

提升 Web 请求效率:Axios request 封装技巧

在开发中&#xff0c;为了提高效率&#xff0c;通常对 Axios 进行封装&#xff0c;简化了请求的发送和对响应的处理。同时&#xff0c;统一错误处理机制有助于维护代码的清晰和一致性。本文介绍了一些高效封装 Axios 请求的方法。 封装理念 通过创建一个请求函数&#xff0c;我…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(四)NodeJS入门——网络基础概念

041_网络基础概念_IP的介绍 hello&#xff0c;大家好&#xff0c;我们来一起认识一下IP。 在开始介绍 IP 之前&#xff0c;我们首先来介绍一个场景&#xff0c;方便大家去理解 IP 这个概念。比如这会儿强哥正在成都&#xff0c;然后还有另外一个小伙伴&#xff0c;谁呢&#x…

互补滤波算法介绍+SCL源代码(收放卷线速度处理)

工程上对测量信号进行处理,我们可以利用低通滤波器,还可以利用滑动平均值滤波等,关于低通滤波器和滑动平均值滤波器,可以参考专栏相关文章,常用链接如下: 博途PLC一阶滞后低通滤波器(支持采样频率设置) https://rxxw-control.blog.csdn.net/article/details/132972093h…

带着问题读源码——Spring MVC是怎么找到接口实现类的?

引言 我们的产品主打金融服务领域&#xff0c;以B端客户为我们的核心合作伙伴&#xff0c;然而&#xff0c;我们的服务最终将惠及C端消费者。在技术实现上&#xff0c;我们采用了公司自主研发的微服务框架&#xff0c;该框架基于SpringBoot&#xff0c;旨在提供高效、可靠的服…

MyBatis笔记梳理

文章目录 什么是 MyBatis&#xff1f;前期准备依赖配置文件mapper利用注解 增、删、改、查查增改删#{} 和 ${} 的区别类型别名 动态sqlwhere ifforeachsql引用不常用标签 多表查询多对一&#xff08;一对一&#xff09;一对多多对多多表查询 个人理解 延迟加载概念使用场景延迟…

Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用

一、前言 之前在做倍速这个功能的时候&#xff0c;发现快速播放会有滴滴滴的破音出现&#xff0c;正常1倍速没有这个问题&#xff0c;尽管这个破音间隔很短&#xff0c;要放大音量才能听到&#xff0c;但是总归是不完美的&#xff0c;后面发现&#xff0c;通过修改qaudiooutpu…