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.hqwc.cn/news/442529.html

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

相关文章

什么是Vue Vue入门案例

一、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架 Vue2官网&#xff1a;Vue.js 1.什么是构建用户界面 基于数据渲染出用户可以看到的界面 2.什么是渐进式 所谓渐进式就是循序渐进&#xff0c;不一定非得把V…

APUE学习之进程间通信(IPC)(下篇)

目录 一、进程间通信&#xff08;IPC&#xff09; 二、信号量&#xff08;Semaphore&#xff09; 1、基本概念 2、同步关系与互斥关系 3、临界区与临界资源 4、信号量的工作原理 5、信号量编程 6、实战演练 三、共享内存&#xff08;Shared Memory&#xff09; 1、…

【解决】Unity 工程无法正常打开而崩溃问题

开发平台&#xff1a;Unity 2022.3.17f1c1 一、问题描述 访问 Unity 工程等待 Open Projet&#xff08;busy for 时间&#xff09;&#xff0c;出现崩溃、闪退等情况&#xff0c;导致无法正常进入Unity编辑页面。 二、问题分析 笔者在 URP 渲染管线下处理 Obi Fluid 流体插件 D…

Meta开源Code Llama 70B,缩小与GPT-4之间的技术鸿沟

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Code - VQ-VAE (Vector Quantised Variational AutoEncoder) 的实现源码

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135936848 VQ-VAE&#xff0c;即Vector Quantized Variational AutoEncoder&#xff0c;向量量化变分自编码器。VQ-VAE 的创新之处是引入了一个向…

java基础(面试用)

一、基本语法 1. 注释有哪几种形式&#xff1f; //单行注释&#xff1a;通常用于解释方法内某单行代码的作用。 //int i 0;//多行注释&#xff1a;通常用于解释一段代码的作用。 //int i 0; //int i 0;//文档注释&#xff1a;通常用于生成 Java 开发文档。 /* *int i 0; …

不移其志,踏浪前行 | 北京智和信通召开2023年度工作总结大会

岁聿云暮&#xff0c;新元肇启&#xff0c;2024年1月24日&#xff0c;北京智和信通技术有限公司&#xff08;以下简称“北京智和信通”&#xff09;召开2023年度年终总结大会。会上&#xff0c;各部门负责人全面分析公司业务发展态势&#xff0c;各部门员工依次汇报主要工作情况…

TS项目实战一:流淌的字符动画界面

使用ts实现虚拟世界&#xff0c;创建ts项目&#xff0c;并编写ts代码&#xff0c;使用tsc编译后直接加载到html界面&#xff0c;实现类似黑客帝国中的流淌的代码界面的效果。 源码下载地址&#xff1a;点击下载 讲解视频 TS实战项目一&#xff1a;数字流界面项目创建 TS实战项…

聚道云软件连接器助力金融科技公司,提升企业管理效率

客户介绍 某金融服务控股有限公司&#xff0c;是中国领先的金融科技公司&#xff0c;专注于为金融机构提供智能风控、智能营销、智能客服、智能运营等产品和服务。公司拥有强大的技术研发实力&#xff0c;在人工智能、大数据、云计算等领域拥有多项核心技术专利。 客户痛点 在…

抽象类(Java)、模板方法设计模式

一、概念 在Java中有abstract关键字&#xff0c;就是抽象的意思&#xff0c;可用来修饰类和成员方法。 用abstract来修饰类&#xff0c;那这个类就是抽象类&#xff1b;修饰方法&#xff0c;那这个方法就是抽象方法。 修饰符 abstract class 类名{修饰符 abstract 返回值类型…

力扣题目训练(6)

2024年1月30日力扣题目训练 2024年1月30日力扣题目训练367. 有效的完全平方数374. 猜数字大小383. 赎金信99. 恢复二叉搜索树105. 从前序与中序遍历序列构造二叉树51. N 皇后 2024年1月30日力扣题目训练 2024年1月30日第六天编程训练&#xff0c;今天主要是进行一些题训练&…

分库分表已成为过去式,使用分布式数据库才是未来

当我们使用 Mysql数据库到达一定量级以后&#xff0c;性能就会逐步下降&#xff0c;而解决此类问题&#xff0c;常用的手段就是引入数据库中间件进行分库分表处理&#xff0c;比如使用 Mycat、ShadingShpere、tddl&#xff0c;但是这种都是过去式了&#xff0c;现在使用分布式数…