智能五子棋1

news2024/11/26 13:36:10

*一、项目需求*

五子棋是一种简单的黑白棋,历史悠久,起源于中国,后传入日本,在日本被称为“连珠”,是一种老少皆宜的益智游戏。

人工智能五子棋系统的目标用户是一切想致力于研究人机对弈算法理论的相关研究者和一切想通过此系统进行五子棋人机对弈游戏的人群。目标用户特点:范围广泛,知识储备门槛低,年龄跨度大,具备操作简单的人机交互界面即可。

我们计划实现人人对弈,人机对战以及机机对弈等三种模式以及一些基本游戏功能。

*二、设备要求*

编译语言:C语言
操作系统:windows 操作系统
开发工具:Microsoft Visual Studio 2019
本次实验是运用Microsoft Visual Studio 软件来进行一次智能五子棋游戏的设计, Microsoft Visual StudioVS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具。Visual Studio是最流行的Windows平台应用程序的集成开发环境。最新版本为 Visual Studio 2019 版本。

人工智能五子棋属于人工智能中人机博弈的一种,人工智能应用广泛,人工智能是促进未来人类科技和生活重大改变的一门学科。

*三、项目设计*

本项目主要设计如下:

游戏用户接口:主界面以及基本框架:一共有四个页面,一个主菜单,两个副菜单以及一个棋盘界面。若是选择人人对弈,则调用棋盘,直接进行对弈,若是机器与机器对弈,则根据不同的难度调用不同难度的机器算发进行博弈。若是选择了机器与人的博弈,则会跳转去难度选择的页面,选择了困难之后,会跳转到选择先后手的页面,最后根据人选择的数据调用相应的函数与人进行博弈。
游戏操作规则:左键白子右键黑子。
设计能悔棋操作:即玩家在下棋子后能回到上一步。
提示鼠标的合法点击范围:若点击的位置不是棋盘或者功能键,则会有弹窗提示玩家,玩家需要点击关闭弹窗才能继续游戏。
限制每个棋子落下的规范:不能重复落子,仅能黑白子交替下子,若玩家点错,可触发弹窗提示玩家,玩家必须先关闭弹窗才能继续游戏。
游戏裁判算法:判断各个方向是否有五颗连起来的棋子,只要有一方先走成在在横、竖、斜方向上的五颗同色棋子就能赢得游戏,赢得游戏后,会有弹窗提示哪一方的棋子胜利并重新刷新一次棋盘,使玩家再次进行游戏。
实现算法对战模式:人机对战、人人对战、机机对战。
机器算法:利用估值函数,每下一颗棋子则在其周围加10,活二在其前后各加100,死二则在其为被堵住的地方的另一边加50,活三在其前后加1000,死三则在其为被堵住的地方的另一边加500,活四则在其前后分别加10000,死四则在其为被堵住的地方的另一边加上2000,找出棋盘上价值最大的点,并判断是进攻还是防守,从而使自身的每一步棋子的价值最大化。
*3.1、人机交互界面*

通过鼠标点击调用不同的函数,进而刷新屏幕使之进入不同的界面,让玩家选择自己想要的游戏模式,游戏难度以及先后手,让玩家有更好的游戏体验,为此,我特地添加了悔棋,重新开始,退出游戏等功能,让玩家在玩的过程中拥有更多机会。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yXXzU5bQ-1636549459002)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

图3.1.1 人机交互界面关系流程图

*3.2、系统结构设计*

*3.3、数据结构设计*

人工智能五子棋系统的每一个下棋格点用二维数组a[17][17]表示,数组内容分别为0,1,2代表未落子,黑子,白子。
初始化黑棋与白棋的估值函数表如下。
int Value_black / Value_white[ 17] [ 17] ={

{0, 0, 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, 1, 1, 0},

{0, 1, 2, 2, 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, 3, 3, 2, 1, 0},

{0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0},

{0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0},

{0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 5, 4, 3, 2, 1, 0},

{0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 6, 5, 4, 3, 2, 1, 0},

{0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0},

{0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 6, 5, 4, 3, 2, 1, 0},

{0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 5, 4, 3, 2, 1, 0},

{0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0},

{0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0},

{0, 1, 2, 3, 3, 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, 2, 2, 1, 0},

{0, 1, 1, 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, 0, 0}};
以下是我定义的各种函数。

