




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上一、軟件背景介紹圍棋是一項(xiàng)廣有裨益的智力競(jìng)技運(yùn)動(dòng),它集休閑娛樂(lè)、陶冶性情、修心養(yǎng)性于一身,是中華文化的瑰寶,是人類(lèi)智慧的最高象征之一。圍棋經(jīng)歷了數(shù)千年,久盛不衰,且至今還在不斷發(fā)展。現(xiàn)在的人工智能科學(xué)研究在它面前顯得很是稚嫩,因而值得將它作為重要的研究對(duì)象。在人工智能領(lǐng)域內(nèi),博弈是很重要的一個(gè)研究分支。通過(guò)對(duì)博弈的研究,可以解決很多實(shí)際問(wèn)題,使計(jì)算機(jī)智能向人類(lèi)智能邁進(jìn)。計(jì)算機(jī)國(guó)際象棋和計(jì)算機(jī)圍棋一直是人工智能的熱門(mén)課題,而圍棋程序的編制被稱(chēng)作人工智能的“試金石”,是人工智能技術(shù)的一大難題,它將會(huì)在今后相當(dāng)長(zhǎng)的時(shí)期內(nèi)哺育著人工智能科學(xué)的成長(zhǎng)。計(jì)算機(jī)圍棋是計(jì)算機(jī)博弈研究的
2、一個(gè)重要分支,是當(dāng)前人工智能研究的熱點(diǎn)之一,一直以來(lái)吸引著大量的研究人員,產(chǎn)生了較大的社會(huì)影響和學(xué)術(shù)影響。由于圍棋變化復(fù)雜、棋理深?yuàn)W,是一種高智能的活動(dòng),因而圍棋的計(jì)算機(jī)博弈設(shè)計(jì)難度較大,同時(shí)計(jì)算機(jī)圍棋熱點(diǎn)問(wèn)題的研究為人工智能帶來(lái)了嶄新的方法和理論。計(jì)算機(jī)圍棋的研究和實(shí)現(xiàn)需要多門(mén)學(xué)科的知識(shí)交叉,至少會(huì)涉及到圍棋、計(jì)算機(jī)、數(shù)學(xué)、生物、邏輯學(xué)、軍事學(xué)、教育、心理學(xué)乃至哲學(xué)等領(lǐng)域,因此其發(fā)展具有重要的研究?jī)r(jià)值和應(yīng)用價(jià)值。本系統(tǒng)是基于C+編程語(yǔ)言的立足于“人人”圍棋對(duì)弈系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),具有圍棋記譜、打譜、查看定式、最終評(píng)分等功能,是一個(gè)適宜在計(jì)算機(jī)上聯(lián)網(wǎng)的“人人”的對(duì)弈系統(tǒng)。圍棋勝負(fù)判斷與局面分析功
3、能子系統(tǒng)是圍棋對(duì)弈系統(tǒng)的重要組成部分。圍棋勝負(fù)自動(dòng)判斷是一個(gè)實(shí)用的圍棋對(duì)弈系統(tǒng)所應(yīng)具有的功能。在現(xiàn)實(shí)的圍棋勝負(fù)判斷中,往往需要一個(gè)裁判員通過(guò)做棋來(lái)判斷棋局最終的勝負(fù)。如果有一個(gè)客觀、準(zhǔn)確的圍棋自動(dòng)判斷勝負(fù)系統(tǒng),一方面可以省時(shí)省力,一方面可以做到客觀公正。但實(shí)現(xiàn)一個(gè)具有人(裁判員)一樣的判斷能力的勝負(fù)判斷系統(tǒng),存在著許多困難和挑戰(zhàn)。本系統(tǒng)通過(guò)建立棋局的記錄來(lái)判斷棋盤(pán)上每一點(diǎn)的歸屬,從而確定棋局中雙方地域,故能夠?qū)μ岬羲雷雍蟮慕K局棋盤(pán)用中國(guó)規(guī)則判斷勝負(fù);通過(guò)建立棋子的影響模型、力學(xué)模型以及度量公式,將棋子向棋盤(pán)其它部分輻射的影響量化,從而判斷對(duì)弈雙方的影響領(lǐng)域。論文主要介紹了圍棋對(duì)弈系統(tǒng)中勝負(fù)判斷
4、與局面分析功能子系統(tǒng)具有的功能,論述了子系統(tǒng)的開(kāi)發(fā)和實(shí)現(xiàn)的過(guò)程。該圍棋游戲的主界面如圖1。圖1 圍棋主界面 二、核心算法思想該圍棋軟件主要是由以下三種算法組成的:1、使每個(gè)棋子周?chē)a(chǎn)生某種影響,這種影響隨著距離的增加而減少,用一定的公式計(jì)算疊加種影響,以判斷形勢(shì)和估計(jì)著點(diǎn)的價(jià)值。這與圍棋的棋理相通,即對(duì)于每個(gè)棋子可估算其“勢(shì)力”。此中就有著名的“氣位”理論。2、建立模式庫(kù),貯存了大量模式(定式、棋形等),以供匹配。這其實(shí)涉及到圍棋的許多棋諺與棋理。如“二子頭必扳”、“鎮(zhèn)以飛應(yīng)”、“斷從一邊長(zhǎng)”、三子正中、點(diǎn)方等等。這些都是根據(jù)圍棋的具體情況而設(shè)計(jì)的。3、 對(duì)目標(biāo)明確的局部,用人工智能中的搜索法
5、探求其結(jié)果。(一)圍棋局面分析功能的實(shí)現(xiàn) 這里定義了Stone的數(shù)據(jù)結(jié)構(gòu),用于記錄每一點(diǎn)與棋盤(pán)上已落棋子的距離和受到的影響值,定義如下: Public Type Stone Value As Integer Distance As IntegerEnd Type需要定義顯示地域時(shí)的棋譜Public Map(1 To 19, 1 To 19) As Stone ,用于記錄最后的累加影響。其中Map上每一點(diǎn)Map(i,j)的Distance與value的關(guān)系為:Value = 2 的 (6 - Distance)次方。Map(i,j)的最終影響要通過(guò)計(jì)算影響模型,遞減定律以及反射定律,經(jīng)
6、過(guò)度量公式計(jì)算,大于定值A(chǔ)的點(diǎn)顯示為黑棋地域,小于-A的點(diǎn)顯示為白棋地域。(二) 影響模型由于棋盤(pán)上的每個(gè)棋子都要對(duì)盤(pán)面發(fā)出影響,設(shè)黑棋影響為正,白棋影響為負(fù)。棋盤(pán)上的每一點(diǎn)要受到多個(gè)棋子的累加影響,其中,受到該點(diǎn)最近的棋子影響最大,依次遞減。設(shè)這影響在棋子的緊鄰(距離為1)為最大值32,并隨距離增加而按比例衰減,衰減因子為1/2。就是距離每增加時(shí)影響值減半。此時(shí)一黑子對(duì)其周?chē)椛涞挠绊懭鐖D2。11 2 11 2 4 2 11 2 4 8 4 2 11 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
7、 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 系統(tǒng)使用的影響模型 影響模型的實(shí)現(xiàn),采用循環(huán)嵌套,對(duì)一已落的棋子(i,j),計(jì)算其對(duì)周邊的影響,定義變量row,column,對(duì)于滿(mǎn)足i-6<=row<=i+6, i-6<=column<=i+6的點(diǎn),(row,column)的距離distance為row-i+column-j,并記錄到顯示棋譜Map(19,19)中。(三)力學(xué)模型棋盤(pán)上的每一個(gè)棋子,都向周?chē)膫€(gè)方向發(fā)出影響,通過(guò)這種影響實(shí)現(xiàn)對(duì)空點(diǎn)的占領(lǐng)和棋子之間的相互作用,
8、這種影響可以被視為一種控制力,沿四個(gè)方向大小相等,而黑白棋子產(chǎn)生的控制力符號(hào)相反??刂屏Ξa(chǎn)生后,沿它的方向向前傳播,其傳播方式遵守如下規(guī)律:1、遞減規(guī)律控制力遇到一個(gè)點(diǎn)后,力的大小被減弱,符號(hào)方向不變地繼續(xù)向前傳播。如果遇到空點(diǎn),減弱后的控制力變?yōu)樵瓉?lái)的一個(gè)常數(shù)倍(取1/2),該常數(shù)被稱(chēng)為傳播率;如果遇到有子點(diǎn),沿原方向的控制力消減。棋子(i,j)在傳播過(guò)程中,如遇到另一棋子(m,n),則同方向的距離distance+2,即受到的影響值減1/4倍。2、反射定律由于在圍棋中邊角更容易受到棋子的影響,有“金角銀邊”之稱(chēng)。故在實(shí)現(xiàn)時(shí)設(shè)計(jì)了反射定律??刂屏Φ竭_(dá)棋盤(pán)邊緣后,會(huì)被反射回來(lái),該反射力與原控制
9、力方向相反,符號(hào)相同,大小為原控制力的一個(gè)常數(shù)倍,該常數(shù)被稱(chēng)為反射率。實(shí)現(xiàn)時(shí),棋子(i,j)在傳播過(guò)程中,利用row,column雙重循環(huán),如遇到row=1或19,則同方向的距離distance-row-i;如遇到column=1或19,則同方向的距離distance-column-j。每一個(gè)點(diǎn)都受到四個(gè)方向的控制力的作用,任一方向的控制力的大小是這個(gè)點(diǎn)所受這個(gè)方向所有控制力的代數(shù)和。在實(shí)際計(jì)算時(shí),取:(1)任意棋子產(chǎn)生的初始控制力的大小為64;(2)黑子的影響為正、白子的影響為負(fù);(3)傳播率為1/2;(4)反射率為1;3、度量公式在得到任一棋盤(pán)狀態(tài)下個(gè)空點(diǎn)影響的分布圖后,可以由這些影響值經(jīng)
10、過(guò)計(jì)算得到一些棋盤(pán)狀態(tài)的深層信息,一些常用的度量公式如下。設(shè)一個(gè)點(diǎn)受到的四個(gè)控制力大小為:向上F0,向右F1,向下F2,向左F3。總力:F=F0+F1+F2+F3表示一個(gè)點(diǎn)受到某一方影響的度量。 F0:受黑的影響強(qiáng)一些; F0:受白的影響強(qiáng)一些; F0: 雙方的影響基本平衡。4、判定雙方的勢(shì)力范圍對(duì)于每一點(diǎn),它受到的總控制力F=F0+F1+F2+F3,當(dāng)F大于某一數(shù)值n時(shí),將其顯示為地域。當(dāng)F0時(shí)受黑的影響強(qiáng)一些,該點(diǎn)能被黑方所控制,作為黑方實(shí)地,顯示為黑方地域,反之,為白棋的勢(shì)力范圍。在顯示中規(guī)定:如果該點(diǎn)所受四個(gè)方向的力均大于0,且F大于20,則該點(diǎn)為黑方勢(shì)力范圍。對(duì)于白方的勢(shì)力范圍有類(lèi)似
11、的判斷規(guī)則。(四)圍棋勝負(fù)的判斷方法雙方下子完畢的棋局,計(jì)算勝負(fù)采用數(shù)子法。 先將雙方死子全部清理出盤(pán)外,然后對(duì)一方的活棋(包括活棋圍住的點(diǎn))以子為單位進(jìn)行計(jì)數(shù)。 雙方活棋之間的空點(diǎn)各得一半,一個(gè)點(diǎn)即為一子。 勝負(fù)的基準(zhǔn)以棋局總點(diǎn)數(shù)的一半180又1/2點(diǎn)為歸本數(shù)。凡一方活棋與所屬空點(diǎn)的總和大于此數(shù)者為勝,小于此數(shù)者為負(fù),等于此數(shù)者為和。三、核心算法流程圖(一)判定雙方的勢(shì)力范圍對(duì)于每一點(diǎn),它受到的總控制力F=F0+F1+F2+F3,當(dāng)F大于某一數(shù)值n時(shí),將其顯示為地域。當(dāng)F0時(shí)受黑的影響強(qiáng)一些,該點(diǎn)能被黑方所控制,作為黑方實(shí)地,顯示為黑方地域,反之為白棋的勢(shì)力范圍。在顯示中規(guī)定:如果該點(diǎn)所受四
12、個(gè)方向的力均大于0,且F大于20,則該點(diǎn)為黑方勢(shì)力范圍。對(duì)于白方的勢(shì)力范圍有類(lèi)似的判斷規(guī)則。雙方的勢(shì)力范圍的實(shí)現(xiàn)流程圖如圖3。雙 方 勢(shì) 力 范 圍處于邊或角畫(huà)出顯示地域用棋盤(pán)畫(huà)出對(duì)弈雙方棋子 是 否 反射定律行數(shù)<=19列數(shù)<=19 傳播中受到其它子阻擋 否是否 影響范圍內(nèi) 是遞減定律影響模型度 量 公 式顯 示 勢(shì) 力畫(huà)出雙方控制地域結(jié)束圖3 局面分析實(shí)現(xiàn)流程圖(二)判斷圍棋輸贏這里定義了Item的數(shù)據(jù)結(jié)構(gòu),用于記錄每一枚棋子的顏色及搜索的狀態(tài):Public Type Items Value As Integer Checked As BooleanEnd Type定義終局棋譜
13、數(shù)組:Public m_GameOverMap(1 To 19, 1 To 19) As Items,終局的每一結(jié)點(diǎn)存儲(chǔ)為Item結(jié)構(gòu),記錄每一點(diǎn)的歸屬。對(duì)待盤(pán)棋局(用m_Map(19,19)記錄)上每一點(diǎn)用循環(huán)掃描,記錄每一點(diǎn)是哪一方的領(lǐng)域。 下圖為判斷圍棋勝負(fù)的流程圖。 計(jì) 為 單 官確定該點(diǎn)顏色總 數(shù) 加 1填 入 黑 子單官為奇數(shù)該黑方落子是判 斷 勝 負(fù)行數(shù) <= 19列數(shù) <= 19被同色棋包圍否判 斷 勝 負(fù) 行數(shù)= 19列數(shù)= 19 否 是被同色棋子圍計(jì) 為 單 官 是白 總 數(shù) 減 1 填 入 白 子 黑 否帖 子 計(jì) 算總 數(shù) 減 1顯示勝負(fù) 否 是總 數(shù) 加
14、1結(jié) 束 圖 4 勝負(fù)判斷實(shí)現(xiàn)流程圖四、源代碼下面給出的是實(shí)現(xiàn)聯(lián)網(wǎng)對(duì)戰(zhàn)游戲的源代碼:#include "MyStack.h"#include "MyList.h"#include "MyOutFunction.h"#pragma once#include <string>using namespace std;#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000struct pointint p_x; /x坐標(biāo),1-19間的整數(shù)int p_y; /y坐標(biāo)
15、,1-19間的整數(shù)int color; /所放棋子顏色,1為黑,2為白;struct _nodepoint data;_node* next;_node* pre;class CChessPos public:BOOL visit_for_DeadOrLive;/訪問(wèn)標(biāo)識(shí),用于遞歸算法BOOL visit_for_DeleteDead;CRect chessman(CPoint point); /該位置所在矩形區(qū)域int nFlag; /該位置狀態(tài)標(biāo)識(shí)CPoint point; /該位置坐標(biāo)CChessPos* pLeft; /指向該位置的四個(gè)鄰接點(diǎn)CChessPos* pRight;CChe
16、ssPos* 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 in
17、t EDGE = 3; /邊界以外class MyList 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(); /根據(jù)函數(shù)format定義的格式遍歷鏈表,step記錄結(jié)點(diǎn)遍歷到了第幾個(gè)結(jié)點(diǎn)void printList(void(*format)(void* e,void* steptag),
18、int step);void del(); /刪除鏈表最后一個(gè)元素void clearList(); /清空鏈表bool searchele(int x, int y);/遍歷鏈表;struct _state/保存棋盤(pán)中每個(gè)格子的臨時(shí)狀態(tài),以判別處于該位置的棋子是否能存活int x; /在棋盤(pán)中的橫坐標(biāo)int y; /在棋盤(pán)中的縱坐標(biāo)int fangxiang;int color;int footprint; int dead; /處于此格子的棋子可能死亡;struct _statenode_state s;_statenode* next;class MyStackpublic:_state
19、node* head;int size; /堆棧大小MyStack();virtual MyStack();void init(); /初始化void push(_state* s); /入棧_state* pop(); /出棧bool isEmpty(); /判斷是否為空void print(); /輸出;ON_COMMAND(ID_APP_ABOUT, OnAppAbout) /ClassWizard將添加和刪除映射宏。/ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAP /基于標(biāo)準(zhǔn)的文件文檔的命
20、令ON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen) /標(biāo)準(zhǔn)的打印設(shè)置命令ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp:OnFilePrintSetup)END_MESSAGE_MAP()public:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/ Attributespublic:CPoint pointBegin;/左上角坐標(biāo)int nDis
21、tance;/每格間距int nRadium;/點(diǎn)的半徑int r;/圍棋半徑int nCount;/下的數(shù)目CRect m_rectEllipse1919;/當(dāng)前圍棋子所在矩形int nSign2121;/點(diǎn)標(biāo)志int nOldSign2121;/吃掉前的標(biāo)志int nChainRow1920;/存放水平方向的點(diǎn)標(biāo)志之間的關(guān)系int nChainCol2019;/存放豎直方向的點(diǎn)標(biāo)志之間的關(guān)系int nBorder;/棋盤(pán)邊界寬度int nBackSign2121;/前次位置標(biāo)志備份int nBackTwoTimesBeforeSign2121; /前兩次位置標(biāo)志備份int nBackThr
22、eeTimesBeforeSign2121; /前兩次位置標(biāo)志備份int nBackOldSign2121;int nBackChainRow1920;int nBackChainCol2019;int nBackCount;int nBackCountTwoTimesBefore;/前兩次統(tǒng)計(jì)備份CPoint pointForGoPrompt;/下子提示點(diǎn)CPoint pointForRegret;/悔棋按鈕CPoint pointForWhiteCalculate;/顯示統(tǒng)計(jì)時(shí)白棋標(biāo)志的位置CPoint pointForBlackCalculate;CPoint pointForIlleg
23、al;/非法提示int nCalculateWhite;/白子統(tǒng)計(jì)int nCalculateBlack;/黑子統(tǒng)計(jì)int nBackCalculateWhite;/白子統(tǒng)計(jì)備份int nBackCalculateBlack;/黑子統(tǒng)計(jì)備份BOOL fIllegal;/非法走步標(biāo)志BOOL fRegretOnlyOnce;/只許悔棋一次/=/位圖有關(guān)定時(shí)器有關(guān)/=/CBitmap m_BitmapToRight;CRect m_rectBitmapToRight;int m_nBitmapToRightHeight;int m_nBitmapToRightWidth;CBitmap m_Bit
24、mapToLeft;CRect m_rectBitmapToLeft;int m_nBitmapToLeftHeight;int m_nBitmapToLeftWidth;struct _statenode_state s;_statenode* next;class MyStackpublic:_statenode* head;int size; /堆棧大小MyStack();virtual MyStack();UINT m_timer; /計(jì)時(shí)器標(biāo)志BOOL m_fAlternate;BOOL m_fClear;/ Operationspublic:virtual BOOL OnNewDo
25、cument();virtual void Serialize(CArchive& ar);CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPclass CWQDoc : public CDocumentprotected: / create
26、from serialization onlyCWQDoc();DECLARE_DYNCREATE(CWQDoc)public:virtual BOOL OnNewDocument();virtual void Serialize(CArchive& ar);public:BOOL m_bGameStartEnable;/"開(kāi)始游戲"是否有效BOOL Initialization(); /新建文檔初始化函數(shù)BOOL m_bEnable;/判斷是否可以落子UINT nGameMode;/游戲模式UINT nComNum;/所選擇的串口號(hào)CMSComm m_MSComm
27、;/定義串口對(duì)象m_MSCommBOOL reback; /悔棋e(cuò)nable標(biāo)識(shí)int backup_scene1919; /備份前次場(chǎng)景int cur_scene1919; /當(dāng)前場(chǎng)景int pre_scene1919; /前次場(chǎng)景int last_scene1919; /上次場(chǎng)景#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifMyList();virtual MyList();_node* head;_node* now;_node* tail
28、;int size;void add(_node* newNode);void add(int x, int y,int color);bool isEmpty();void printList();/根據(jù)函數(shù)format定義的格式遍歷鏈表,step記錄結(jié)點(diǎn)遍歷到了第幾個(gè)結(jié)點(diǎn)void printList(void(*format)(void* e,void* steptag),int step);void del();/刪除鏈表最后一個(gè)元素void clearList();bool searchele(int x, int y);#include "PublicStruct.h&qu
29、ot;class CWeiQi public:CWeiQi();virtual CWeiQi();public:BOOL TiZi(int x,int y);short GetPointType(int x,int y);void ClearNodes();void Init();void Init2();/小棋盤(pán)void ClearBoardFlag();protected:class CWeiQ1_0View : public CViewprotected: CWeiQ1_0View();DECLARE_DYNCREATE(CWeiQ1_0View)private:void DrawChe
30、ssboard(CDC* pDC,CPoint top_left,COLORREF bkcolor,int space, int radius);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(LPCREATESTRUCT lpCreateStruct);afx_msg void OnComm(); CChes
31、sPos outside;/虛擬棋子位置,用于處理邊界問(wèn)題CPoint origin; /棋盤(pán)初始點(diǎn)int nStep; /畫(huà)筆跳躍步幅int nHost; /落子權(quán)標(biāo)志CChessPos CurPos1919;/用于存儲(chǔ)棋盤(pán)19×19點(diǎn)位信息virtual CWQDoc();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifpublic:void reback_scene(int comeback1919);/當(dāng)前場(chǎng)景恢復(fù)到comebac
32、kvoid save_scene(int save1919);/保存當(dāng)前場(chǎng)景到savevoid copy_scene(int from1919, int to1919); /復(fù)制場(chǎng)景from到toBOOL compare_scene(int A1919, int B1919);/比較場(chǎng)景A和B,相同-true,不同-falsevoid un_visit();/恢復(fù)各位置訪問(wèn)標(biāo)識(shí)void deal_neighbor(CChessPos *mid);/處理mid周?chē)惿遄觱oid del_dead(CChessPos *dead);/以dead為起點(diǎn)提掉與其相連的同色棋子BOOL dead_or
33、_live(CChessPos *mid);/判斷mid是死棋還是活棋void change_nHost();/轉(zhuǎn)換落子權(quán)CPoint locate(CPoint pt);/將單擊點(diǎn)pt矯正到最近的棋盤(pán)點(diǎn)位,返回該點(diǎn)位坐標(biāo)virtual CWQView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifclass CWeiQ1_0Doc : public CDocumentprotected: / create from serializatio
34、n onlyCWeiQ1_0Doc();DECLARE_DYNCREATE(CWeiQ1_0Doc)/ Attributespublic:virtual BOOL OnNewDocument();virtual void Serialize(CArchive& ar);AFX_VIRTUALpublic:bool m_modified;char* m_openedFilename;MyList m_nowlist;/保存棋盤(pán)上剩下的棋子的信息int m_qiju2121;/保存棋盤(pán)要顯示的信息,主要是易于判斷吃子MyList m_historylist;/保存曾經(jīng)走過(guò)的每一步int m
35、_radius;int m_space;COLORREF m_bkcolor;CPoint m_topleft;virtual CWeiQ1_0Doc();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;struct pointint p_x;/x坐標(biāo),1-19間的整數(shù)int p_y;/y坐標(biāo),1-19間的整數(shù)int color;/所放棋子顏色,1為黑,2為白;class MyList public:void init();MyList();virtual M
36、yList();_node* head;_node* now;_node* tail;int size;void add(_node* newNode);void add(int x, int y,int color);bool isEmpty();void printList(); /根據(jù)函數(shù)format定義的格式遍歷鏈表,step記錄結(jié)點(diǎn)遍歷到了第幾個(gè)結(jié)點(diǎn)void printList(void(*format)(void* e,void* steptag),int step);void del(); /刪除鏈表最后一個(gè)元素void clearList(); /清空列表bool search
37、ele(int x, int y); /搜索鏈表; / MyOutFunction.h: interface for the MyOutFunction class.#endif / _MSC_VER > 1000class MyOutFunction public:static bool saveQipu(MyList list,char* fileName);static char* _CStringToChars(CString string );static bool readQipu(MyList& list, char* fileName);static void i
38、nitQiju(int qiju2121);static bool moni(int qiju2121, MyList list);static _state* creatState(int x,int y,int color,int fangxiang,int footprint, int dead);/創(chuàng)建一顆棋子static bool isTong(_state go2121,int& x,int& y,int& end);/判斷處于該格子的棋子按某個(gè)方向能否走出該格子 /判斷goxy能否存活,若不能存活,則將和goxy一起不能存活的子消掉static bool
39、isLive(int go2121,int x, int y, int color);MyOutFunction();virtual MyOutFunction();#endif #if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000struct _state/保存棋盤(pán)中每個(gè)格子的臨時(shí)狀態(tài),以判別處于該位置的棋子是否能存活int x;/在棋盤(pán)中的橫坐標(biāo)int y;/在棋盤(pán)中的縱坐標(biāo)int fangxiang;/從此格子走向下一格子的方向-1:向右走,2:向左走,3:向上走,4:向下走int color;/此棋子的性質(zhì);0:沒(méi)有
40、棋子,1:黑子,2:白子,3:邊界int footprint;/是否來(lái)過(guò)試探過(guò)這顆棋子;1:是,0:否int dead;/處于此格子的棋子可能死亡;struct _statenode_state s;_statenode* next;class MyStackpublic:_statenode* head;int size;/堆棧大小MyStack();virtual MyStack();void init();void push(_state* s);/入棧_state* pop();/出棧bool isEmpty();/判斷是否棧為空void print();#if _MSC_VER &g
41、t; 1000#pragma once#endif / _MSC_VER > 1000struct pointint p_x;/x坐標(biāo),1-19間的整數(shù)int p_y;/y坐標(biāo),1-19間的整數(shù)int color;/所放棋子顏色,1為黑,2為白;struct _nodepoint data;_node* next;_node* pre;class MyList public:void init();MyList();virtual MyList();_node* head;_node* now;_node* tail;int size;short GetPointType(int x,i
42、nt y);void ClearNodes();void Init();void Init2();/小棋盤(pán)void ClearBoardFlag();int save5001919; /記錄500步的棋局int saveDigtal5001919;int bak;/棋局第多少步int board1919;/當(dāng)前步狀態(tài),0:空,1:黑,2:白int boardDigtal1919;ChessBoard boardFlag1919;/右邊小棋盤(pán)用int board21919;/當(dāng)前步狀態(tài),0:空,1:黑,2:白int boardDigtal21919;ChessNode* m_pOpen;Ches
43、sNode* m_pClosed;void popClosed();void pushClosed( short x, short y, short type, short index, char* strinfo, short nodeIndex );void add(_node* newNode);void add(int x, int y,int color);bool isEmpty();void printList();/根據(jù)函數(shù)format定義的格式遍歷鏈表,step記錄結(jié)點(diǎn)遍歷到了第幾個(gè)結(jié)點(diǎn)void printList(void(*format)(void* e,void* st
44、eptag),int step);void del();/刪除鏈表最后一個(gè)元素void clearList();bool searchele(int x, int y);#include "PublicStruct.h"class CWeiQi public:CWeiQi();virtual CWeiQi();public:BOOL TiZi(int x,int y);short GetPointType(int x,int y);void ClearNodes();void Init();void Init2();/小棋盤(pán)void ClearBoardFlag();/記錄
45、500步的棋局int save5001919;int saveDigtal5001919;int bak;/棋局第多少步int board1919;/當(dāng)前步狀態(tài),0:空,1:黑,2:白int boardDigtal1919;ChessBoard boardFlag1919;/右邊小棋盤(pán)用int board21919;/當(dāng)前步狀態(tài),0:空,1:黑,2:白int boardDigtal21919;ChessNode* m_pOpen;ChessNode* m_pClosed;void popClosed();void pushClosed( short x, short y, short type
46、, short index, char* strinfo, short nodeIndex );private:void popOpen();void pushOpen( short x, short y, short type, short index, char* strinfo, short nodeIndex );BOOL IsNotEmpty(int x,int y);BOOL Search(int x, int y);BOOL CheckInClosed(int x, int y);BOOL SearchOne(int x, int y);public:short m_OPMain
47、;short m_fireCC;/讓子數(shù);struct ChessBoard/棋盤(pán)short sType;short sMA;short sTR;short sSQ;short sLB;#define MAXSTEP 20#define MAXPOINT 80#define MAXSTRLENGTH 2000#define MAXSTRHEADER 300struct ChessNode/棋鏈short x;/位置Xshort y;/位置Yshort type;/0,空,1,黑,2,白short index;/當(dāng)前棋子數(shù)char* strInfo;/說(shuō)明short NodeIndex;/分支索
48、引short* treePos;/所處位置的記錄POINT* pt;/“LB”說(shuō)明點(diǎn)的位置short* lbIndex;POINT* MApt;/“MA”說(shuō)明點(diǎn)的位置POINT* SQpt;/“SQ”說(shuō)明點(diǎn)的位置POINT* TRpt;/“TR”說(shuō)明點(diǎn)的位置int numChildren;ChessNode* next;public:BOOL TiZi(int x,int y);short GetPointType(int x,int y);void ClearNodes();void Init();void Init2();/小棋盤(pán)void ClearBoardFlag();/記錄500步的棋局int save5001919;int saveDigtal5001919;int bak;/棋局第多少步int board1919;/當(dāng)前步狀態(tài),0:空,1:黑,2:白int boardDigtal1919;ChessBoard boardFlag1919;/右邊小棋盤(pán)用int board21919;/當(dāng)前步狀態(tài),0:空,1:黑,2:白i
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 團(tuán)員入隊(duì)儀式活動(dòng)方案
- 國(guó)慶個(gè)人活動(dòng)方案
- 周大福雙節(jié)活動(dòng)方案
- 商家招募活動(dòng)方案
- 國(guó)際家庭日活動(dòng)方案
- 四年級(jí)上冊(cè)寫(xiě)信活動(dòng)方案
- 糖尿病的日常護(hù)理
- 中國(guó)文字培訓(xùn)
- 心肺復(fù)蘇活動(dòng)策劃流程
- 大面積燒傷的排痰護(hù)理
- 心腦血管疾病-高血壓-課件
- 血清CK-MB活力假性增高原因分析及臨床意義課件
- 最新國(guó)家開(kāi)放大學(xué)電大《調(diào)劑學(xué)》形考任務(wù)4試題及答案
- 五制配套的基層管理模式
- 有機(jī)磷農(nóng)藥中毒(新)課件
- 室性早搏的定位診斷與鑒別共26張課件
- 人防卷材防水層工程檢驗(yàn)批質(zhì)量驗(yàn)收記錄表
- DB11T 716-2019 穿越既有道路設(shè)施工程技術(shù)要求
- 濕式氧化技術(shù)
- T∕CACM 1316-2019 中醫(yī)內(nèi)科臨床診療指南 中風(fēng)后吞咽困難
- 于新華中考專(zhuān)題2018
評(píng)論
0/150
提交評(píng)論