基于Java+AI的五子棋游戏设计与实现(毕业论文+程序源码)
大家好,今天给大家介绍基于Java+AI的五子棋游戏设计与实现。本文最后附上了本次毕业设计的论文及源码下载地址。需要下载开题报告PPT模板、论文答辩PPT模板等的朋友可以到我的博客主页左侧底栏查看自助下载方式。
文章目录:
1.项目简介 五子棋是一种深受民众喜爱的棋类竞技体育项目。为了熟悉五子棋的规则和技巧,以及研究简单的人工智能,决定用Java开发一款五子棋游戏。主要完成两个功能:人机对战和玩家在线对战。网络连接部分是一个编程应用程序。定义了客户端与服务器之间的交互,具有良好的可扩展性。客户端负责界面维护、收集用户输入信息、错误处理等。服务器维护在线用户的基本信息和任意两个对战用户的棋盘信息,并动态维护用户列表。在人机对战中,通过深度搜索和估值模块来提高计算机棋手的智能。在估值模块中分析影响准确率的几个因素,提出几种提高准确率的方法,并比较它们搜索的节点数。基于这些算法,分析一些提高计算机AI的解决方案,如递归算法、计算机学习等。 算法的学习有助于理解程序结构,增强逻辑思维能力,对其他人工智能也有很大的借鉴作用。2.资源详情
项目难度:中等难度
适用场景:相关主题的毕业设计
支持论文字数:每字26页
内容:完整源码+完整毕业论文+答辩PPT
3. 关键词:深度搜索;估值;计算机人工智能;五子棋;算法 4. 毕业设计介绍
提示:下面是对毕业论文的简单介绍,文章最后可以找到项目源码和完整毕业论文的下载地址。
1 简介
1.1 项目背景
五子棋是起源于中国古代的一种传统黑白棋类游戏。现代五子棋在日语中称为连珠,英文译为FIR(Five in a Row的缩写),还有连五子、五子连、串珠、五木、五木通、五格等多种名称。
五子棋起源于古代中国,发展于日本,并流行于欧洲。关于它与围棋的关系有两种说法。一种说法认为它比围棋更古老,早在“尧发明围棋”之前,民间已有五子棋游戏。另一种说法认为它起源于围棋,是围棋的一个分支。在中国文化中,五子棋十分流行。本世纪初,五子棋传入欧洲,并迅速风靡整个欧洲。经过一系列的变化,五子棋这种简单的游戏变得更加复杂和规范,并最终成为今天的职业五子棋,也成为国际比赛棋类。
Java是当今最流行的编程语言之一。作为一门非常优秀、极其健壮的编程语言,它还具有面向对象、平台无关、分布式应用、安全性、稳定性、多线程等优秀特性。使用Java,不仅可以开发出功能强大的大型应用程序,而且Java本身出色的跨平台特性也使其特别适合互联网上的应用程序开发。可以说,Java的出现,使得应用程序开发“一次编写,处处使用”成为可能。
1.2 本研究的意义
随着电脑的飞速发展,各种电脑游戏层出不穷,给我们带来了更多的娱乐选择。棋类游戏可以帮助人们训练思维,培养品格。而且棋类游戏的水平相当高,很有可能与人脑较量。其中,击败国际象棋世界冠军卡斯帕罗夫的“深蓝”就是最具说服力的代表;其他如围棋中的“首段”、国际象棋中的“将军”,也因其出色的人工智能而深受棋迷的喜爱。
越来越多的智能机器进入人类生活,人工智能的重要性如今已显而易见。我对人工智能比较感兴趣,而五子棋游戏程序的开发和实现为我提供了这样的研究机会。通过人工智能(人机博弈)中博弈论的学习,我对简单的人机博弈的总体设计和相关算法有了深刻的理解。人工智能属于计算机科学领域,它以计算机技术为基础,近几十年来,其理论和技术日趋成熟,应用领域也不断扩大,显示出强大的生命力。人工智能大致可以分为几个学科,每个学科都独具特色,但它们之间经常相互结合完成设计任务。这时,这些学科之间的区别就变得很模糊了。人工智能在专家系统、自然语言理解、自动定理证明、自动编程、机器人技术、模式识别、场景分析、数据库的智能检索、机器象棋(本质上是博弈论问题)和智能家用电器等方面都有着广泛的应用。 而这个话题和人工智能中的博弈论领域紧密相关。
本课题的核心是人工智能与编程,另外人工智能的游戏部分用到了大量搜索算法,很多算法应用在各个方面,其概念、方法和技术正在广泛渗透到各行各业,智能化已经成为当今各类新产品、新设备的发展方向,因此借此机会了解、研究、学习人工智能中比较容易实现的人机博弈也是非常实际和必要的。
1.3 研究方法
在设计游戏之前,首先要决定的问题是,使用什么开发环境来编写环境?虽然我熟悉 Java 语言,但在实际开发项目中经验很少,所以我决定使用它,它具有突出的语法编辑、使用向导和完全自定义的用户界面。最重要的是它可以自动在 Main 方法或 Html 文件中查找文件以支持 Java 小程序,然后启动相应的工具。
其次确定整个程序的结构框架。由于运行速度慢,如果加上算法搜索的时间,显然不符合程序的设计要求,所以决定用Java应用程序开发。整个程序的功能实现过程如下:网络对战涉及的算法比较少,所以先实现网络部分,实现基本的棋盘和棋子类,增加胜负条件,这是基础,也是很重要的。计算机AI也是在这些基础上增加的。本课题的两个功能包括计算机AI和胜负条件两个重要的算法。胜负条件不需要太多的计算,有固定的规律,难点是人工智能,可以说人工智能的好坏决定了本课题完成的深度。所以大部分时间都花在了AI算法的研究和改进上。我对算法了解不多,研究了一些国内的五子棋算法,参考了一些游戏设计算法,详细比较了各种算法的优缺点,参考了现代五子棋比赛的各种规则和技巧。 尝试联系现实,努力提高计算机AI。
2. 学科相关基础
2.1 五子棋
2.1.1 棋盘和棋子
经过国际象棋联合会的多次修改,现代五子棋棋盘最终定为15×15线,即棋盘由15条互相交叉的平行线组成,共有225个交叉点;棋盘上有五个星位,中间的星位称为天元,四周四个点为小星,与围棋棋盘略有不同。见图1
。
图1 棋盘
五子棋棋子与围棋相同,有黑、白两种颜色,棋子形状一般为一、二面凸起的松散圆形,一副棋子共有225个棋子,其中黑棋113个,白棋112个。
关于时间,常规比赛对不同等级设置了不同的时间限制,但普通选手没有这个限制。
2.1.2 规则和解释
1:黑棋先行,白棋后行,从天元开始依次下棋。
2:最先在棋盘上横、直、斜排列出五个连续的同色棋子的一方获胜。
3:黑棋若下禁手则输,而白棋没有禁手。黑棋的禁手包括“三三”、“四四”和“长跑”。黑棋只有用“四三”才能获胜。
4:若没有获胜者,比赛视为平局。
5:若拔出棋子或者退出游戏则视为失败。
6:若同时形成五步连棋和一个禁棋,则最先达到五步的一方获胜。
7:黑方形成禁手时,白方应立即指出,若白方没有找到禁手或找到禁手后没有立即指出,而是继续下棋,则不能判黑方输。
五子棋是两人在棋盘上进行的竞技运动。游戏开始时,黑方先在“天元”上放置一枚棋子,白方则在黑棋周围的交叉点上放置一枚棋子。双方轮流放置棋子,直到一方在棋盘的直线上、横线上或对角线上形成五枚或五枚以上连成一线,该方即获胜。但五子棋的特点是先手的一方具有很大的优势,因此在专业比赛中对黑方施加各种限制,以利于公平竞争。黑白方胜负必须按照专业五子棋的规则来决定。
2.1.3 五子棋常用术语
二:二是五子棋一切攻击的基础,分为活二、死二。
活二:即下一步可以形成活二或三,参见图2。
死二:即下一步可以形成死三的二,见图3。
三:三是五子棋中最常见的攻击方式。三分为活三、死三、卧三。
活三:再走一步就能变成活四的三步(见下文活四的介绍)。或者三步可以是连续三步或跳过三步。见图 4。
我们通常说的“三”,就是活三,如果是死三,就会特别指出。
死三:对手有三枚棋子防守同一条线上的相邻交叉点;死三有三种类型。参见图 5。
睡三:是死三的一个特点,由于没有对方棋子防守相邻点,所以看上去像活三,但由于空间限制,无论怎么发展都不能称为活四,所以叫“睡三”。见图5。
防三:防三不是指“三”字形,而是指在使自己活三的同时,阻止对方进攻的反击,这就叫防三。
四:四的形状有三种,可分为:活四、冲四、跳冲四。
活四:四块相同颜色的棋子连接在同一条线上,即为“五连胜”,如图6所示。
四连棋:四颗同色棋子连在同一条线上,与活四不同,一端被对方棋子挡住,只有另一端移动才能形成“五连棋”。
跳四:其形状在“四子”中比较特殊,一般分为两种。其特点是同一颜色的四颗棋子在同一条线上,其中有一两颗棋子与其余三两颗棋子之间有交叉点。其下一步棋只有放在间隔的交叉点上才能形成“五连棋”。因此,对方棋子防守时,只能在间隔的交叉点处进行格挡,如图7所示。
如图八,黑棋在1号点进攻,取得了双杀。此时白棋的高明之处在于在a点做了三步,阻断了黑棋的两步取胜之道。当黑棋还在c点跳做四步时,白棋在b点阻断了黑棋的四步,形成了反四步,使黑棋的进攻落空。
一招双杀:是指使用同一招法,同时创造两个制胜点。
追胜:是指迫使黑棋形成禁手来获胜的手段。
免费赢:除了追赶获胜之外的获胜方式称为免费赢。
禁手():指黑棋放置棋子时,形成两个或两个以上的活三、四或长连棋形。是比赛中禁止对黑棋使用的战术,或判为输的下棋手段,见图15。白棋没有禁手。如果黑棋放置关键的第五子,即形成五连棋,同时形成禁手,则由于黑棋已经形成五连棋,禁手无效,黑棋获胜。之所以有此规定,是为了规范比赛。其实对于业余棋手来说,谁先下黑棋、谁先下白棋并没有什么限制,但是谁先下,谁的优势就大,对方就一直处于被动防守状态。所以先下棋的一方会有禁手,这是一种维护公平的手段。 不过,虽然专业五子棋已经对黑棋采取了这种限制,但先手棋手的优势还是很大的。高水平的比赛中也增加了一些规则,但由于很少使用,因此就没有必要详细描述了。
如图9所示,A、B、C中的x点为三三禁手,D、E中的x点为四四禁手,F中的x点为长链禁手。
长线:六个或更多连续的相同颜色的棋子。
2.1.4 五子棋攻防
五子棋是一项竞技性极强的运动,开局之后就变成了双方争夺主动权的肉搏战,任何一方都不能掉以轻心,必须尽量少犯错误,甚至不犯任何错误,否则就会很快落败。
众所周知,要想连赢五子,就必须连赢五子,有四子可以连赢五子,有三子可以连赢四子,以此类推。所以,五子棋的攻守,都是从争夺“二”和“三”开始的。“好的开始是成功的一半”,这句话用在五子棋上再合适不过了。
五子棋中的点位选择非常重要,五子棋其实就是选择最好的点位,按照正确的顺序摆放棋子,一步步占领每个点位,最终获得胜利。
在游戏前期,选点的重点是保持本方棋子连成一片,创造尽可能多的后手三四子机会,尽可能限制对方好阵型。在五子棋过程中,可以通过移动棋子来控制对方的落点,比如三四三步的应手点是可以预判的,通过不断的先手,完全可以控制对方的走子直至取胜。因此在游戏后期,需要在计算准确的前提下,尽早发动进攻,取得对局的掌控权,否则错失机会,对方先手发动进攻,玩家就会成为被控制的一方。
当有多个进攻点可供选择时,应选择后续选项多且不会被对方反击的点。如果是黑方,还应特别注意进攻最后被对方反击时出现各种禁点的可能性。
进攻分为单攻棋和双攻棋。单攻棋是指在单行或单方向进攻棋子,包括三子攻棋(活三、补四)和四子攻棋(冲四、补五)。双攻棋是指在两个方向或两行进攻棋子,包括三三攻棋(双活三、双补四、补四活三);四三攻棋(冲四活三、冲四补四、补五活三、补五补四);四四攻棋(双冲四、双补五、补五冲四)。
五子棋的制胜策略是从一枚棋子开始,目标是用各种方法在棋盘上展开五枚甚至长条棋子来取胜。在这个展开过程中,需要经历一枚到二枚、二枚到三枚、三枚到四枚的过程。因此,熟悉各种形状和方面的第二、三、四枚棋子结构,并能举一反三,是学习五子棋的基本功,也是能灵活运用五种制胜技巧的基础。
3 Java
3.1 Java 简介
Java 是美国 Sun 公司开发的一种语言,它使用解释器来执行代码,因此可以在不同的计算机上运行,而不需要对源代码做任何修改,是一种真正跨平台的编程开发语言。
Java具有以下主要特点:
1:简单()
开发 Java 的原则之一是创建一个结构简单、易于使用的系统,以便用户无需接受深入培训即可开始设计程序。因此,Java 的语法尽可能与许多程序员目前使用的 C 和 C++ 语言相似。此外,Java 删除了许多很少使用、难以理解或经常混淆的 C 和 C++ 特性,例如多重继承和指针。
2:面向对象(-)
面向对象是近年来在信息产业中被广泛应用的概念和技术,它具有很多优良特性,对象封装可以使对象的接口定义清晰;继承可以增加软件的复用性,有助于分类和模板设计。实现面向对象的概念及其各种优良特性是Java的设计理念之一。
3:分布式()
计算机网络的发展使得信息应用走向了分布式环境,因此现代信息开发语言和环境必须具备分布式的特性和功能。Java具有网络函数库,其中包括与HTTP、FTP等TCP/IP网络通信协议集成的能力。
4:稳健性()
用 Java 编写的程序必须能够在各种情况下运行,并且必须具有很高的稳定性。Java 设计了防止内存被覆盖和数据被破坏的机制。
5:安全性()
Java是为在网络和分布式环境中使用而设计的,因此安全性是一个非常重要的考虑因素。Java有多种从简单到复杂的安全保护措施,可以有效地防止病毒入侵和破坏行为。
6:结构中性()
互联网上有许多不同类型的计算机,从中央处理器到操作系统的结构都有很大差异。因此,让应用程序在每台机器上运行是相当困难的。为此,Java 编译器可以生成一种结构中立的目标代码文件格式 - 字节码。这种字节码可以在许多不同的计算机上运行。
7:多线程()
多线程是开发复杂、功能强大的程序的必要手段之一,Java也支持这一重要功能。
Java程序的开发流程如图10所示。
图10 Java程序开发流程
源文件:使用文本编辑器(例如Edit或)编写源文件。不要使用Word编辑器,因为其中包含不可见字符。保存编辑后的源文件。源文件的扩展名必须是Java。
编译器:源文件必须经过编译器(.exe)的编译,生成扩展名为.的字节码文件。字节码文件是由与平台无关的二进制代码组成,执行时由解释器解释为本地机器码。
运行Java程序:Java程序分为Java应用程序()和Java小程序()两大类。Java应用程序必须经过Java解释器(java.exe)解释执行;Java小程序则可由支持Java标准的浏览器解释执行。
3.2 Java开发环境
忽略
4 具体研究方法
4.1 程序结构说明
由于是Java,为了实现网络战斗,所以采用C/S模式编写,程序内含有7个独立的类文件——.java、.java、.java、.java、.java、.java、.java。
.java主要负责初始化棋盘、处理鼠标事件、判断胜负条件等。.java定义了面板上的其他元素,包括玩家列表、标题栏等,还包括事件处理、人工智能等。.java负责处理网络对战。其他类都是从这三个主要类中扩展出来的,它们的功能将在具体实现中介绍,见图13。
4.2 棋盘和棋子类
4.2.1 棋盘
棋盘如图1所示,具体代码如下:
String line = "a b c d e f g h i j k l m n o"; char [] rowNum1 = {'1','2','3','4','5','6','7','8','9'}; char [] rowNum2={'1','0','1','1','1','2','1','3','1','4','1','5'}; 这部分为棋盘的边界标识符,是必须要有的。用字符数组存储,最后确定位置放上去即可。 棋盘的绘制: private static int xp; // 棋子 X坐标 private static int yp; // 棋子Y坐标 public void paint(Graphics gc){ super.paint(gc); //this.setBackground(Color.gray); //this.invalidate(); gc.setColor(Color.blue); //gc.setColor(new Color(255, 255, 240)); //画横向标识符 gc.drawString(line,25,15); // 画竖向标识符 for(int i=0;i<9;i++){ gc.drawChars(rowNum1,i,1,10,35+i*30); } for(int i=9,j=0;i<15;i++,j+=2){ gc.drawChars(rowNum2,j,2,10,35+i*30); } // 画棋盘 for (int i = 0; i < 15; i++) { gc.drawLine(30, 30 + i * 30, 450, 30 + i * 30); //行 gc.drawLine(30 + i * 30, 30, 30 + i * 30, 450); //列 } gc.drawLine(25, 25, 455, 25); gc.drawLine(25, 25, 25, 455); gc.drawLine(25, 455, 455, 455); gc.drawLine(455, 25, 455, 455); //面板初始化 for(int i=0;i<15;i++){ for (int j = 0; j < 15; j++) { xp=16+i*30; yp=16+j*30; if (board[i][j] == 1){ gc.setColor(Color.black); gc.fillOval(xp,yp,28,28); //gc.drawImage(black, 16 + i * 30, 16 + j * 30, this); } if (board[i][j] == 2){ gc.setColor(Color.white); gc.fillOval(xp,yp,28,28); //gc.drawImage(white, 16 + i * 30, 16 + j * 30, this); } } } }
4.2.2 棋子
确定下一个棋子的坐标(xp,yp),并画一个特定大小的椭圆,这里的坐标指的是棋子相对于棋盘的绝对坐标。
private static int xp; // 棋子 X坐标 private static int yp; // 棋子Y坐标 if(col==1) g.setColor(Color.black); else g.setColor(Color.white); g.fillOval(xp,yp,10,28,28);
4.3 胜利与失败条件
需要判断四个方向,横的,竖的,还有两个对角线。思路比较简单,五个同色棋子连成一线就是赢。有网友评论说完整的胜负条件就是五连成和四活,我觉得完全没必要,四活还需要检查两边的棋子,虽然计算量不大,但是五子棋的标准就是五连成一线就是赢,差了一步而已,我们要遵守规则,精简代码,才能实现完整的功能。
我们需要事先建立一个棋盘数组[ ][ ],也就是棋盘格局表,数组每个元素对应棋盘上的一个交点,'0'代表空位,'1'代表黑棋子,'2'代表白棋子。由于代码太多,下面给出判断胜负的通用函数,以坐标(x,y)为中心的9X9的矩形,只能在棋盘内部,如果超出棋盘,就要另行考虑。下面的代码是一般情况,当整个矩形都在棋盘内部时,胜负的判断条件如图14所示。
X方向的代码如下:
protected boolean judge(int x,int y,int clr){ int i=0,j=0,count=0; // x方向 for(i=0,count=0;x-i>=0&&i<5;i++){ if (clr==board[x-i][y]){ count++; } else{ break; } // System.out.println("( "+x+" , "+y+" )"+"count = "+count); if(count==5) return true; } for(i=1;x+i<15&&i<5;i++){ if(clr==board[x+i][y]){ count++; }else{ break; } if(count==5) return true; } return false; }
为了保证公平,第一个出场的玩家有禁令。不过我们一般没有这个规则限制,大家轮流先出场。理论上确实如此。不过很多专家都表明,第一个出场的玩家获胜的几率很高。即使有禁令,第一个出场的玩家仍然有很大的优势。我觉得对于我们这样的普通玩家来说,这些规则可以无视。
不管是单机游戏,还是玩家之间的对局,服务器都是必须要开启的,因为胜负就在里面决定,一方获胜就会弹出提示框,确认的话就清空棋盘,继续新的一局游戏。
public void getVictory(Message msg){ JOptionPane.showMessageDialog(null, "You Win The Game", "Congratulations", JOptionPane.INFORMATION_MESSAGE); //继续新游戏 label3.setText("Player2"); newGame(); }
需要注意的是,如果落下的棋子距离任意一方的边界小于 4,边界将作为限制条件,决定一方是否获胜。这种情况下必须考虑多个方向,但原理与基本情况相同。
4.4 网络对战
这部分也是网络编程的经典应用,根据服务器地址连接特定端口。
网络部分很简单,但是我也做了自己的特色,也就是事件处理,做工可以根据具体情况修改,虽然没有太大的实用价值,但也尽量让程序具有可扩展性。下面给出代码。
/** * 消息列表 * type = 1 // 请求连接, msg = 连接者名字 * type = 2 // 放棋子 * type = 3 // 请求和其他人游戏 * type = 4 // 拒绝游戏请求 * type = 5 // 同意请求 * type = 6 // 发送胜利消息 * type = 7 // 断开连接请求 * type = 8 // 保存游戏,但是不放在磁盘上,在下一局开始时将会丢失 * type = 9 // 添加新的玩家到所有客户端的玩家列表 * type = 10// 响应信息 type ==1 * type = 11// 和玩家游戏,msg 保存玩家的名字 ,创建游戏的玩家设置游戏 * type = 12//信息设置 * type = 13// 设置玩家颜色 * type = 14// msg= 接受请求的一方设置 * type = 15// 服务端更新信息 * type = 16// 发送控制或错误信息 * type = 17// 游戏失败 * type = 18// 服务端套接字关闭 * type = 19// 玩家结束游戏及更新 * tyep = 20// 电脑获胜/ 玩家获胜 */
监听端口,若有玩家则更新玩家列表,若双击自己以外的玩家则可开始游戏,发送游戏请求,若同意则返回棋子颜色并开始游戏,清空玩家列表。每次都发送坐标到服务器,两端显示,并判定胜负,若有一方获胜则提示信息通知双方,若确认则继续开始新一局游戏。
服务器启动服务监听线程和客户端,如图15所示。如果玩家知道服务器IP地址,就可以选择在线的玩家进行在线游戏,如图16所示。
双击自己以外的玩家发出游戏请求,同时判断己方棋子的颜色,使用MSG回传给服务器,若被拒绝则返回原状态。
if(msg.color==1){ ss = new String("white"); bpanel.setColor(2); } else{ ss = new String("black"); bpanel.setColor(1); }
4.5 计算机人工智能
广义的博弈是指在一定的环境条件和一定的规则下,依靠自己所能掌握的信息,选择并实施自己选择的行为或策略,并从中获取相应的结果或收益的过程。约翰·冯·诺依曼(1903-1957)和摩根斯坦(1902-1977)在1944年出版的《博弈论与经济行为》一书中首次提出了博弈论的概念。但对于非合作、纯竞争的博弈,诺依曼只解决了二人的零和博弈。这里抽象出来的博弈问题是,参与者集合(两方)、策略集合(所有棋步)、收益集合(胜负)已知,最终目的是寻找一个理论上的解或平衡点,即对双方来说最合理、最优的具体策略。
狭义的博弈论主要研究棋手走棋的合理性和逻辑性,并将其系统化为一门科学。换言之,博弈论是研究个体在复杂的互动中如何得出最合理的策略。博弈论源于象棋、扑克等古老的游戏或游戏。数学家通过建立自成体系的逻辑框架和体系,将具体问题抽象出来,研究其规律和变化。
我提到了许多算法,其中大多数都有类似的想法,即搜索估值以确定重要性,然后选择最大的方法来进行动作:为每个计算机创建一个表格,以存储国际象棋数据,例如“ 20”,例如“匆忙四”和“ ”。根据20> 15,我想考虑到“四个方向”,因为在这里,计算机会自动选择“四个方向”尽管进攻和防守同样重要,但我认为防御更为重要。
评估棋子的法律位置必须大不相同。在一些国际象棋和国际象棋等国际象棋中,情况有点复杂。
设置重要性,即估值模块。
private void setWeight(int x,int y,int tcolor){ int i=RectX1,j=RectY1,value=0,k=0,n=0,flag=0; // '--' 方向 for(i=RectX1,j=y;i<=RectX2;i++){ if(BoardPanel.board[i][j]!=0){ continue; } value=0;flag=0; for(k=1;i-k>=RectX1 && k<5;k++){ if(BoardPanel.board[i-k][j]==tcolor){ value++; continue; } if(BoardPanel.board[i-k][j]==0){//black space flag++; break; } } for(k=1;i+k<RectX2 && k<5;k++){ if(BoardPanel.board[i+k][j]==tcolor){ value++; } if(BoardPanel.board[i+k][j]==0){ flag++; break; } } n=weight(value,flag); if(weightBoard[i][j]<n){ weightBoard[i][j]=n; } } }
设定相应空位的重要值以后,选取最大的值下子,代码如下:
private void getBiggest(int [][] arr,int x,int y){ int [] temp=new int[2]; int swt=arr[0][0],tmp=0; for(int i=0;i<15;i++){ for(int j=0;j<15;j++){ if(arr[i][j]>swt){ temp[0]=i;temp[1]=j; swt=arr[i][j]; } } } x=temp[0]; y=temp[1]; arr[x][y]=0; }
对于特定的国际象棋模式,有不同的估值来区分不同的国际象棋模式,并确定最终的位置,毫无疑问,可以将四个部分置于一条线上,并且可以继续进行三件球,这是只有三个阵列的情况,或者首先要判断这一情况。设置高。
为不同的国际象棋图案设定重要值,例如:活四,四人,活三,三人,三,二,死亡。
同样,就像判断结果一样,我们还需要考虑边界的特殊情况。
private void setRect(int x,int y){ if(x-4>0) RectX1=x-4; else RectX1=0; if(x+4>14) RectX2=14; else RectX2=x+4; if(y-4>0) RectY1=y-4; else RectY1=0; if(y+4>14) RectY2=14; else RectY2=y+4; if(RectX1>RectY1) RectX1 = x-(y-RectY1); else RectY1 = y-(x-RectX1); if(RectX2>RectY2) RectY2 = y+(RectX2-x); else RectX2 = x+(RectY2-y); }
改善AI的努力一直是游戏的关键。首先,您的大部分时间都会花在防御上。
目前有两种方法可以提高计算机的能力:一个是递归的算法,另一个是我在算法中缺乏的详细判断。在这里,它将形成一个象棋模式,例如:“匆忙四人”,“活着的三个”;然后,对手会根据您的想法来捍卫您的想法,而预测的第一步目前将完成董事会分析模块。可以预测多个步骤。 如果对手必须在董事会上进行防守,那么您必须考虑与对手的位置,然后使用上述方法来预测对手的国际象棋,这对于防御和攻击很重要。但是,如果每个计算机AI都可以改进,则可以改进计算机AI。
关于计算机的学习,这是一个无法通过算法来实现的,但它在国际象棋中非常有用,但是在游戏结束后,它仍然是一些理论上的事物,并在自己的国际象棋数据库中设置了相关的记忆。非常相似的情况(或同样的国际象棋比赛情况),但不会认识到类似的国际象棋比赛情况。
综上所述
通过此主题,我意识到与Java的人工智能和在线游戏。
其中,人工智能使用大量的搜索算法,其中许多方面都在各种概念中使用。
参考
[1] Geng , 。 Java 2实践教程(第二版)。 北京:大学出版社,2004.2。
[2]李·苏伊(Li Suyi)。
[3] 技术。
[4] Xu Li,Sun Ji'an。
[5]中国艺术经典。
[6] Peng ,Na Wei。 戈邦简介。 北京:金盾出版社。 1997.6。
致谢
忽略
5.资源下载
该项目的源代码和完整的纸张如下。
序列号毕业项目全套资源(单击以下载)
该项目的源代码
基于Java+AI(源代码+文档) Game.zip的 Game的设计和实现