资源简介
中国象棋,位棋盘,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个文件信息
相关资源
- JSP新闻发布系统设计作品
- jsp排课管理系统
- Android 手机的智能家居语音控制系统设
- java设计毕业答辩ppt讲解.ppt
- 基于ssm的jsp的企业办公自动化系统毕
- JaveWeb课程设计-投票系统
- Android购物管理系统.rar
- 基于java的WEB的仓库管理系统的设计与
- 基于Java的物流信息网站的设计
- 基于Java的个人博客系统的设计与实现
- 网络嗅探器的设计与使用.zip
- 电子邮件系统的设计与实现含毕业论
- 基于java开发的二手图书交易系统设计
- java课程设计——记忆测试系统和课程
- javaweb课程设计学生管理系统
- 学生管理系统设计 java+oracle源代码与
- 基于android手机录音器的设计与实现代
- jsp论坛设计与实现
- 班级管理系统的设计
- 毕业设计项目——安卓点餐系统
- 基于Android的个人理财通的设计与实现
- java web开发学生宿舍后台管理系统,
- 学生信息管理系统源码+数据库.zip
- jsp+servlet+javabean新闻发布系统计算机毕
- 毕业论文基于JavaWeb校园新闻管理系统
- 学生信息管理系统课程设计
- 毕业答辩-jspmysql远程餐厅预约系统-毕
- 毕业答辩-JAVA音像店租赁管理系统的设
- Java程序设计实用教程第4版[叶核亚]
- 毕业设计-JSP网上报名系统
评论
共有 条评论