1、C围棋程序实现报告、软件背景介绍围棋是一项广有裨益的智力竞技运动,它集休闲娱乐、陶冶性情、 修心养性于一身,是 中华文化的瑰宝,是人类智慧的最高象征之一。围棋经历了数千年,久盛不衰,且至今还在 不断发展。 现在的人工智能科学研究在它面前显得很是稚嫩, 因而值得将它作为重要的研究 对象。 在人工智能领域内,博弈是很重要的一个研究分支。通过对博弈的研究,可以解决很 多实际问题, 使计算机智能向人类智能迈进。 计算机国际象棋和计算机围棋一直是人工智能 的热门课题, 而围棋程序的编制被称作人工智能的 “试金石”,是人工智能技术的一大难题, 它将会在今后相当长的时期内哺育着人工智能科学的成长。计算机围棋
2、是计算机博弈研究的一个重要分支, 是当前人工智能研究的热点之一, 一直 以来吸引着大量的研究人员, 产生了较大的社会影响和学术影响。 由于围棋变化复杂、 棋理 深奥, 是一种高智能的活动, 因而围棋的计算机博弈设计难度较大, 同时计算机围棋热点问 题的研究为人工智能带来了崭新的方法和理论。计算机围棋的研究和实现需要多门学科的知识交叉, 至少会涉及到围棋、 计算机、 数学、 生物、逻辑学、军事学、教育、心理学乃至哲学等领域,因此其发展具有重要的研究价值和 应用价值。本系统是基于 C+编程语言的立足于“人一人”围棋对弈系统的设计与实现,具有围棋 记谱、打谱、查看定式、最终评分等功能,是一个适宜在计
3、算机上联网的“人一人”的对弈 系统。围棋胜负判断与局面分析功能子系统是围棋对弈系统的重要组成部分。 围棋胜负自动判断是一个实用的围棋对弈系统所应具有的功能。 在现实的围棋胜负判断中, 往往需要一个裁 判员通过做棋来判断棋局最终的胜负。 如果有一个客观、 准确的围棋自动判断胜负系统, 一 方面可以省时省力, 一方面可以做到客观公正。但实现一个具有人 (裁判员)一样的判断能 力的胜负判断系统, 存在着许多困难和挑战。 本系统通过建立棋局的记录来判断棋盘上每一 点的归属,从而确定棋局中双方地域, 故能够对提掉死子后的终局棋盘用中国规则判断胜负; 通过建立棋子的影响模型、 力学模型以及度量公式, 将棋
4、子向棋盘其它部分辐射的影响量化, 从而判断对弈双方的影响领域。论文主要介绍了围棋对弈系统中胜负判断与局面分析功能子系统具有的功能, 论述了子系统的开发和实现的过程。该围棋游戏的主界面如图 1。图 1 围棋主界面、核心算法思想该围棋软件主要是由以下三种算法组成的:1、使每个棋子周围产生某种影响,这种影响随着距离的增加而减少,用一定的公式计 算叠加种影响, 以判断形势和估计着点的价值。 这与围棋的棋理相通, 即对于每个棋子可估 算其“势力” 。此中就有著名的“气位”理论。2、建立模式库,贮存了大量模式(定式、棋形等) ,以供匹配。这其实涉及到围棋的许多棋谚与棋理。如“二子头必扳” 、“镇以飞应”
5、、“断从一边长” 、三子正中、点方等等。这 些都是根据围棋的具体情况而设计的。3、 对目标明确的局部,用人工智能中的搜索法探求其结果。(一)围棋局面分析功能的实现这里定义了 Stone的数据结构,用于记录每一点与棋盘上已落棋子的距离和受到的影响值,定义如下:Public Type StoneValue As IntegerDistance As IntegerEnd Type需要定义显示地域时的棋谱 Public Map(1 To 19, 1 To 19) As Stone ,用于记录最后的累加影响。其中 Map上每一点 Map(i,j)的Dista nee与value的关系为:Value =
6、 2 的 (6 - Distance) 次方。 Map(i , j )的最终影响要通过计算影响模型,递减定律以及反射 定律,经过度量公式计算,大于定值 A的点显示为黑棋地域,小于 -A的点显示为白棋地域。(二) 影响模型由于棋盘上的每个棋子都要对盘面发出影响, 设黑棋影响为正, 白棋影响为负。 棋盘上 的每一点要受到多个棋子的累加影响,其中,受到该点最近的棋子影响最大,依次递减。设这影响在棋子的紧邻(距离为 1)为最大值 32,并随距离增加而按比例衰减,衰减因子为1/2。就是距离每增加1时影响值减半。此时一黑子对其周围辐射的影响如图 2。11 2 11 2 4 2 11 2 4 8 4 2 1
7、1 2 4 8 16 8 4 2 11 2 4 8 16 32 16 8 4 2 11 2 4 8 16 32 64 32 16 8 4 2 11 2 4 8 16 32 16 8 4 2 11 2 4 8 16 8 4 2 11 2 4 8 4 2 11 2 4 2 11 2 11 图 2 系统使用的影响模型 影响模型的实现,采用循环嵌套,对一已落的棋子( i ,j ),计算其对周边的影响,定义变量 row, column ,对于满足 i-6=row=i+6, i-6=column 0:受黑的影响强一些;F 0时受黑的影响强一些,该点能被黑方所控制,作为黑方实地,显示为黑 方地域,反之,为白
8、棋的势力范围。在显示中规定:如果该点所受四个方向的力均大于 0,且F大于20,则该点为黑方势力范围。对于白方的势力范围有类似的判断规则。(四)围棋胜负的判断方法所属空点的总和大于此数者为胜,小于此数者为负,等于此数者为和。三、核心算法流程图(一)判定双方的势力范围对于每一点,它受到的总控制力 F=F0+F1+F2+F3,当丨F丨大于某一数值 n时,将其显示为地域。当F 0时受黑的影响强一些,该点能被黑方所控制,作为黑方实地,显示为黑 方地域,反之为白棋的势力范围。在显示中规定:如果该点所受四个方向的力均大于 0,且F大于20,则该点为黑方势力范围。 对于白方的势力范围有类似的判断规则。 双方的
9、势力范围的实现流程图如图 3。是影响范围内递减定律度量公式 显示势力 画出双方控制地域m_Map( 19, 19)记录)上影响模型结 束 一 图3局面分析实现流程图(二)判断围棋输赢这里定义了 Item的数据结构,用于记录每一枚棋子的颜色及搜索的状态:Public Type ItemsValue As In tegerChecked As Boolea nEnd Type定义终局棋谱数组: Public m_GameOverMap(1 To 19, 1 To 19) As Items ,终局的每结点存储为Item结构,记录每一点的归属。对待盘棋局(用每一点用循环扫描,记录每一点是哪一方的领域。
10、F图为判断围棋胜负的流程图。判判断断生胜负负行数否围否是黑八、是9=919列数=1是被同色棋包围确疋该点颜色计为单官计为单白官总数减1填入白子总数加1 填入黑子结束是单官为奇数算/x 坐标, 1-19 间的整数/y 坐标, 1-19 间的整数/所放棋子颜色, 1为黑, 2为白/访问标识,用于递归算法/该位置所在矩形区域/该位置状态标识/该位置坐标/指向该位置的四个邻接点图 4 胜负判断实现流程图四、源代码下面给出的是实现联网对战游戏的源代码:#include MyStack.h#include MyList.h#include MyOutFunction.h#pragma once#inclu
11、de using namespace std;#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000struct pointint p_x;int p_y;int color;struct _nodepoint data;_node* next;_node* pre;class CChessPospublic:BOOL visit_for_DeadOrLive;BOOL visit_for_DeleteDead;CRect chessman(CPoint point); int nFlag;CPoint point;CChessPos* pLef
12、t;CChessPos* pRight;CChessPos* pTop;CChessPos* pBottom; CChessPos();virtual CChessPos(); ;#include mscomm.h#include SelectComm.h #include ChessPos.h #if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000const int DIE = 0;/表示空位或死棋const int BLACK = 1; const int WHITE = 2; const int EDGE = 3; class MyList
13、/黑棋/白棋/边界以外public:void init();MyList(); virtual MyList(); _node* head; _node* now; _node* tail; int size; void add(_node* newNode); void add(int x, int y,int color);bool isEmpty(); void printList();/根据函数 format 定义的格式遍历链表, step 记录结点遍历到了第几个结点void printList(void(*format)(void* e,void* steptag),int step
14、);void del();void clearList();/删除链表最后一个元素/清空链表bool searchele(int x, int y);/ 遍历链表 ;struct _stateint x;/保存棋盘中每个格子的临时状态,以判别处于该位置的棋子是否能存活/在棋盘中的横坐标int y;int fangxiang;/在棋盘中的纵坐标int color;int footprint;int dead;/处于此格子的棋子可能死亡struct _statenode_state s;_statenode* next;class MyStackpublic:_statenode* head;in
15、t size;MyStack(); virtual MyStack(); void init();void push(_state* s); _state* pop();/堆栈大小bool isEmpty(); void print();CPoint pointForGoPrompt;/下子提示点CPoint pointForRegret;/悔棋按钮CPoint pointForWhiteCalculate;/显示统计时白棋标志的位置CPoint pointForBlackCalculate;CPoint pointForIllegal;/非法提示int nCalculateWhite;/白子
16、统计int nCalculateBlack;/黑子统计int nBackCalculateWhite;/ 白子统计备份int nBackCalculateBlack;/ 黑子统计备份BOOL fIllegal;/非法走步标志BOOL fRegretOnlyOnce;/只许悔棋一次/=/位图有关定时器有关/=/CBitmap m_BitmapToRight;CRect m_rectBitmapToRight;int m_nBitmapToRightHeight;int m_nBitmapToRightWidth;CBitmap m_BitmapToLeft;CRect m_rectBitmapT
17、oLeft;int m_nBitmapToLeftHeight;int m_nBitmapToLeftWidth;struct _statenode_state s;_statenode* next;class MyStackpublic:_statenode* head;int size; / 堆栈大小MyStack();virtual MyStack();UINT m_timer; / 计时器标志 BOOL m_fAlternate;BOOL m_fClear;/ Operationspublic:virtual BOOL OnNewDocument(); virtual void Ser
18、ialize(CArchive& ar);CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DA TA_INIT(CAboutDlg)/AFX_DA TA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DA TA_MAP(CAboutDlg)/AFX_DA TA_MAPclass CWQDoc : public CDocumentprotected: / create from serialization onlyCW
19、QDoc();DECLARE_DYNCREA TE(CWQDoc)public:virtual BOOL OnNewDocument();virtual void Serialize(CArchive& ar);/ 开始游戏 是否有效 /新建文档初始化函数 /判断是否可以落子 /游戏模式 /所选择的串口号 /定义串口对象 m_MSComm /悔棋 enable 标识 /备份前次场景 /当前场景 /前次场景 /上次场景public:BOOL m_bGameStartEnable;BOOL Initialization();BOOL m_bEnable;UINT nGameMode;UINT nC
20、omNum;CMSComm m_MSComm;BOOL reback;int backup_scene1919;int cur_scene1919;int pre_scene1919;int last_scene1919;#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const; #endifMyList();virtual MyList();_node* head;_node* now;_node* tail;int size;void add(_node* newNode)
21、;void add(int x, int y,int color);bool isEmpty();void printList(); / 根据函数 format 定义的格式遍历链表, step 记录结点遍历到了第几个结点void printList(void(*format)(void* e,void* steptag),int step);void del(); / 删除链表最后一个元素 void clearList();bool searchele(int x, int y);#include PublicStruct.hclass CWeiQipublic:CWeiQi();virtua
22、l CWeiQi();public:BOOL TiZi(int x,int y);short GetPointType(int x,int y);void ClearNodes();void Init();void Init2(); / 小棋盘void ClearBoardFlag();protected:class CWeiQ1_0View : public CViewprotected:CWeiQ1_0View();DECLARE_DYNCREA TE(CWeiQ1_0View)private:space, int radius);void DrawChessboard(CDC* pDC,
23、CPoint top_left,COLORREF bkcolor,int ;protected:/AFX_MSG(CWQView)afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnReback();afx_msg void OnUpdateReback(CCmdUI* pCmdUI);afx_msg int OnCreate(LPCREA TESTRUCT lpCreateStruct); afx_msg void OnComm();public:void reback_scene(int comeback19
24、19); / 当前场景恢复到 comebackvoid save_scene(int save1919); / 保存当前场景到 savevoid copy_scene(int from1919, int to1919); / 复制场景 from 到 toBOOL compare_scene(int A1919, int B1919); 比较场景 A 和 B,相同-true,不同-falseclass CWeiQ1_0Doc : public CDocumentprotected: / create from serialization only CWeiQ1_0Doc();DECLARE_DY
25、NCREA TE(CWeiQ1_0Doc) / Attributes public:virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar);AFX_VIRTUALpublic:bool m_modified;/保存棋盘上剩下的棋子的信息/保存棋盘要显示的信息,主要是易于判断吃子/保存曾经走过的每一步char* m_openedFilename;MyList m_nowlist;int m_qiju2121;MyList m_historylist;int m_radius;int m_space;COLORREF m
26、_bkcolor;CPoint m_topleft;virtual CWeiQ1_0Doc();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;struct pointint p_x; /x 坐标, 1-19 间的整数int p_y; /y 坐标, 1-19 间的整数int color; /所放棋子颜色, 1 为黑, 2 为白;class MyListpublic:void init();MyList();virtual MyList();_node* head;_node* now;_node* tail;int siz
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1