Qt简易的五子棋

news2024/12/23 19:32:53

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

        成果展示

        

        需求分析

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

        实现过程

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

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

//画棋盘
void MainWindow::DrawChessboard()
{
    QPainter painter(this);//创建一个QPainter对象
    //设置抗锯齿 用于平滑图形的边缘
    painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
    //设置画刷的颜色  用于填充图形的内部
    painter.setBrush(Qt::darkYellow);
    //设置画笔的颜色与宽度  黑色,宽度为2
	painter.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)
{
	//求鼠标点击处的棋子点pt
	QPoint 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.coloradmin.cn/o/1422758.html

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

相关文章

ubuntu gedit主题更改

ubuntu16.04 gedit 编辑器又有首选项如何设置主题 这里下载主题 将主题XML复制到 /usr/share/gtksourceview-3.0/styles 文件夹内&#xff1b; 使用gsettings 命令设置喜欢的配色方案&#xff0c;使用方式如下&#xff1a;(实测不带.xml后缀哦) gsettings set org.gnome.gedi…

本地配置Joplin Server用于Joplin笔记同步并实现公网远程访问

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具&#xff0c;拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能&#xff0c;…

小程序定制开发:解析定制化移动应用的未来

引言 在当今数字化时代&#xff0c;移动应用已经成为人们生活不可或缺的一部分。随着智能手机的普及&#xff0c;移动应用的需求呈现出爆发式增长&#xff0c;企业们也纷纷投身于这场数字化浪潮。然而&#xff0c;众多企业在竞争激烈的市场中&#xff0c;如何突显个性、提高用…

uniapp本地存储日志

uniapp本地存储日志 背景实现代码实现使用查看生成log读取 注意事项尾巴 背景 我们的APP开发完成之后&#xff0c;在我们测试环境或者自测的时候都好好的&#xff0c;但是发布到生产环境客户使用总会出现一些奇奇怪怪的问题。这时候因为没在开发环境&#xff0c;我们无法查看到…

【云原生】docker安全与https加密的超文本传输协议CA证书生成

目录 一、docker安全 二、http与https的区别 三、为什么要使用 SSL 证书&#xff1f; 四、https证书认证的过程 https单向认证的访问流程 https双向认证的访问流程 五、如何获取证书&#xff1f; 六、实操获取证书并验证 1、通过阿里云获取证书 2、通过mkcert获取证书…

Flutter的安装与环境配置

一、下载安装Futter&#xff1a; 1、Flutter中文文档&#xff1a; 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2、下载 Futter SDK&#xff1a; Flutter中文文档 里面有&#xff0c;下载完成之后找个文件夹解压出来&#xff0c;最好不要将 Flu…

GoLang和GoLand的安装和配置

1. GoLang 1.1 特点介绍 Go 语言保证了既能达到静态编译语言的安全和性能&#xff0c;又达到了动态语言开发维护的高效率&#xff0c;使用一个表达式来形容 Go 语言&#xff1a;Go C Python , 说明 Go 语言既有 C 静态语言程序的运行速度&#xff0c;又能达到 Python 动态语…

编程实战实例分享,棋牌室计时计费管理系统软件教程

编程实战实例分享&#xff0c;棋牌室计时计费管理系统软件教程 一、前言 以下编程实例以 佳易王棋牌计时计费软件V17.8为例说明 1、开始计时和等待中&#xff0c;图片自动识别&#xff0c;自动匹配 2、开始计时后&#xff0c;系统记录开始时间&#xff0c;并直观显示所用的时…

开源项目MessageNest打造个性化消息推送平台多种通知方式

今天介绍一个开源项目&#xff0c;Message Nest - 可以打造个性化消息推送平台&#xff0c;整合邮件、钉钉、企业微信等多种通知方式。定制你的消息&#xff0c;让通知方式更灵活多样。 开源地址&#xff1a; https://github.com/engigu/Message-Push-Nest 测试平台 系统&am…

网安人必看!CISP家族顶流证书攻略

网络安全已成为当今的热门领域&#xff0c;证书在职业发展中的重要性不言而喻。但是&#xff0c;证书市场五花八门&#xff0c;选择适合自己的证书可是个大问题。别担心&#xff0c;今天我们就来聊聊CISP家族的几个热门认证&#xff0c;让你在网络安全领域的发展更加顺利&#…

Android存储系统基础知识

英文原版链接→ Android存储系统概览图&#xff08;图片模糊的话请拖动图片至新标签页打开&#xff09;&#xff1a; 从 Android 的角度来看 → 内部存储和 → 外部存储&#xff1a; 内部存储 内部存储只能通过已取得 root 权限的设备进行访问。 应用程序包保存在&#xff1a;…

家政小程序开发

随着人民生活水平的提高&#xff0c;我国老龄化日益增加&#xff0c;越来越多的家庭对家政服务需求也日益提升。目前&#xff0c;家政服务业已经成为了人们日常生活中不可缺少的一部分&#xff0c;家政服务市场具有较大的发展潜力。 近几年&#xff0c;家政服务市场规模呈快速…

驱动开发KMDF编译时:cannot open sourcefile “device.tmh“

有人说 设置项目的 WPP Tracing -> 设置 "Run Wpp Tracing" 为 YES&#xff0c;但是属性页压根没有这玩意啊&#xff1f;咋回事呢&#xff1f; 别人的工程属性页是这样的&#xff0c;这是为什么&#xff1f;

IT运维如何帮助企业降本增效?

IT监控运维管理技术发展应用和趋势 1、智能运维 随着人工智能和大数据技术的发展&#xff0c;智能运维将成为IT监控运维管理的重要趋势。通过利用机器学习、深度学习等技术&#xff0c;实现对IT系统的自动化监控、故障预测和智能维护&#xff0c;提高运维效率和质量。 2、容…

数字化转型对企业发展有哪些帮助?

数字化转型利用技术增强流程、运营和客户体验&#xff0c;在业务发展中发挥着至关重要的作用。以下是数字化转型促进企业发展的一些助力&#xff1a; 1.提高效率和生产力&#xff1a; 日常任务和流程的自动化有助于简化操作&#xff0c;减少完成它们所需的时间和精力。数字工…

瑞_数据结构与算法_红黑树

文章目录 1 什么是红黑树1.1 红黑树的背景1.2 红黑树的特性 ★★★ 2 红黑树的Java实现2.1 红黑树颜色枚举类Color2.2 红黑树节点类Node2.2.1 实现判断是否是左孩子方法isLeftChild()2.2.2 实现查找叔叔节点方法uncle()2.2.3 实现查找兄弟节点方法sibling() 2.3 红黑树类RedBla…

《Pandas 简易速速上手小册》第1章:Pandas入门(2024 最新版)

文章目录 1.1 Pandas 简介1.1.1 基础知识1.1.2 案例&#xff1a;气候变化数据分析1.1.3 拓展案例一&#xff1a;金融市场分析1.1.4 拓展案例二&#xff1a;社交媒体情感分析 1.2 安装和配置 Pandas1.2.1 基础知识1.2.2 案例&#xff1a;个人财务管理1.2.3 拓展案例一&#xff1…

Qt之QLabel介绍

概述 QLabel是QT界面中的标签类&#xff0c;它从QFrame下继承&#xff0c;QLabel 类代表标签&#xff0c;它是一个用于显示文本或图像的窗口部件。我们主要介绍一下QLabel的一些简单的使用。 设置颜色背景色和字体的颜色大小 字体及颜色 设置文字使用的是setText函数。 QStri…

linux中常用的命令

一&#xff1a;tree命令 &#xff08;码字不易&#xff0c;关注一下吧&#xff0c;w~~w) 以树状形式查看指定目录内容。 tree --树状显示当前目录下的文件信息。 tree 目录 --树状显示指定目录下的文件信息。 注意&#xff1a; tree只能查看目录内容&#xff0c;不能…

如何抠图换背景?分享6个不能错过的工具!

在数字化时代&#xff0c;抠图换背景已经成为了一种常见的图像处理需求。无论是出于商业宣传、个人创作还是日常生活分享的需要&#xff0c;抠图换背景都能帮助我们创造出更具视觉冲击力、更富有个性的图片。那么&#xff0c;如何进行抠图换背景呢&#xff1f;又有哪些工具可以…