《QT实用小工具·六十九》基于QT开发的五子棋AI游戏

1、概述
源码放在文章末尾

该项目实现了五子棋对战AI,可以享受和AI下棋的快乐,项目实现思路如下:
博弈树

●Alpha-Beta剪枝(性能提高较大)

●启发式搜索(性能提高较大)

●落子区域限制(性能提高较大)

●Zobrist哈希(性能小幅提升)

●Qt多线程计算避免界面卡死

●小概率走法剔除

仅进行Alpha-Beta剪枝+落子区域限制,思考两层,计算量在3k-9k,2s内计算完毕;思考四层,计算量在9k-20w,2s~20min内计算完毕.

+启发式搜索,思考两层,思考两层,计算量在900-2k,1s内计算完毕;思考四层,计算量在3k-3w,2s~20s内计算完毕.

+小概率走法剔除,思考两层,思考两层,计算量在24-60,1s内计算完毕;思考5层,计算量在2k-3k,1s内计算完毕;思考7层,计算量在8k-3w,2min~10min内计算完毕

项目界面图如下所示:
在这里插入图片描述
项目部分代码如下所示:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPainter>
#include <QPen>
#include <QDebug>
#include <QMouseEvent>
#include <QString>
#include <vector>
#include <QMessageBox>
#include <random>
#include <ctime>
#include <map>
#include <cmath>
#include <algorithm>
#include <QThread>
#include <QTime>
#include <unordered_map>
#define QOUT qDebug()enum patternID{LongLink=0,Active4,Sleep4,Active3,Sleep3,Active2,Sleep2,Dead4,Dead3,Dead2
};struct step{int x;int y;bool nowWhite;int score;step(int xx=0,int yy=0,bool nw=true){x=xx;y=yy;nowWhite=nw;}
};struct pattern{std::vector<QString> whitePattern;std::vector<QString> blackPattern;int id;int whiteScore;int blackScore;void clear(){whitePattern.clear();blackPattern.clear();}
};namespace Ui {class MainWindow;
}class MainWindow;
class AI:public QObject{Q_OBJECT
public:AI();AI(MainWindow *p):parentWindow(p){}int count;
private:MainWindow* parentWindow;public slots:void getAINextStep();public:int getChessScore(int chess[15][15],int leftEdge=0,int rightEdge=14,int upEdge=0,int downEdge=14);int getLineScore(QString,int whitePatternNum[10],int blackPatternNum[15]);std::vector<step> getPossibleSteps(int chess[15][15],bool white,int leftEdge=0,int rightEdge=14,int upEdge=0,int downEdge=14);int alpha_beta(int chess[15][15], int depth, int alpha, int beta);bool calculateScore(std::vector<step>& possibleSteps,int chess[15][15]);void deleteUselessStep(std::vector<step>& possibleSteps,int chess[15][15]);bool reserveKillStep(std::vector<step>& possibleSteps,int chess[15][15]);signals:void stepReady();
};class MainWindow : public QMainWindow
{Q_OBJECT
friend class AI;
public:explicit MainWindow(QWidget *parent = 0);~MainWindow();void paintEvent(QPaintEvent *e);void mousePressEvent(QMouseEvent *e);void keyPressEvent(QKeyEvent *e);
public slots:void handleAIStep();
signals:void AIShouldMove();
private:QThread AIThread;bool gameOver;int searchDepth;//搜索深度,应当是偶数int killStepSearchDepth;int stepAlreadyMade;//已经走的步数Ui::MainWindow *ui;const int gap=20;constexpr static int boxNum=14;const int boxWidth=gap*boxNum;const int startX=30;const int startY=30;bool nowWhite;//记录当前是否是白子 白色=1 黑色=2int gomoku[boxNum+1][boxNum+1];int gomokuForPaint[boxNum+1][boxNum+1];bool judge(int x,int y,bool nowWhite);bool judge(int chess[15][15],int x, int y, bool nowWhite);int steps;//用于设定搜索范围的步数int AINextX;int AINextY;bool AIIsThinking;std::vector<pattern> patterns;//储存算分的模式std::vector<pattern> lightPatterns;//排序走法用的模式int zobristHash;std::unordered_map<int,int> scoreCache;bool debug;int basicScore[15][15]={{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0 },{ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 6, 6, 6, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 6, 6, 6, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0 },{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0 },{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };int zobristWhite[15][15];int zobristBlack[15][15];int XStack[250];//从1开始算int YStack[250];//从1开始算void initPattern();//初始化算分模式
public slots:void restartGame();void regret();};#endif // MAINWINDOW_H

