五子棋人机对弈 下载本文

内容发布更新时间 : 2024/7/1 4:54:40星期一 下面是文章的全部内容请认真阅读。

【概述】五子棋是一种大众喜爱的游戏,其规则简单,变化多端,非常富有趣味性何消遣性。这里设计了一个简单的五子棋程序,采用对空格点进行评分排序的算法。

近来随着计算机的快速发展,各种棋类游戏被纷纷请进了电脑,使得那些喜爱下棋,又常常苦于没有对手的棋迷们能随时过足棋瘾。而且这类软件个个水平颇高,大有与人脑分庭抗礼之势。其中战胜过国际象棋世界冠军-卡斯帕罗夫的“深蓝”便是最具说服力的代表;其它像围棋的“手淡”、象棋的“将族”等也以其优秀的人工智能深受棋迷喜爱;而我也做了一个“无比”简单的五子棋算法。 总的来说(我们假定您熟悉五子棋的基本规则),要让电脑知道该在哪一点下子,就要根据盘面的形势,为每一可能落子的点计算其重要程度,也就是当这子落下后会形成什么棋型(如:“冲四”、“活三”等),然后通览全盘选出最重要的一点,这便是最基本的算法。

主程序模块包括:数据结构,评分规则,胜负判断,搜索最优空格的算法过程。 【关键字】人工智能,博弈树,五子棋,无禁手,评分,搜索,C,随机。 【环境】XP/TC3.0

【算法及解析】(无禁手) 一. 数据结构:

本程序中只使用了一个19×19的二元结构数组如下定义: Typedef Struct {

int player;

int value[8][5]; long int score; }map[19][19];

其中map[i][j]保存i行j列棋子信息,player为下棋方,value数组记录八个方向的连续5个棋子的信息,为以后评分服务。Score为空格评分。 以及数据结构可以满足初级人机对弈程序的功用。 对比其他程序结构:

王小春五子棋源码:该程序采用链表节点结构,保存下子信息,该结构主要为悔棋提供方便(虽该源码为开发悔棋功能) Typedef struct Step {

int m; int n;

char side; };

为链表clist节点,m,n表示两个坐标值,side表示下子方相对于我的程序中的player.

另外该程序还使用一个二维数组map[][],来保存棋盘信息。 二.预定义单元 #define blank 0 #define black 1 #define white 2 #define NUM_HIGH 19 #define NUM_LINE 19 #define man 1 #define bot 2

其中blank表示空白点,black该点放黑子(即man),white该点放白子(即robot) NUM_HIGH,NUM_LINE分别定义棋盘的高度与宽度。 Turn 为轮流下子方。

三.评分机制

判断是否能成活四或者是双死四或者是死四活三,如果是机器方的话给予10,000,000;

判断是否已成冲四,如果是机器方的话给予6,000,000; 判断是否成死3活3,如果是机器方的话给予1,500,000;; 判断是否已成双活2,如果是机器方的话给予100,00; 判断是否能成活2,如果是机器方的话给予70,000; 判断是否能成死2,如果是机器方的话给予30,000。

四.函数定义及其功能。 1.Void init()

初始化棋盘bgi图形与棋盘棋型。

将棋盘标记map[][].player都置为blank(空白),各点8方向的连续五个棋子信息也初始为0,各点评分数也置为0。 void init() {

int i, j, m, n;

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,\ for( i = 0; i < 19; i++) for( j = 0; j < 19; j++) {

map[i][j].player = blank; for( m = 0; m < 8; m++) for( n = 0; n < 4; n++)

map[i][j].value[m][n] = blank; map[i][j].score = blank; } }

2.Void paint()

画棋盘函数,本五子棋程序使用的是标准围棋棋盘,规格19×19,每格25大小(象素),并且规定man棋子颜色为黑,robot为白色,黑棋优先。最后初始化光标(开始位置)位置。 void paint()