人机博弈之(六)------代码实现(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;
    }

}

人机博弈之(六)------代码实现(4)估值

package eveluation;import constdata.ConstData;import java.awt.Point;public class Eveluation...{    /...
  • dremi
  • dremi
  • 2007年09月24日 22:49
  • 1220

人机博弈之(一)------博弈介绍

       爱好编程的大部分还是喜欢自己编写一个游戏,但较少是编写和电脑对战的游戏,因为里面毕竟涉及博弈,搜索等技术,我想来通编写一个人机博弈的中国象棋游戏,希望从中收获些东西。参考书是王小春编著的...
  • dremi
  • dremi
  • 2007年09月23日 15:36
  • 2826

中国象棋人机对弈搜索算法学习-极大极小值,负极大值,alpha-beta算法

先参考学习如下博文: http://blog.csdn.net/kingkong1024/article/details/7639401 http://hk.gamfe.com/news/2015...
  • qq_26437925
  • qq_26437925
  • 2016年04月07日 18:48
  • 2389

中国象棋的人机博弈程序

对此题目有兴趣的朋友们:    感谢你们抽出宝贵的时间来阅读这些浅显的文字。    很多人可能都知道chess的人机大战:     1996年,卡斯帕罗夫以4比2战胜“深蓝”(Deep Blue); ...
  • shaozz
  • shaozz
  • 2009年03月10日 09:53
  • 1122

人机博弈之(六)------代码实现(2)走法产生器

package movegenerator;//走法产生器import constdata.ConstData;import chessmovedata.ChessMoveData;//一个走法的结构...
  • dremi
  • dremi
  • 2007年09月23日 16:12
  • 1652

人机博弈之(六)------代码实现(1)常量数据

package constdata;//数据表示//public class ConstData...{    public final static byte NOCHESS        = 0;...
  • dremi
  • dremi
  • 2007年09月23日 16:08
  • 1362

五子棋人机对弈代码——之博弈树算法

#include #include #include #include /* Program of Game -- wuziqi Written by Zhang shuai, DEC.25t...
  • handsomesunshineboy
  • handsomesunshineboy
  • 2011年02月09日 07:03
  • 13190

java五子棋人机对战算法分析

五子棋人机对战采用的算法,目前大都是搜索树算法,用一棵树来表示棋局发展的 种种可能性,这种树叫做博弈树(对局树)。根节点表示对局的开始状态,每一种可 能的走法造成的结果作为其子节点,而对每一个这样的子...
  • zzzypp
  • zzzypp
  • 2015年01月13日 15:59
  • 3976

javascript人机博弈--黑白棋

最近,在研究计算机人工智能中人机博弈的一些算法,用javascript写了个人机对战的 黑白棋 游戏。 放上来大家帮忙测试一下,看看棋力强度怎么样,有没有bug,走昏招之类的。 这程序主要在研...
  • jslang
  • jslang
  • 2015年07月01日 17:48
  • 1870

java 五子棋之人机对战思路详解

最近做了五子棋,记录下自己完成五子棋的人机对战的思路。     首先,思路是这样的:每当人手动下一颗棋子(黑子)的时候,应当遍历它周围棋子的情况,并赋予周围棋子一定的权值,当在机器要下棋子(白子)...
  • skl_TZ
  • skl_TZ
  • 2013年07月06日 21:24
  • 3831
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:人机博弈之(六)------代码实现(3)搜索引擎
举报原因:
原因补充:

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