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

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl