android游戏开发之我的小小游戏1——五子棋游戏4之电脑下棋、人机对战算法

本文主要是介绍android游戏开发之我的小小游戏1——五子棋游戏4之电脑下棋、人机对战算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       在棋类游戏中最难的便是人机对战电脑的AI算法了,算法设计的好坏将严重的影响游戏的趣味程度,关于五子棋的相关算法,讨论的人也比较多。在我们此次的电脑的AI算法中采用的方式即是,当电脑开始下棋的时候,它会计算对手下在各个位置获胜的可能性,然后通过可能性的大小来对比自己应该把棋子下在哪个位置。可能性的大小我们用权值来表示,那么如何计算权值呢?权值的计算方法比较容易,即从上、下、左斜向、右斜向四个方向寻找连子,如果连子有1个,即可赋值权值100,依次增高,如果连子有4个,那么就应该有最高的权值,即10000。值得注意的是,权值不仅仅包括一个方向,例如“双三”(两个三个的,玩过五子棋的都懂的)或“冲四”(即立即可以赢的),在一个棋子的不同方向都有多个子的时候,应该加上所有方向的权值。

 

由于近来比较的忙,没有时间认认真真的研究算法,等有时间了再好好研究,下面参考了网上的一个有关五子棋的AI算法,大家可以看看,等过段时间会好好的研究一下并重新整理一下:

public class SuanFa {//定义一个数组来赋值当前的棋局private int[][] curChess = new int[12][12];//复制当前的棋局private void copyChessboard(int[][] chess){for(int i=0;i<12;i++){for(int j =0;j<12;j++){curChess[i][j] = chess[i][j];}}}//记录当前的落子的位置private int ci,cj;private void copyChessLocation(int i,int j){ci=i;cj=j;}//记录下棋方的IDprivate int nameID;public void loadInfo(int[][] chess,int i,int j){copyChessboard(chess);copyChessLocation(i,j);nameID = 2;}//定义权值常量//黑白白空private final int Q2O = 50;//空白白空private final int Q2 = 100;//黑白白白空private final int Q3O = 500;//空白白白空private final int Q3 = 1000;//黑白白白白空private final int Q4O = 5000;//空白白白白空private final int Q4 = 10000;//白白白白白private final int Q5 = 100000;//权值定义好之后,就可以用来计算棋盘上各个点的权值了,经分析,棋盘上某个点的权值有四部分构成,//分别是此点在水平方向的权值、此点在垂直方向上的权值、此点在45度方向上的权值、此点在135度方向上的权值,//所以必须先求出这四个方向上的权值,然后再将他们进行相加便得到这个点的权值了private int getQuan(int i,int j)//i,j记录当前假定的落子点{//求当前位置的权值int q = 0;q += getQuan0(i,j);
//		q += getQuan90(i,j);
//		q += getQuan45(i,j);
//		q += getQuan135(i,j);return q;}private int getQuan0(int i,int j){//水平权值int samechessNumS = 0;//相同棋子的个数int samechessNumF = 0;//用来堵棋的,反方的相同棋子的个数int blankNumS = 0;int blankNumF = 0;int q = 0,qS = 0,qF = 0;int[][] ij0 = new int[2][2];//计算权值用的ij0[0][0] = ij0[0][1] = i;ij0[1][0] = ij0[1][1] = j;samechessNumS = getsamechessNum0(ij0,1);//得到白子数目if(ij0[1][0]>=0)if(curChess[ij0[0][1]][ij0[1][0]] == 0)blankNumS++;if(ij0[1][1]<12)//12为线条数if(curChess[ij0[0][1]][ij0[1][1]] == 0)blankNumS++;qS = getQuanpart(samechessNumS,blankNumS);//得到速胜权值ij0[0][0] = ij0[0][1] = i;ij0[1][0] = ij0[1][1] = j;samechessNumF = getsamechessNum0(ij0,2);//得到黑子数目if(ij0[1][0] >= 0)if(curChess[ij0[0][0]][ij0[1][0]] == 0)blankNumF++;if(ij0[1][1] >= 0)if(curChess[ij0[0][1]][ij0[1][1]] == 0)blankNumF++;qF = getQuanpart(samechessNumF,blankNumF);//得到堵敌权值q = qS + qF;return q;}private int getsamechessNum0(int[][] qij,int chessID){//得到水平方向的同子数目int num = 1;//存储相同棋子数目,当前点满足条件qij[1][0]--;while(qij[1][0]>=0 && num < 5){//向左探索我们只探索临近的4个点,注意不要出边界哦if(curChess[qij[0][0]][qij[1][0]]  != chessID)break;num++;qij[1][0]--;}qij[1][1]++;while(qij[1][1]<12 && num<5){//向右探测if(curChess[qij[0][1]][qij[1][1]] != chessID)break;num++;qij[1][1]++;}return num;}private int getQuanpart(int sameChessNum,int blankNum){//求取某一方向上的一般权值if(sameChessNum == 2 && blankNum == 1)return Q2O;if(sameChessNum == 2 && blankNum == 2)return Q2;else if(sameChessNum == 3 && blankNum == 1)return Q3O;else if(sameChessNum == 3 && blankNum == 2)return Q3;else if(sameChessNum == 4 && blankNum == 1)return Q4O;else if(sameChessNum == 4 && blankNum == 2)return Q4;else if(sameChessNum == 5)return Q5;else return 0;}
}


这篇关于android游戏开发之我的小小游戏1——五子棋游戏4之电脑下棋、人机对战算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/457624

相关文章

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3