Java游戏直棋(二)

本部分为电脑的人工智能。

为了加快AI的计算速度,必须对前面的设计进行少量的修改,并最终向VC平台转移。在用VC实现的游戏中,棋盘将采用BitBoard技术,棋子的显示将彻底和逻辑分开。目前JAVA版本仍然采用数组表示棋盘,主要是便于逻辑分析和设计。

先对第一个AI进行总结。FirstAI:

package nicholas.game.chess;

class FirstAI extends ChessPlayer {

private ChessModel model[][][];
private StepStack stack;
private Step step;
private int layer;
private int turn;
protected GameRule gameRule;

public FirstAI(int t) {
super(false);
stack = new StepStack();
layer = 7;
// layer = 3;
turn = t;
}

public String getName() {
return "ColinRobot";
}

public Step getNextStep(ChessModel m[][][]) {
//algo
model = m;
System.out.println("max="+getLayerValue(0));
stack.removeAll();
return step;
}

//get largest value
private int getLayerValue(int lay) {
if(lay>layer) {
//no recursion
return -1*getModelValue();
}
int value = 0;
int max = -2000;
int decision;
for(int z=0;z<3;z++) {
for(int y=0;y<3;y++) {
for(int x=0;x<3;x++) {
if((x==1&&y==1)||model[z][y][x].isOccupied()) continue;
//assume lay chessman here
model[z][y][x].acceptChessman(Chessman.CHESS[(turn+lay)%2]);
decision = gameRule.checkStep(model[z][y][x], model);
switch(decision) {
case 0://win
stack.add(new Step(model[z][y][x],decision));
value = 1000;
break;
case 3://tiaodan|gan
gameRule.checkDecision(model[z][y][x],1,model);
stack.add(new Step(model[z][y][x],1));
value = 660;
/* value = -1*getLayerValue(lay+1);
//roll back
gameRule.undoStep(stack.remove(),model);
model[z][y][x].acceptChessman(Chessman.CHESS[(turn+lay)%2]);
//another
gameRule.checkDecision(model[z][y][x],2,model);
stack.add(new Step(model[z][y][x],2));
int b = -1*getLayerValue(lay+1);
//choose better
if(value<b) {
value = b;
} else {
//roll back
gameRule.undoStep(stack.remove(),model);
model[z][y][x].acceptChessman(Chessman.CHESS[(turn+lay)%2]);
//redo first
gameRule.checkDecision(model[z][y][x],1,model);
stack.add(new Step(model[z][y][x],1));
}
*/ break;
case 1://tiaodan
stack.add(new Step(model[z][y][x],decision));
value = 660;
break;
case 2://gan
stack.add(new Step(model[z][y][x],decision));
value = 320;
break;
default://tiaodan,gan,none
stack.add(new Step(model[z][y][x],decision));
value = -1*getLayerValue(lay+1);
}
if(value>max) {
max = value;
if(lay==0) {
//first layer, save step
System.out.println("max="+max);
step = stack.getTop();
}
}
//remove chessman
gameRule.undoStep(stack.remove(),model);
if(max==1000) return max;
}
}
}
return max;
}

private int getModelValue() {
return 3;
}

public void setGameRule(GameRule rule) {
gameRule = rule;
}
}

FirstAI直接继承ChessPlayer,以后将转为间接继承。采用最大最小深度优先搜索,结束对某分支(仅当前层次)的搜索的两个条件为:A.该层次玩家赢。B.最深搜索层次。最深搜索层次时将返回对局面的评估值(未设计,一律返回3,表示落子得3分。)。

后面的设计,除BitBoard实现棋盘外需要考虑几个问题:
1)搜索的层次。针对第一步着法,强制去除部分无关分支(x+y>2),再将搜索层次设置为7,即可得到正确的着法。因此估计最大的搜索层次设置为7即可。
2)算法的改进。即使搜索层次仅为7,计算一步也要考虑46亿种可能性,假设每种可能性需要60次运算,以我的本本的配置需要三分钟。是否设计开局库(计算表明部分落子仅有唯一应手);另外将考虑采取其它的搜索技巧;破直将有额外的奖励(局面值>3);考虑可杠可单时,单是否一定比杠有利。
3)局面的估值。比较复杂,考虑中。

时间: 2024-08-21 13:09:08

Java游戏直棋(二)的相关文章

Java游戏编程初步

