资源简介
中国象棋,位棋盘,Zobrist键值,alpha-beta搜索,置换表,局面评价,包含设计说明
摘 要:随着人工智能及计算机硬件的发展,计算机象棋程序的下棋水平也不断地得到提高。20世纪60年代初,麦卡锡提出了alpha-beta修剪算法,把为决定下一个走步而需对棋盘状态空间的搜索量从指数级减少为指数的平方根,大大地提高了机器下棋的水平。IBM的超级计算机“Deep Blue”更是一个神话,让棋迷们神往。本文根据国际象棋程序设计的一些成功经验,提出中国象棋程序设计的一些思路和方法。
关 键 词:中国象棋,位棋盘,Zobrist键值,alpha-beta搜索,置换表,局面评价
Abstract:Along with the development of the Artificial Intelligence and computer hardware, the capability of computer chess program have advanced continually.At the beginning of 60s,20th century, McCaxi brought forword alpha-beta pruning algorism which made the chess program advanced more by reducing the order of magnitude of the number of searching nodes deciding next step,named “State Space” from O(Xn) to O(Xn/2). IBM’s super-computer “Deep Blue” is more like a myth for all computer chess fans. In my article, I will describe some ideas and methods of designing Chinese Chess program along with some successful experiences and cases of the Chess.
Keywords: Chinese Chess, bit board, zobrist keys, alpha-beta search, transposition table,
Evaluation
目 录
引 言 3
第一章 概述 4
1.1 棋盘的标记 4
1.2 棋子的名称 5
1.3 棋谱的记录方法 5
1.4 历史局面的表示及存储 7
1.5 棋谱记录文件的格式 8
第二章 基本数据结构——位棋盘 10
2.1 什么是位棋盘 10
2.2 位棋盘的作用 10
2.3 位棋盘的基本运算 12
2.4 Java中位棋盘的实现 13
第三章 基本数据结构——Zobrist键值 17
3.1 比较局面的方法 17
3.2 Zobrist键值的实现方法 17
3.3 Zobrist键值的工作原理及用途 17
3.4 Java中实现Zobrist键值 18
第四章 着法生成 20
4.1伪合法着法的生成 20
4.2 合法着法的生成 25
第五章 搜索算法 29
5.1 最小-最大搜索 29
5.2 Alpha-Beta搜索 33
5.3 迭代加深 36
5.4 置换表 37
5.5 其他策略 41
第六章 局面评价函数 47
6.1 评价函数的实现方法 48
6.2 评价函数所需的信息 48
第七章 程序的设计及实现 51
7.1 搜索引擎的实现(engine包) 51
7.2 信息传输机制(message包) 52
7.3 棋子生成(pieces包) 52
7.4 主控模块(main包) 52
附件1:搜索算法主程序SearchMove.java 55
附件2:程序运行界面及功能说明 74

