电脑象棋循序渐进.docVIP

  • 1
  • 0
  • 约1.4万字
  • 约 19页
  • 2026-02-23 发布于中国
  • 举报

电脑象棋循序渐进

目录

TOC\h\h(一)从图形界面做起

\h(二)掌握象棋规则

\h(三)最初级的人工智能

\h(四)稍微聪明些了

\h(五)质的飞跃

\h(六)精益求精

计算机象棋循序渐进

本文将分六个阶段来阐述一个计算机象棋程序从无到有、从弱智到聪明的过程,对应“象棋小巫师”示范程序的各个版本:

0.1版:介绍制作象棋图形界面的方法;

0.2版:介绍中国象棋规则的实现;

0.3版:介绍以Alpha-Beta搜索为基础的一些计算机博弈基本智能算法;

0.4版:介绍Zobrist校验码、重复局面判断以及消除水平线效应的各种技术,进一步提高程序的智能;

0.5版:介绍置换表技术和走法顺序优化技巧,使一个象棋程序的技术架构趋于完整;

0.6版:介绍克服搜索不稳定性的方法、开局库、走子随机性等锦上添花的技术。

(一)从图形界面做起

与本文配套的示范程序是“象棋小巫师”0.1版,程序清单是:

(1)XQWL01.CPP——C++源程序;

(2)XQWLIGHT.RC——资源描述文件;

(3)RESOURCE.H——资源符号定义文件;

(4)RES目录——图标、图片、声音等资源。

为了使更多的程序设计师对这个话题感兴趣,我们选用了最常用的程序开发工具——MicrosoftVisualC++,它适合编写Windows下的任何应用程序。为了让程序尽可能简洁,我们不使用任何第三方的控件和库,取而代之的是大量的Win32API函数。

象棋程序是让人跟计算机下棋的,所以图形界面必不可少。我们选取了开源程序《象棋巫师》中的素材——一张520x576大小的棋盘图片和几张56x56大小的棋子图片,拼凑在一起便可组成一副不太难看的棋具。

仅仅把棋盘和棋子画到窗口上是不够的,图形界面的另一个作用是让用户走棋。走棋的操作应该是非常简单的——用鼠标点击一枚棋子,该棋子就被选中(上面有个标记),用户想让这枚棋子走到哪个位置,就用鼠标点击哪个位置。因此,操作过程可分为两状态:

A.让用户选子的状态:只能点击自己的子;

B.让用户落子的状态:如果点击自己的子,那么被选中的子改变了;如果点击对方的子或空格处,那么可以走这步棋。

这样,鼠标点击事件(WM_LBUTTONDOWN消息)的处理过程就可以写成:

if(点击自己的子){

把点击的子选中;//进入状态B(已选中)

}elseif(已经有子选中){

可以走这步棋(刚才选中位置-现在点击的位置);//进入状态A(未选中)

}

那么,如何把一枚棋子画在棋盘上呢?实际上只要用BitBlt和TransparentBlt两个函数就够了,过程如下:

(1)把原来位置的棋子用棋盘图案覆盖掉(用BitBlt函数);

(2)在该位置贴上棋子的图案,由于棋子图案是透明的,所以要用TransparentBlt函数;

(3)如果这枚棋子是选中的,那么再在该位置贴上选中的图案(再用一次TransparentBlt函数)。

在象棋小巫师中,所有在棋盘上的棋子都放在数组ucpcSquares[256]中(长度256的好处将在后面介绍),数组指标代表格子的编号,匈牙利标记uc表示每个元素占用一个字节,pc表示棋子标识。棋子标识的含义如下:

A.0表示空格(没有棋子);

B.8~14依次表示红方的帅、仕、相、马、车、炮和兵;

C.16~22依次表示黑方的将、士、象、马、车、炮和卒。

这样做的好处是判断棋子的颜色非常简单——(pc8)!=0表示红方的棋子,(pc16)!=0表示黑方的棋子。

在象棋小巫师中,选中的棋子用变量sqSelected表示,sq代表格子的编号。判断棋子ucpcSquares[sq]是否被选中,只需要判断sq与sqSelected是否相等即可。sqSelected==0表示没有棋子被选中。

在象棋小巫师中,一个走法只用一个数子表示,即mv=sqSrc+sqDst*256,mv代表走法,mv%256就是起始格子的编号,mv/256就是目标格子的编号。走完一步棋后,通常会把该走法赋值给变量mvLast,并把mvLast%256和mvLast/256这两个格子都做上标记,这样就能清晰地看到用户或计算机刚才走的一步棋了。

计算机象棋循序渐进

(二)掌握象棋规则

与本文配套的示范程序是“象棋小巫师”0.2版,程序清单是:

(1)XQWL02.CPP——C++源程序;

(2)XQWLIGHT.RC——资源描述文件;

(3)RESOURCE.H——资源符号定义文件;

(4)RES目录——图标、图片、声音等资源。

在阅读本章前

文档评论(0)

1亿VIP精品文档

相关文档