源码下载

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

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

相关文章

数据治理基础知识

文章目录 基本概念相关名词术语数据治理对象 基本概念 1&#xff09;从管理者视角看数据治理 数据治理是企业发展战略的组成部分&#xff0c;是指导整个集团进行数字化变革的基石&#xff0c;要将数据治理纳入企业的顶 层规划&#xff0c;各分/子公司、各业务部门都需要按照企…

日有所思的梦想

概述 俗话说&#xff0c;日有所思&#xff0c;夜有所梦&#xff0c;那所谓的梦想&#xff0c;不正是梦中的想法吗&#xff1f; 但随着日常生活的柴米油盐&#xff0c;平淡无奇的每天&#xff0c;以及看似忙忙碌碌&#xff0c;却实际碌碌无为的我们&#xff0c;你的梦想是否早…

软考高级系统规划与管理师适合什么人考?有什么优势?

系统规划与管理师适合什么人考&#xff1f; 适合以下几类人群&#xff1a; 1. 信息技术服务规划人员&#xff1a;从事信息技术服务规划工作&#xff0c;负责制定和优化IT服务规划的人 2. 信息系统运行维护管理人员&#xff1a;负责信息系统日常运行维护、确保系统稳定性和可…

【前端】Mac安装node14教程

在macOS上安装Node.js版本14.x的步骤如下&#xff1a; 打开终端。 使用Node Version Manager (nvm)安装Node.js。如果你还没有安装nvm&#xff0c;可以使用以下命令安装&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 然后关…

变压器励磁涌流MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 变压器励磁涌流的产生机理 1、变压器是电力系统的关键部分&#xff0c;在实际的 运行中&#xff0c;变压器需要进行相应的充电&#xff0c;而在充电的过 程中&#xff0c;就需要进行开合闸作业。在开合闸作业…

【Linux】磁盘结构文件系统软硬链接动静态库

目录 一.磁盘结构 1、磁盘的物理结构 2、磁盘的存储结构 3、磁盘的逻辑结构 二.文件系统 1、对IO单位的优化 2、磁盘分区与分组 3、对分组的具体管理方法 4、文件操作 三.软硬链接 1、理解硬链接 2、理解软连接 3、理解.和.. 四、动静态库 1、什么是动静态库 2、…

关于laravel的一些基础问答

1 . 简述 ThinkPHP、Yii、CodeIgniter、Laravel的优缺点&#xff1f; ThinkPHP&#xff1a; 优点&#xff1a;中文文档丰富&#xff0c;易于学习和上手&#xff0c;适合国内开发者&#xff1b;社区活跃&#xff0c;有较多的资源和扩展可用&#xff1b;在国内应用广泛。缺点&a…

Flutter基础 -- Dart 语言 -- 基础类型

目录 0. 配置 1. 变量 1.1 弱类型 var Object dynamic 1.2 强类型 1.3 使用场景 var 简化定义变量 查询参数定义 返回的实例对象 2. 常量 final 和 const 2.1 相同点 类型声明可以省略 初始后不能再赋值 不能和 var 同时使用 2.2 不同点 const 需要确定的值 …

线性代数|机器学习-P1课程简介

文章目录 1. 书籍下载2. 正文 1. 书籍下载 链接&#xff1a;https://pan.baidu.com/s/1QbK0enLh0x4nU1c4Tqwlkw 提取码&#xff1a;r7ft 本课程回顾线性代数在概率论、统计学、优化和深度学习中的应用。是GILBERT STRANG教授的有一个经典的课程。课程将线性代数分为如下部分&a…