void menu();              //主菜单背景

void Difficulty();           //选择人机难度

void choseFrist();         //选择先后手

void ChessBoard();            //棋盘

void DropChess(MOUSEMSG m);            //下棋

bool Rules(int i, int j, int x);   // 规则(落棋的合法性以及判断输赢)

void Newa();                //重新开始后进行初始化

void Regret(int x, int y);            //悔棋

void DropChess_People();     //人下棋

void Low();           //初级难度

void Medium();         //中级难度

void Low_J();

void Medium_J();

void Judge_ML(int i,int j,int x);            //判断棋盘模型

void Renew_Value_shu(int i,int j,int x,int n);  //更新价值表:竖直方向

void Renew_Value_leftup(int i, int j, int x, int n);   //更新价值表:左上往右下

void Renew_Value_heng(int i, int j, int x, int n);    //更新价值表:水平方向

void Renew_Value_rightup(int i, int j, int x, int n);   //更新价值表:右上到左下

HWND chunchun = GetHWnd();            //窗口弹出;

int flag = 0;                  //限制落棋的顺序以及赢棋之后无法再次落棋

int a[20][20] = { 0 };             //存储数组的二维数组

int level;                    //难度等级

int order = 0;               //顺序——先后手

int close = 0;               //使退出人机的程序。

int e,f,c,d;             //记录悔棋下标。

int level1 = 0;           //机器的

int value_black[17][17] = { 0 };      //黑棋的价值表

int value_white[17][17] = { 0 };        //白棋的价值表

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

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

相关文章

I2C总线(一)核心

基于linux-3.14.16 一、简介 硬件上,i2c总线由,i2c控制器、i2c总线、i2c设备组成。 驱动代码将通过设置i2c寄存器,从而在总线上产生数据信息,来和i2c设备通信(读/写)。 i2c核心,主要的功能包…

spring boot 配置多数据源 踩坑 BindingException: Invalid bound statement (not found)

在上一篇:《【已解决】Spring Boot多数据源的时候,mybatis报错提示:Invalid bound statement (not found)》 凯哥(凯哥Java) 已经接受了,在Spring Boot配置多数据源时候,因为自己马虎,导致的一个坑。下面&a…

【操作系统】实验一 熟悉LINUX环境和命令

实验名称: 实验一 熟悉LINUX环境和命令 实验目的: 1. 了解UNIX/LINUX的命令及使用格式。 2.熟悉UNIX/LINUX的常用基本命令。 3. 练习并掌握LINUX提供的vi编辑器来编译C程序 4. 学会利用gcc、gdb编译、调试C程序 实验内容: 熟悉UNIX/LINUX的…

YOLOv5改进 | 卷积篇 | SPD-Conv空间深度转换卷积(高效空间编码技术)

一、本文介绍 本文给大家带来的改进内容是SPD-Conv(空间深度转换卷积)技术。SPD-Conv是一种创新的空间编码技术,它通过更有效地处理图像数据来改善深度学习模型的表现。SPD-Conv的基本概念:它是一种将图像空间信息转换为深度信息…

Java_Lambda表达式JDK8新特性(方法引用)

一、Lambda表达式 接下来,我们学习一个JDK8新增的一种语法形式,叫做Lambda表达式。作用:用于简化匿名内部类代码的书写。 1.1 Lambda表达式基本使用 怎么去简化呢?Lamdba是有特有的格式的,按照下面的格式来编写Lamd…

如何用Python向图像中加入噪声

我们在做机器视觉项目的过程中,有的时候需要向图像中加入噪声。Pytorch本身不支持类似的功能,如果自己写的话,不但麻烦,而且容易出错。好在skimage支持这个功能。代码如下: import skimage import matplotlib.pyplot …

Web安全漏洞分析—文件包含

在当今数字化时代,随着Web应用程序的广泛应用,网络安全问题愈加凸显。其中,文件包含漏洞作为一种常见但危险的安全隐患,为恶意攻击者提供了可乘之机。在这篇博客中,我们将深入探讨文件包含漏洞的本质、攻击手法以及应对…

信息收集 - 域名

