人机博弈之(六)------代码实现(3)搜索引擎

原创 2007年09月23日 16:20:00
package searchengine;

import chessmovedata.ChessMoveData;
import constdata.ConstData;
import movegenerator.MoveGenerator;
import eveluation.Eveluation;


public class SearchEngine
{    //表示棋盘棋的分布
    public     byte m_curPosition[][] = new byte[10][9];
    
//记录最佳走棋
    public ChessMoveData m_bestMove = new ChessMoveData();
    
//走法产生七器
    public MoveGenerator m_moveGen = new MoveGenerator();
    
//估值产生器
    public Eveluation m_eve = new Eveluation();
    
//搜索深度
    public int m_searchDepth;
    
//当前搜索深度
    public int m_maxDepth;
    
    
public  void searchAgoodMove(byte position[][]){}
    
//移动棋子
    public byte makeMove(ChessMoveData data)
    
{
        
byte chessID;
        chessID 
= m_curPosition[data.to.y][data.to.x];
        m_curPosition[data.to.y][data.to.x] 
= m_curPosition[data.from.y][data.from.x];
        m_curPosition[data.from.y][data.from.x] 
= ConstData.NOCHESS;
        
        
return chessID;
    }

    
//取消移动
    public void unMakeMove(ChessMoveData move, byte chessID)
    
{
        m_curPosition[move.from.y][move.from.x] 
= m_curPosition[move.to.y][move.to.x];
        m_curPosition[move.to.y][move.to.x] 
= chessID;
    }

    
    
//判断游戏时候结束
    public int isGameOve(byte position[][], int depth)
    
{
        
int i, j;
        
boolean redLive = false, blackLive = false;
        
        
for(i = 0; i < 3++i)
            
for(j = 3; j < 6++j)
            
{
                
if(position[i][j] == ConstData.B_KING)
                    blackLive 
= true;
                
if(position[i][j] == ConstData.R_KING)
                    redLive 
= true;
            }

        
        
for(i = 7; i < 10++i)
            
for(j = 3; j < 6++j)
            
{
                
if(position[i][j] == ConstData.B_KING)
                    blackLive 
= true;
                
if(position[i][j] == ConstData.R_KING)
                    redLive 
= true;
            }

        
        i 
= (m_maxDepth - depth + 1 )%2;//取当前奇偶标志
        
        
if(!redLive)//红将不在了
        {
            
if(i != 0)
                
return 19990 + depth;
            
else 
                
return -19990-depth;
        }

        
        
if(!blackLive)
            
if(0 != i)
                
return -19990-depth;
            
else
                
return 19990+depth;
        
        
return 0;//两将都在,返回0
    }

    
    
    
}

上面是通用的搜索引擎,可以通过继承他,改写此函数

public  void searchAgoodMove(byte position[][]){} 

来实现具体的搜索。下面是负极大值搜索算法:

 

package negamaxEngine;

import searchengine.SearchEngine;

public class NegamaxEngine extends SearchEngine
{
    
//对传入的position状态找出一步最佳的走法
    public  void searchAgoodMove(byte position[][])
    
{System.out.println("search.......");
        m_maxDepth 
= m_searchDepth;
        
int i, j;
        
for(i = 0; i < 10++i)
            
for(j = 0; j < 9++j)
                m_curPosition[i][j] 
= position[i][j];
        
        negaMax(m_maxDepth);
        makeMove(m_bestMove);
        
        
for(i = 0; i < 10++i)
            
for(j = 0; j < 9++j)
                position[i][j] 
= m_curPosition[i][j];
    }

    
//负极大值搜索引擎
    public int negaMax(int depth)
    
{
        
int current = -20000;
        
int score = 0;
        
int count = 0 , i;
        
byte type;
        
        i 
= isGameOve(m_curPosition, depth);
        
if(i != 0)//不等于0表示某方的王不存在了,直接返回
        {
            
return i;
        }

        
boolean side;
        
if((m_maxDepth-depth)%2 == 1) side = true;
        
else side = false;
        
//搜索到叶子节点,返回估值信息
        if(depth <= 0)
            
return m_eve.eveluation(m_curPosition, side);
        
//生产所有可能的走法,
        count = m_moveGen.createPossibleMove(m_curPosition, depth, side);
        
        
for(i = 0; i < count ; ++i)
        
{    //尝试每种走法
            type = makeMove(m_moveGen.moveList[depth][i]);
            
//返回此种走法的估值分数
            score = -negaMax(depth-1);
            
//取消上次走法
            unMakeMove(m_moveGen.moveList[depth][i], type);
            
//若当前走法更优,则记录下来
            if(score > current)
            
{
                current 
= score;
                
//如果到了根节点
                if(depth == m_maxDepth)
                
{//记录最优的走棋,把它保存到m_bestMove中
                    m_bestMove = m_moveGen.moveList[depth][i];
                }

            }

        }

        
return current;
    }

}

相关文章推荐

#牛客#代码实现:字符串的匹配、字符串的交错组成、纸牌博弈、表达式组合

第一题:字符串与含有通用字符.*的字符串匹配问题 /*Problem:字符串匹配问题 给定字符串str,其中绝对不含有字符’.’和’*’。再给定字符串exp,其中可以含有’.’或’*’,’*’字符不能...

用Java实现五子棋人机博弈

  • 2010年01月08日 20:11
  • 466KB
  • 下载

传奇3(G) 国际服 地图 显示 C#代码实现(地表草皮显示基本没有问题,但地面对象显示混乱)

 using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropService...

+【CSS3】使用纯css代码实现图片轮播效果

使用纯CSS3代码实现简单的图片轮播。 1.基本布局: 将5张图片左浮动横向并排放入一个div容器(#photos)内,图片设置统一尺寸,div宽度设置5个图片的总尺寸,然后放入相框容器div(#f...
  • rtian001
  • rtian001
  • 2015年09月15日 20:58
  • 37585

Android应用开发--MP3音乐播放器代码实现(二)

------- android培训、java培训、期待与您交流! ----------   2013年5月25日 简、美音乐播放器开发 小巫在这里罗列这个播放器已经实现的功能: 1.   ...

Android应用开发--MP3音乐播放器代码实现(一)

Android应用开发--MP3音乐播放器代码实现(一) 需求1:将内存卡中的MP3音乐读取出来并显示到列表当中 1.   从数据库中查询所有音乐数据,保存到List集合当中,List当中...
  • wwj_748
  • wwj_748
  • 2013年05月08日 19:56
  • 139377

算法学习与代码实现3——合并排序

合并排序的解释与c语言代码实现

Java c3p0 oracle 数据库连接池 代码实现

编译及运行环境:winxp+jdk5.0+eclipse3.2+oracle9i 所需jar包:     oracle9.jar(oralce驱动器)     c3p0-0.9.1.2.jar ...

决策树学习 之 ID3 C++STL代码实现

很久没写含这么多stl的程序了,很故意的用set,map,vector,熟手一下。 也记录一下吧,虽然写得比较渣。 三个文件: 测试数据:data.txt [plain] ...

Java JVM 3:垃圾收集算法 - 复制算法(伪代码实现与深入分析)

复制算法主要用于新生代中,例如作用于新生代的垃圾处理器:Serial,ParNew,Parallel Scavenge 垃圾收集器,主要因为新生代的对象的存活时间比较短,所以采用这个算法折衷起来是比较...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:人机博弈之(六)------代码实现(3)搜索引擎
举报原因:
原因补充:

(最多只允许输入30个字)