1、 南 京 理 工 大 学毕业设计说明书 (论文 )作 者 : 李国防准考证号:014910253063教 学 点 : 南京信息职业技术学院专 业 : 电子工程专业题 目 : 五子棋对弈系统设计指导者: (姓 名) (专业技术职务)评阅者: (姓 名) (专业技术职务)2012 年 05 月徐小平 副教授毕 业 设 计 说 明 书 ( 论 文 ) 中 文 摘 要在这个电子产品日益更替的年代,人工智能随着其在电子领域的广泛应用,而渐渐脱颖而出,成为众多炙手可热的研究项目之一,而博弈也成为人工智能研究方向中较代表性的一类。本文以五子棋为例,运用所学的 C 语言知识,探讨用于博弈中的推理技术、搜索方法
2、和决策规划。设计了本文基于 Turbo C 工具的五子棋对弈系统程序,通过 DOXBOX 系统界面来实现人与人之间的对弈。本文是依靠 TC 编程工具,运用库函数的画图方法,通过简单的语言程序,将双人五子棋对弈功能在 DOXBOX 系统环境下实现。游戏界面下具有棋盘的显示,操作按键的个性说明,输赢棋后的文本说明信息以及个性光标的移动显示等功能。设计程序简洁易懂,游戏可塑性较强。本文设计在 DOXBOX 下实现了五子棋对弈系统,大大减少了现代五子棋竞技成分,增加其趣味性,图形界面清晰且便于操作。关键词 五子棋 Turbo C 博弈 算法毕 业 设 计 说 明 书 ( 论 文 ) 外 文 摘 要Ti
3、tle Gobang design based on the Turbo C AbstractIn the growing age of replacement of the electronic products, artificialintelligence, with its wide range of applications in the electronics field, and gradually come to the fore, one of the many hot research projects, while the game has become more rep
4、resentative in the direction of artificial intelligence research. Taking the Gobang for example, using the language knowledge of the C, explore reasoning techniques for the game, search methods and decision-making planning.Design tools based on Turbo C backgammon chess system program, throughDOXBOX
5、system interface of chess between people.This is the drawing methods rely on the TC programming tools, the use of library functions, simple language program will double backgammon chess functions to achieve the in DOXBOX system environment. The game interface board display personalized description o
6、f the operation button, the text after the winning or losing chess informationand personalized cursor movement and other functions. The design process is easier to understand has strong game plasticity.Designed in this paper in DOXBOX under backgammon chess system, greatlyreducing the modern backgam
7、mon competitive components to increase its interesting, the graphical interface is clear and easy to operate.本 科 毕 业 设 计 说 明 书 ( 论 文 ) 第 IV 页 共 XXXIII 页Keywords Turbo C game Gobang algorithm本 科 毕 业 设 计 说 明 书 ( 论 文 ) 第 I 共 I 页目 次1 引言12 五子棋概述22.1 五子棋背景及规则22.2 开发工具下图形界面函数的介绍23 设计思想43.1 总体模版的设计43.2 五子棋程
8、序框架总图44 模块介绍54.1 初始化模块54.2 接收处理信息模块84.3 走棋控制模块95 数据测试156 对人工智能对弈模式的设想176.1 棋型的定义176.2 棋型价值的定义及计算19结论21致谢22参考文献23附录(源程序)24本 科 毕 业 设 计 说 明 书 ( 论 文 ) 第 1 页 共 29页1 引言随着人工智能的发展,越来越多的软件游戏应运而生,伴随着其庞大功能的同时,给出了各种越来越多的规则限制,更多的局限于游戏的竞技能力,逐步忽略了其原始为大众所追捧的趣味性,简单性。因此,富有各种规则的棋类游戏渐渐淡出,而让我们迷恋追捧的却是那些简简单单,无太多章法,却趣味十足的软
9、件游戏,如:“愤怒地小鸟” 、 “汤姆猫”等。而本文则摆脱了棋类游戏的各种附带限制,将传统的五子棋游戏,通过DOXBOX 系统给大家展示,将规则交给玩家,可塑性强。与此同时,本文尽管基于 TC 工具来实现,但却别开生面,遗弃了复杂模糊的字符界面,完全体现了图形库函数的应用,呈现了简洁、大方的图形界面。在论文的进展过程中,首先遇到的最大的难题就是对于图形库函数的认知不够全面,一些细致的东西,没抓到点的要求,从而导致程序一次次的编译失败。在经过多次研究,比对和尝试后,最终才得以成功。其次,因在 win7 下无法实现 win-tc 的全屏显示,多次失败后选择更换 XP 系统来完成,最后论文的书写过程
10、中,因为全屏后无法剪切图片,而导致无法顺利完成论文,后经查询,确定用 DOXBOX 来实现,才得以成功完成。本设计将程序分为 3 个主要模块,针对每一模块为实现其预期功能,而分开去构思研究,确定其在整个程序中的位置,最后完善。另外,在实现本文设计内容之余,还展示了个人对人工智能实现人机对战的构想。本 科 毕 业 设 计 说 明 书 ( 论 文 ) 第 2 页 共 29 页2 五子棋的概述五子棋是一种两人对弈的纯决策谋略型棋类游戏,是起源于中国古代的传统黑白棋种类之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富有哲理,有助于修身养性。
11、2.1 五子棋的背景及规则五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠” ,英译为“Renju” ,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子” 、 “五子连” 、 “串珠” 、 “五目” 、 “五目碰” 、 “五格”等多种称谓。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快” ,又有古典哲学的高深学问“阴阳易理” ;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦
12、有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。五子棋的规则如下:棋盘:采用同围棋盘一样的 15 路或 19 路线的棋盘,为了实现传统的五子棋棋盘,本系统将采用 19 路线的棋盘。下法:两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子。无子的交叉点又被称为空点。输赢判断:黑、白双方有一方的 5 个棋子在横、竖或斜方向上连接成一线即为该方赢。2.2 开发工具下图形界面函数的介绍应用 Turbo C 工具中的库函数 graphics.h 图形界面的画法,可以实现各种基本图形的绘制,比如说:圆、椭圆、方框、线、点、文本框等,本文主要介绍设计中会用到的一些图形界面函数的应用方法。2
13、.2.1 画线函数 这类函数提供了从一个点到另一个点用设定的颜色画一条直线的功能,起始点的设定方法不同,因而有下面不同的画线函数。本 科 毕 业 设 计 说 明 书 ( 论 文 ) 第 3 页 共 29 页1) 两点之间画线函数。void far line(int x0,int y0,int x1,int y1);从(x0,y0)点到(x1,y1)点画一直线。2) 从现行画笔位置到某点画线函数。void far lineto(int x,int y);将从现行画笔位置到(x,y)点画一直线。3) 从现行画笔位置到一增量位置画线函数void far linerel(int dx,int dy);
14、2.2.2 画(椭)圆函数 在画图的函数中,有关于角的概念。在 Turbo C 中是这样规定的:屏的 x 轴方向为 0 度,当半径从此处逆时针方向旋转时,则依次是 90 度、180 度、270 度,当 360 度时,则和 x 轴正向重合,即旋转了一周。1) 画椭圆函数void ellipse(int x,int y,int stangle,int endangel,int xradius,int yradius);该函数将以(x,y)为中心,以 xradius 和 yradius 为 x 轴和 y 轴半径,从起始角 stangle 开始到 endangle 角结束,画一椭圆线。当stangle
15、=0,endangle=360 时,则画出的是一个完整的椭圆,否则画出的将是椭圆弧。当然,满足一定条件的椭圆也就是圆,应用椭圆的画法可以实现棋子的画法。2) 画圆函数void far circle(int x,int y,int radius);该函数将以(x,y)为圆心,radius 为半径画个圆。2.2.3 颜色设置函数 象素的显示颜色,或者说画线、填充面的颜色既可采用缺省值,也可用一些函数来设置。与文本方式一样,图形方式下,象素也有前景色和背景色。按照 CGA、EGA、VGA 图形适配器的硬件结构,颜色可以通过对其内部相应的寄存器进行编程来改变。1) 前景色设置函数void far se
16、tcolor(int color);本 科 毕 业 设 计 说 明 书 ( 论 文 ) 第 4 页 共 29 页该函数将使得前景以所选 color 颜色进行显示,对 CGA,当为中分辨模式只能选 0,1,2,3。2) 选择背景颜色的函数void far setbkcolor(int color)该函数将使得背景色按所选 16 种中的一种 color 颜色进行显示本文则根据传统五子棋的基本下法,运用所学的库函数图形界面的画法,设计了一篇简单的五子棋对弈系统,界面简洁美观,可塑性强且趣味性十足。3 设计思想传统的五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为 19x19,棋子一般放置棋盘线交叉点
17、上。两人对局,各执一色,轮流下子,先将横、竖或斜线上 5 个同色棋子连成不间断的一排着为胜。而本文设计通过程控,实现 2 人对弈的五子棋界面。主要通过库函数的应用画制棋盘棋子,函数定义及判定循环方式来决定棋子是否可下,移动更新游标位置,同时根据下子后棋型扫描,判断是否赢棋,具体实现构思如下:3.1 总体的模板设计按照设计思路,将整个程序根分为 3 个模块,即初始化模块、接受处理信息模块以及走棋控制模块,具体如图 3-1 所示。根模块初始界面模块接受 、 处理信息模块走棋控制模块图 3-1 总体模块设计图3.2 五子棋程序框架总图本设计重在五子棋双人对战程序的编译实现,根据 3.1 总体模板的构
18、思,初步涉论,提出各模块组合顺序、涉及具体内容,绘出本程序所需的总体流程方向及全局构架,见图 3.2;界面初始模块界面初始模块本 科 毕 业 设 计 说 明 书 ( 论 文 ) 第 5 页 共 29 页初始化接受按键下子与判定 移动光标玩游戏退出忽略处理判断落子键的有效性更新数组与棋盘显示判断是否走成五子相连更新全局变量移动光标至新位置接受 、 处理用户输入信息至 :分出胜负 ;按键 退出画棋盘显示提示信息棋盘置空退出键落子键光标移动键无效处理图 3-2 五子棋程序框架总图根据此框架流程图,逐次研究各模块为实现其对应的功能,所要采用的方法,每个模块涉及的思路以及编写技巧,将于下章详细介绍。4
19、模块介绍4.1 初始化模块游戏开始,首先显示的是棋盘界面,及一些操作键等提示信息的定义说明,简单的来讲就是一幅未下子的空界面,另外,一次游戏结束后的开局界面,也是在考虑初始化的过程中必然要研究的,总结分为以下 3 个方向:4.1.1 画棋盘棋盘采用 19*19 的矩形棋盘,即应用 19*19 的二位数组 fivemap1919,用来保存当前棋盘的落子资料组,其中对每个成员来说,0 表示无子,1 表示落1 号玩家棋子,2 表示落 2 号玩家棋子。程序引用库函数中的线条画法,定义函数 void drawmap(),定义颜色为4 号红色,定义四角点坐标为(92,12)、(92,444)、(92,12
20、)、(524,12)。定义线与线区间间隔为 24。本 科 毕 业 设 计 说 明 书 ( 论 文 ) 第 6 页 共 29 页根据 TC 库函数线的画法,取棋盘的四角点坐标如上,根据两点之间直线的画法,void far line(int x0,int y0,int x1,int y1);定义线与线之间的距离为 24,采用示例中的循环方式,画出棋盘。int x0,int y0 表示初始点的坐标,int x1,int y1 为末点的坐标。程序示例如下:void drawmap()int i;setcolor(4);for(i=0;i0)nx-;drawall();break;case d:if(nx0)ny-;drawall();break;本 科 毕 业 设 计 说 明 书 ( 论 文 ) 第 9 页 共 29 页case s:if(ny#include#define NONE 0#define PLAYER1 1#define PLAYER2 2