android项目多语言文件统一处理工具

0&#xff0c;建议首先创建3个文件夹&#xff1a; ①&#xff1a;1、values_all ②&#xff1a;2、xml ③&#xff1a;3、output 1&#xff0c;android项目多语言strings.xml文件复制到一个文件夹&#xff1a; import os import shutildef find_string_xml(directory):string…

利用“记忆化搜索“解斐波那契数

一、题目描述 求第 n 个斐波那契数。 二、 利用"记忆化搜索"解斐波那契数 什么是记忆化搜索&#xff1f;记忆化搜索就是带有备忘录的递归。 我们先来看一下使用递归来解斐波那契数的这个过程&#xff0c;假设求第5个斐波那契数F(5)。 由图可见&#xff0c;要重复计…

MATLAB:format作用

format作用 介绍常用命令1. format short2. format long3. format long e 或 format short e4. format rat5. format bank6. format 7. format hex8. format compact 使用方法举例注意 介绍 在MATLAB中&#xff0c;format函数用于控制命令窗口中显示数字的格式。MATLAB提供了多…

构建可变变量的存储方式

简介 在FPGA中最常用的IP核就是FIFO和RAM了&#xff0c;这两个通常由官方IP来实现&#xff0c;但是在IP中&#xff0c;如果想要修改参数就十分困难。因此就需要构建可变存储空间的FIFO和RAM。通常构建FIFO可以用XILINX提供的源语以及宏来实现&#xff0c;构建小容量的RAM可以用…

Android加固多渠道打包和签名工具

简介 基于腾讯VasDolly最新版本3.0.6的图形界面衍生版本&#xff0c;同时增加了签名功能&#xff0c;旨在更好的帮助开发者构建多渠道包 使用说明 下载并解压最新工具包&#xff0c;找到Startup脚本并双击启动图形界面&#xff08;注意&#xff1a;需本地安装java环境&#…

手机定制开发_基于天玑900的5G安卓手机定制方案

手机定制方案基于联发科天玑900强劲旗舰八核2.4GHz处理器。这款处理器采用了6nm先进制程工艺&#xff0c;为用户带来了痛快淋漓的性能体验。不论是进行游戏还是日常娱乐&#xff0c;用户都能轻松驾驭。手机搭载了最新的Android 13操作系统&#xff0c;提高了数据读取的准确性&a…

解析Java中1000个常用类:Cloneable类,你学会了吗?

在 Java 编程中,复制对象是一个常见的需求。为了提供对象的复制功能,Java 引入了 Cloneable 接口和 clone 方法。 本文将深入探讨 Cloneable 接口的功能、用法、实现类及其在实际开发中的应用,帮助程序员更好地理解和利用这一接口。 Cloneable 接口概述 什么是 Cloneable…

根据IP查询城市ID和名字

根据IP查询城市ID和名字 import json import time import geoip2.database import requests from loguru import logger #创建GeoIP对象&#xff0c;并指定数据库路径 reader geoip2.database.Reader(rD:\thb\code\python-trial\pythonProject\data\GeoLite2-City.mmdb)#web …

小数第n位【蓝桥杯】

小数第n位 模拟 思路&#xff1a;arr数组用来记录已经出现过的a&#xff0c;在循环时及时退出。易知题目的3位即a%a后的第n-1,n,n1位。该代码非常巧妙&#xff0c;num记录3位的输出状况。 #include<iostream> #include<map> using namespace std; typedef long l…

vulnhub靶场之FunBox-9

一.环境搭建 1.靶场描述 Its a box for beginners, but not easy. Gather careful !!! Hint: Dont waste your time ! Every BruteForce-Attack at all ports can be stopped after 1500 trys per account. Enjoy the game and WYSIWYG ! This works better with VirtualBox…

Web前端ES6-ES13笔记合集

一. 走入ES6 ##### 1.初识ES6 > ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在 2015 年 6 月正式发布了。它的目标&#xff0c;是使得 JavaScript 语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语…