智能五子棋1

*一、项目需求*

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

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

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

*二、设备要求*

编译语言: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.mzph.cn/news/230805.shtml

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

相关文章

使用C语言设计并实现一个成绩管理系统

使用C语言设计并实现一个成绩管理系统,该系统用于教师管理一门课程的成绩。 系统功能:成绩录入、打印成绩单、修改成绩、统计分数段、统计平均分、统计不及格学生,相关要求: 1) 系统要有主菜单界面,让教师…

关于《企业数字化平台》

大家好,开始我们《企业数字化平台》系列栏目,首先做一个简短的自我介绍,Duster是本人现在的笔名,曾用笔名尘埃,写了本书《生活新视界》,如果有缘的话,希望您读到他,如果您能读懂&…

Android Stuido报错处理

仅用作报错记录。防止以后出项问题不知如何解决。 报错1 Dependency‘androidx.annotation:xx requires libraries and applications … 需要修改CompileSDKVersion更改为报错中提示的版本 打开项目build.gradle文件,将compileSdk和targetSdk修改为报错中提示的版…

【深入pytorch】transforms.functional 梯度流动问题

实验环境: torch.__version__ Out[3]: 1.12.1cu113首先测试一下: import torch from torchvision.transforms import functional as F from torch.autograd import Function img torch.randn(1, 3, 224, 224) startpoints torch.FloatTensor([[0., 0…

.NET Core中鉴权 Authentication Authorization

Authentication: 鉴定身份信息,例如用户有没有登录,用户基本信息 Authorization: 判定用户有没有权限 使用框架提供的Cookie鉴权方式 1.首先在服务容器注入鉴权服务和Cookie服务支持 services.AddAuthentication(options > {options.DefaultAuthe…

【性能优化】一、使用JMeter进行压力测试并进行简单调优

压力测试 压力测试不同于功能测试,其目的是为了测试出系统在高并发,高数据量的情况下可能会出现的问题(内存泄露、并发、同步) 一种典型的内存泄漏就是对象在创建之后由很多用户进行调用,导致对象被不断新建但复用率…

2020 年网络安全应急响应分析报告

2020 年全年奇安信集团安服团队共参与和处置了全国范围内 660起网络安全应急响应事件。2020 年全年应急响应处置事件行业 TOP3 分别为:政府部门行业(146 起)医疗卫生行业(90 起)以及事业单位(61 起,事件处置数分别占应急处置所有行业的 22.1%、13.6%、9.2%。2020 年…

防篡改、控权限,一键搞定!迅软DLP助您轻松应对企业外发风险

由于电子文档传播性强,政企单位在与客户或合作伙伴分享重要资料时,存在非法篡改和无序传播的风险。因此,为了保护自身利益并确保与外界的安全交流,对外发文件的有效安全管控变得至关重要。 迅软DLP提供了针对外发文件的严格安全管…

OAuth 2.0进阶指南:解锁高级功能的秘密

欢迎来到我的博客,代码的世界里,每一行都是一个故事 OAuth 2.0进阶指南:解锁高级功能的秘密 前言令牌管理与刷新令牌的生命周期:刷新机制:有效管理访问令牌,防止令牌泄漏的方法: 客户端凭证客户…

宝塔Linux:部署His医疗项目通过jar包的方式

📚📚 🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​​​ 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有…

OpenAI发布官方提示工程指南和示例

OpenAI提供了一系列策略和技巧,以帮助用户更有效地使用ChatGPT。这些方法可以单独使用也可以组合使用,以获得更好的效果。官方给出了6 个大提示策略(并给出了具体教程和示例) 主要策略: 1、清晰的指令: 告…

测试估算:确保项目成功的关键

引言: 在软件开发过程中,测试是不可或缺的一环。它可以帮助发现和修复软件中的错误和缺陷,提高软件的质量和可靠性。然而,测试工作需要耗费大量的时间和资源,因此进行测试估算是至关重要的。本文将介绍测试估算的重要性…

微信小程序校园跑腿系统怎么做,如何做,要做多久

​ 在这个互联网快速发展、信息爆炸的时代,人人都离不开手机,每个人都忙于各种各样的事情,大学生也一样,有忙于学习,忙于考研,忙着赚学分,忙于参加社团,当然也有忙于打游戏的&#x…

js中国标准时间转换

一、将中国标准时间转换为 例如 2023-12-18 08:00:00 // 获取今天的日期let today new Date();// 设置 beginDate 为今天的上午8点let beginDate new Date(today.getFullYear(), today.getMonth(), today.getDate(), 8, 0, 0, 0);// 设置 finishDate 为 beginDate 的后三天的…

快速排序(一)

目录 快速排序(hoare版本) 初级实现 问题改进 中级实现 时空复杂度 高级实现 三数取中 快速排序(hoare版本) 历史背景:快速排序是Hoare于1962年提出的一种基于二叉树思想的交换排序方法 基本思想&#xff1a…

Flink系列之:窗口去重

Flink系列之:窗口去重 一、窗口去重二、示例三、限制 一、窗口去重 适用于Streaming窗口去重是一种特殊的去重,它根据指定的多个列来删除重复的行,保留每个窗口和分区键的第一个或最后一个数据。对于流式查询,与普通去重不同&…

软件测试技术分享| Appium用例录制

下载及安装 下载地址: github.com/appium/appi… 下载对应系统的 Appium 版本,安装完成之后,点击 “Start Server”,就启动了 Appium Server。 在启动成功页面点击右上角的放大镜,进入到创建 Session 页面。配置好…

QT作业3

完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配&#xf…

Java 程序的命令行解释器

前几天我写了一个简单的词法分析器项目:https://github.com/MarchLiu/oliva/tree/main/lora-data-generator 。 通过词法分析快速生成 lora 训练集。在这个过程中,我需要通过命令行参数给这个 java 程序传递一些参数。 这个工作让我想起了一些不好的回忆…

对Arthas-Trace命令的一次深度剖析,竟发现...

前言:此文仅为笔者学习Arthas源码的一次尝试,不对本文结论负全部责任。 一、背景 笔者在学习arthas这个十分方便的小工具的过程中,发现: 目前据arthas官方解释:因为trace多层是十分消耗资源的,因此trace命…