代码片段和文件信息
/*
*中国象棋Java版V1.0
*作者:王学峰
*源文件:Chess.java
*最后修改时间:2010-1-02
*添加功能:实现了当前棋局的保存
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
//主类
public class Chess{
public static void main(String args[]){
new ChessMainframe(“中国象棋:观棋不语真君子,棋死无悔大丈夫“);
}
}
//主框架类
class ChessMainframe extends Jframe implements ActionListenerMouseListenerRunnable{
//玩家
JLabel play[] = new JLabel[32];
//棋盘
JLabel image;
//窗格
Container con;
//工具栏
JToolBar jmain;
//重新开始
JButton anew;
//悔棋
JButton repent;
//退出
JButton exit;
//当前信息
JLabel text;
//保存当前操作
Vector Var;
//规则类对象(使于调用方法)
ChessRule rule;
/**
** 单击棋子
** chessManClick = true 闪烁棋子 并给线程响应
** chessManClick = false 吃棋子 停止闪烁 并给线程响应
*/
boolean chessManClick;
/**
** 控制玩家走棋
** chessPlayClick=1 黑棋走棋
** chessPlayClick=2 红棋走棋 默认红棋
** chessPlayClick=3 双方都不能走棋
*/
int chessPlayClick=2;
//控制棋子闪烁的线程
Thread tmain;
//把第一次的单击棋子给线程响应
static int Mani;
ChessMainframe(){
new ChessMainframe(“中国象棋“);
}
/**
** 构造函数
** 初始化图形用户界面
*/
ChessMainframe(String title){
//获行客格引用
con = this.getContentPane();
con.setLayout(null);
//实例化规则类
rule = new ChessRule();
Var = new Vector();
//创建工具栏
jmain = new JToolBar();
text = new JLabel(“欢迎使用象棋对弈系统“);
//当鼠标放上显示信息
text.setToolTipText(“信息提示“);
anew = new JButton(“ 新 游 戏 “);
anew.setToolTipText(“重新开始新的一局“);
exit = new JButton(“ 退 出 “);
exit.setToolTipText(“退出象棋程序程序“);
repent = new JButton(“ 悔 棋 “);
repent.setToolTipText(“返回到上次走棋的位置“);
//把组件添加到工具栏
jmain.setLayout(new GridLayout(04));
jmain.add(anew);
jmain.add(repent);
jmain.add(exit);
jmain.add(text);
jmain.setBounds(0055830);
con.add(jmain);
//添加棋子标签
drawChessMan();
//注册按扭监听
anew.addActionListener(this);
repent.addActionListener(this);
exit.addActionListener(this);
//注册棋子移动监听
for (int i=0;i<32;i++){
con.add(play[i]);
play[i].addMouseListener(this);
}
//添加棋盘标签
con.add(image = new JLabel(new ImageIcon(“image\\Main.GIF“)));
image.setBounds(030558620);
image.addMouseListener(this);
//注册窗体关闭监听
this.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent we){
System.exit(0);
}
}
);
//窗体居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = this.getSize();
if (frameSize.height > screenSize.height){
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width){
frameSize.width = screenSize.width;
}
this.setLocation((screenSize.width - frameSize.width) / 2 - 280 (screenSize.height - frameSize.height ) / 2 - 350);
//设置
this.setIconImage(new ImageIcon(“image\\红将.GIF“).getImage());
this.setResizable(false);
this.settitle(title);
this.setSize(558670);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1142272 2010-05-07 13:37 象棋\Java中国象棋需求\设计\Java版中国象棋项目设计论文.doc
文件 5624 2008-04-15 11:17 象棋\象棋txt版本\1.txt
文件 1723 2009-12-28 16:18 象棋\象棋txt版本\2.txt
文件 2157 2008-04-15 11:17 象棋\象棋txt版本\3.txt
文件 2226 2008-04-15 11:17 象棋\象棋txt版本\4.txt
文件 13572 2008-04-15 11:17 象棋\象棋txt版本\5.txt
文件 725 2008-04-15 11:17 象棋\象棋txt版本\6.txt
文件 1468 2009-10-01 16:51 象棋\象棋txt版本\CodePub.Com说明.txt
文件 25877 2007-11-28 19:12 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\440.htm
文件 1106 2007-11-28 19:13 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\count.htm
文件 26236 2007-11-28 19:16 象棋\Java中国象棋需求\象棋的走法\银通在线 - into365_net∷ 中国象棋介绍及游戏规则.files\game.htm
文件 844 2007-11-28 19:12 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\isLogin.htm
文件 0 2007-11-28 19:13 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\view_ad.htm
文件 0 2007-11-28 19:13 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\view_img_ad(1).htm
文件 0 2007-11-28 19:13 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\view_img_ad(2).htm
文件 0 2007-11-28 19:12 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\view_img_ad.htm
文件 3751 2007-11-28 19:13 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\view_review.htm
文件 30485 2007-11-28 19:16 象棋\Java中国象棋需求\象棋的走法\银通在线 - into365_net∷ 中国象棋介绍及游戏规则.htm
文件 38346 2007-11-28 19:13 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.htm
文件 34560 2007-11-28 16:48 象棋\Java中国象棋需求\象棋的走法\中国象棋竞赛规则,有什么朗朗上口的口诀吗?_百度知道.htm
文件 20 2006-03-19 17:06 象棋\Java中国象棋需求\单机版成品给与参考\打包发布\Chess.bat
文件 389 2010-01-06 19:04 象棋\Java中国象棋需求\单机版成品给与参考\源程序\Chess.class
文件 534 2010-01-06 19:04 象棋\Java中国象棋需求\单机版成品给与参考\源程序\ChessMainfr
文件 18888 2010-01-06 19:04 象棋\Java中国象棋需求\单机版成品给与参考\源程序\ChessMainfr
文件 11704 2010-01-06 19:04 象棋\Java中国象棋需求\单机版成品给与参考\源程序\ChessMainfr
文件 2293 2007-11-28 19:12 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\isLogin.files\css.css
文件 5991 2007-11-28 19:16 象棋\Java中国象棋需求\象棋的走法\银通在线 - into365_net∷ 中国象棋介绍及游戏规则.files\css.css
文件 27882 2007-11-28 16:48 象棋\Java中国象棋需求\象棋的走法\中国象棋竞赛规则,有什么朗朗上口的口诀吗?_百度知道.files\iknow1_0.css
文件 3832 2007-11-28 19:12 象棋\Java中国象棋需求\象棋的走法\中国象棋规则简介.files\st
文件 13270 2006-10-09 18:05 象棋\Java中国象棋需求\单机版成品给与参考\打包发布\Chess.jar
............此处省略96个文件信息
相关资源
- Activiti 6.0 流程设计器汉化
- java 毕业设计 进销存管理系统 源码
- 基于java的在线考试系统-毕业设计
- JSP企业人事管理系统设计(源代码+论
- 基于Java的酒店管理系统源码(毕业设
- android毕业设计
- java23种设计模式+23个实例demo
- java做的聊天系统(包括正规课程设计
- 基于Android智能家居详细设计(经典)
- Java综合程序设计——计算器(实现运
- java 人事管理系统 课程设计
- Java版航空订票系统源码
- 数据库设备管理系统课程设计论文J
- jsp 学生信息管理系统设计与实现
- 日历时钟java版实现
- java版多人聊天室
- Java课程设计(15个经典案例)
- 俄罗斯方块具体设计(Java描述)带详
- Java版聊天程序(UDP TCP 多线程)
- JAVA计算器实验报告与源码
- 人事信息管理系统 java课程设计
- 学生信息管理系统 JAVA课程设计
- JSP课程设计-留言本 jsp mysql tomcat实现
- 棋盘覆盖---JAVA版
- 《java程序设计》书附源代码
- Java程序设计考试试卷和答案(共4套)
- 东南大学 JAVA课程设计 学生信息管理
- 自动出题系统(java 课程设计)
- java 程序设计网页浏览器
- 软件工程课程设计报告--java学生管理
评论
共有 条评论