1、Whois查询: Whois 是一个用来查询域名是否已经被注册以及相关详细信息的数据库(如:域名所有人、域名注册商、域名注册日期和过期日期等)。通过访问 Whois 服务器,你可以查询域名的归属者联系方式和注册时间。 你可以在 域名Whois查询 - 站长之家 上进行在线查询。 2、…

python提取图片型pdf中的文字(提取pdf扫描件文字)

前言 文字型pdf提取,python的库一大堆,但是图片型pdf和pdf扫描件提取,还是有些难度的,我们需要用到OCR(光学字符识别)功能。 一、准备 1、安装OCR(光学字符识别)支持库 首先要安…

详解git pull和git fetch的区别

git pull和git fetch的区别, 网上人云亦云胡说八道的实在是太多了,误导我很久。 今天看到一个说得好的,记录一下。 前言 在我们使用git的时候用的更新代码是git fetch,git pull这两条指令。但是有没有小伙伴去思考过这两者的区别呢&#xff…

vue3引入Echarts图表

说明:echarts是父组件,stack是子组件,将stack引入到echarts文件中 查看echarts.vue时可看到stack.vue中的图表 # # # 引入方式 第一步 Echarts官网:快速上手 - 使用手册 - Apache ECharts 第二步 在控制台安装Echarts模块…

8.完成任务实现的SDK封装及插件式加载

1.设计 任务的实现目前完成了Modbus RTU、Modbus TCP、Virtule。任务实现应该是任意的,比如打印一段话,执行一句SQL等,所以系统内部的必然要做到可扩展。 要做到可扩展,首先第一步就是定义标准,所以我们首先需要封装…

nodejs+vue+微信小程序+python+PHP基于大数据的银行信用卡用户的数仓系统的设计与实现-计算机毕业设计推荐

银行信用卡用户的数仓系统综合网络空间开发设计要求。目的是将银行信用卡用户的数仓系统从传统管理方式转换为在网上管理,完成银行信用卡用户的数仓管理的方便快捷、安全性高、交易规范做了保障,目标明确。银行信用卡用户的数仓系统可以将功能划分为管理…

从文字下乡到人人学英语

从建国到改革开放,从恢复高考到新式教育改革,中国飞速发展,文字需求也在不断增大,在“地球村”的时代下,我们要“习文字之变,顺时代发展。” 古言道:“仓颉作书,后稷作稼”&#xff…

【Spark面试】Spark面试题答案

目录 1、spark的有几种部署模式,每种模式特点?(☆☆☆☆☆) 2、Spark为什么比MapReduce块?(☆☆☆☆☆) 3、简单说一下hadoop和spark的shuffle相同和差异?(☆☆☆☆☆…

Linux学习教程(第十三章 Linux数据备份与恢复)

第十三章 Linux数据备份与恢复 不知道大家有没有丢失过重要的数据呢? 丢失数据的理由是多种多样的,有人是因为重装系统时,没有把加密文件的密钥导出,重装系统后密钥丢失,导致所有的加密数据不能解密;也有人…

实验记录:深度学习模型收敛速度慢有哪些原因

深度学习模型收敛速度慢有哪些原因? 学习率设置不当: 学习率是算法中一个重要的超参数,它控制模型参数在每次迭代中的更新幅度。如果学习率过大,可能会导致模型在训练过程中的振荡,进而影响到收敛速度;如果…

字符设备驱动框架的编写

一. 简介 我们在学习裸机或者 STM32 的时候关于驱动的开发就是初始化相应的外设寄存器,在 Linux 驱动开发中,肯定也是要初始化相应的外设寄存器。 只是在 Linux 驱动开发中, 我们需要按照其规定的框架来编写驱动,所以说学 …

【网络安全】网络防护之旅 - Java安全机制探秘与数字证书引爆网络防线

🌈个人主页:Sarapines Programmer🔥 系列专栏:《网络安全之道 | 数字征程》⏰墨香寄清辞:千里传信如电光,密码奥妙似仙方。 挑战黑暗剑拔弩张,网络战场誓守长。 目录 😈1. 初识网络安…

机场信息集成系统系列介绍(3):机场运行核心数据库(AODB)

目录 1、背景:什么是AODB 2、AODB包括哪些内容 3、AODB还应该适配哪些场景 4、一点点拓展 机场运行核心数据库(AODB)Airport Operation DataBase 1、背景:什么是AODB 在机场繁重的航班保障和旅客服务背后,庞大的…