编程 现在流行的游戏似乎都是用C或C++来开发的.在java平台上几乎没有很大型及可玩的流行游戏.由于java是个新生语言,他的许多特性还有待大家的发掘,但是我们不能否认Java在游戏编程方面的强大性.本文将带领大家一步一步学习编写Java游戏.最终打造属于自己的Java游戏. 在开始之前我们得确认你已经安装了Java JDK,并已经安装了浏览器软件如IE.本章是以Internet为开发对象,一步一步教大家认识Java的Thread.Applets-.以及游戏编程要注意的一些方方面面并在每一小部

Java游戏开发中应始终坚持的10项基本原则

关于文章中涉及的两个杜撰概念: 一.绘图器:众所周知,Java GUI以paint进行绘图,以repaint进行图像刷新,而完成repaint及paint这一连贯过程中所用到绘图组件,我将其称为绘图器.就我个人的体会,绘图器的调用时机应始终处于repaint之后paint之前,即通过repaint触发刷新后执行,当其中的具体逻辑完成其对应的图像绘制后,再通过统一接口将其图像插入paint中,为了匹配需要,绘图器应始终以接口方式实现. 二.监听器:这里所说的监听器,并不是特指某个Listener组

求教 能用代码操作java游戏吗?

问题描述 KEmulator模拟器玩java游戏(jar包),键盘按键:上下左右abcd之类在不开KEmulator模拟器的情况下,是否可以写代码执行,实现和在KEmulator模拟器上一样的操作么?例如:模拟器里,人物在坐标0,0:按4下方向键"↑",人物来到0,4:能否不开模拟器用代码实现这个操作? 解决方案 解决方案二:一定能,模拟器就是用代码实现的,你可以用代码模拟模拟器去实现!解决方案三:JAVA手机游戏模拟器KEmulator,已有好多现成的,你搜索下就有如果你要自己的代码

JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片

JAVA之旅(二十六)--装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片 一.装饰设计模式 其实我们自定义readLine就是一种装饰模式 当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,并且提供加强功能,那么自定义的该类就称为装饰类 package com.lgl.hellojava; public class HelloJJAVA { public static void main(S

彩梦科技叶风良:海外运营商仍以JAVA游戏为主

彩梦科技CEO 叶风良 和讯科技消息 第八届全球http://www.aliyun.com/zixun/aggregation/6826.html">移动游戏及渠道大会于4月10日在北京召开,本次大会将以"干货与签约"为主题.彩梦科技CEO叶风良表示,目前海外很多产品还不见得是安卓或者iOS,好多运营商都还是JAVA游戏状态,而且市场容量不会太小. 以下为叶风良演讲实录: 大家好,我是彩梦的叶风良.可能很多同行不认识我. 我今天给大家讲三个部分: 一,公司的介绍. 二,

java 游戏API--

最近听说游戏表面上比较火热,也看看有没有机会也进入这个行业混混,说白了,穷人就是为了钱. 本人对游戏技术不甚了解,没有学过计算机图形学,不懂3dmax,不会用photoshop,等等.技术上只是比较熟悉 java语言,^_^,啥也不懂,还想搞游戏,是不是非常可笑! 怎么办?我又不是非要搞,学学,总行吧? 搞了几年java,不用再去弄c了吧.除了手机游戏之外,国内基本上没有听说用java做其它什么大一点的游戏的. 基本上没有什么资料. 看了看sun的网站,竟然有做游戏的api,java3d可以不说

Java与XML(二)用java编写xml的读写程序

xml|程序 Java与XML(二)用java编写xml的读写程序 这是读取xml文件的java程序,我调试好的.采用的是dom方式读取xml文件到Vector中.package src;import java.io.*;import java.util.Vector;import javax.xml.parsers.*;import org.w3c.dom.*;public class readxml { static Document document; private boolean va

YY语音游戏直充怎么充

  YY语音游戏直充怎么充?YY充值中心自动给用户的游戏账号进行充值,无需卡密,付款成功后20分钟内自动充值到游戏账户,安全方便又快捷,支持多款热门游戏 如何进行游戏充值? 第一步:选择你要充值的游戏名称 您可以通过游戏所属的公司分类.游戏名称首字母的拼音分类,选择您要充值的游戏.或鼠标左键点击输入框,输入字母.拼音或汉字,即会有相应的游戏供您选择; 第二步:填写游戏的充值信息 选择填写游戏的充值信息,比如游戏帐号.游戏区服.充值数量等,确保充值信息正确填写后点击立即充值. 第三步:付款 选择使

如何使用java调用bartender打印二维码

问题描述 如何使用java调用bartender打印二维码 使用就JAVA代码去调用bartender打印一个二维码,代码应该怎么写,是不是生成一个批处理文件在调用呢 解决方案 你的意思是调用执行bartender这个软件吗?如果是,就使用exec执行http://blog.csdn.net/yy6060/article/details/6311920