




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、、軟件背景介紹圍棋是一項(xiàng)廣有裨益的智力競(jìng)技運(yùn)動(dòng),它集休閑娛樂、陶冶性情、 修心養(yǎng)性于一身,是 中華文化的瑰寶,是人類智慧的最高象征之一。圍棋經(jīng)歷了數(shù)千年,久盛不衰,且至今還在 不斷發(fā)展。 現(xiàn)在的人工智能科學(xué)研究在它面前顯得很是稚嫩, 因而值得將它作為重要的研究 對(duì)象。 在人工智能領(lǐng)域內(nèi),博弈是很重要的一個(gè)研究分支。通過對(duì)博弈的研究,可以解決很 多實(shí)際問題, 使計(jì)算機(jī)智能向人類智能邁進(jìn)。 計(jì)算機(jī)國(guó)際象棋和計(jì)算機(jī)圍棋一直是人工智能 的熱門課題, 而圍棋程序的編制被稱作人工智能的 “試金石”,是人工智能技術(shù)的一大難題, 它將會(huì)在今后相當(dāng)長(zhǎng)的時(shí)期內(nèi)哺育著人工智能科學(xué)的成長(zhǎng)。計(jì)算機(jī)圍棋是計(jì)算機(jī)博弈研究的
2、一個(gè)重要分支, 是當(dāng)前人工智能研究的熱點(diǎn)之一, 一直 以來吸引著大量的研究人員, 產(chǎn)生了較大的社會(huì)影響和學(xué)術(shù)影響。 由于圍棋變化復(fù)雜、 棋理 深?yuàn)W, 是一種高智能的活動(dòng), 因而圍棋的計(jì)算機(jī)博弈設(shè)計(jì)難度較大, 同時(shí)計(jì)算機(jī)圍棋熱點(diǎn)問 題的研究為人工智能帶來了嶄新的方法和理論。計(jì)算機(jī)圍棋的研究和實(shí)現(xiàn)需要多門學(xué)科的知識(shí)交叉, 至少會(huì)涉及到圍棋、 計(jì)算機(jī)、 數(shù)學(xué)、 生物、邏輯學(xué)、軍事學(xué)、教育、心理學(xué)乃至哲學(xué)等領(lǐng)域,因此其發(fā)展具有重要的研究?jī)r(jià)值和 應(yīng)用價(jià)值。本系統(tǒng)是基于 C+編程語言的立足于“人一人”圍棋對(duì)弈系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),具有圍棋 記譜、打譜、查看定式、最終評(píng)分等功能,是一個(gè)適宜在計(jì)算機(jī)上聯(lián)網(wǎng)的“人一
3、人”的對(duì)弈 系統(tǒng)。圍棋勝負(fù)判斷與局面分析功能子系統(tǒng)是圍棋對(duì)弈系統(tǒng)的重要組成部分。圍棋勝負(fù)自動(dòng)判斷是一個(gè)實(shí)用的圍棋對(duì)弈系統(tǒng)所應(yīng)具有的功能。 在現(xiàn)實(shí)的圍棋勝負(fù)判斷中, 往往需要一個(gè)裁 判員通過做棋來判斷棋局最終的勝負(fù)。 如果有一個(gè)客觀、 準(zhǔn)確的圍棋自動(dòng)判斷勝負(fù)系統(tǒng), 一 方面可以省時(shí)省力, 一方面可以做到客觀公正。但實(shí)現(xiàn)一個(gè)具有人 (裁判員)一樣的判斷能 力的勝負(fù)判斷系統(tǒng), 存在著許多困難和挑戰(zhàn)。 本系統(tǒng)通過建立棋局的記錄來判斷棋盤上每一 點(diǎn)的歸屬,從而確定棋局中雙方地域, 故能夠?qū)μ岬羲雷雍蟮慕K局棋盤用中國(guó)規(guī)則判斷勝負(fù); 通過建立棋子的影響模型、 力學(xué)模型以及度量公式, 將棋子向棋盤其它部分輻射
4、的影響量化, 從而判斷對(duì)弈雙方的影響領(lǐng)域。論文主要介紹了圍棋對(duì)弈系統(tǒng)中勝負(fù)判斷與局面分析功能子系統(tǒng)具有的功能,論述了子系統(tǒng)的開發(fā)和實(shí)現(xiàn)的過程。該圍棋游戲的主界面如圖 1。圖 1 圍棋主界面、核心算法思想該圍棋軟件主要是由以下三種算法組成的:1、使每個(gè)棋子周圍產(chǎn)生某種影響,這種影響隨著距離的增加而減少,用一定的公式計(jì) 算疊加種影響, 以判斷形勢(shì)和估計(jì)著點(diǎn)的價(jià)值。 這與圍棋的棋理相通, 即對(duì)于每個(gè)棋子可估 算其“勢(shì)力” 。此中就有著名的“氣位”理論。2、建立模式庫,貯存了大量模式(定式、棋形等),以供匹配。這其實(shí)涉及到圍棋的許多棋諺與棋理。如“二子頭必扳” 、“鎮(zhèn)以飛應(yīng)” 、“斷從一邊長(zhǎng)” 、三子
5、正中、點(diǎn)方等等。這 些都是根據(jù)圍棋的具體情況而設(shè)計(jì)的。3、對(duì)目標(biāo)明確的局部,用人工智能中的搜索法探求其結(jié)果。(一)圍棋局面分析功能的實(shí)現(xiàn)這里定義了 Stone的數(shù)據(jù)結(jié)構(gòu),用于記錄每一點(diǎn)與棋盤上已落棋子的距離和受到的影響值,定義如下:Public Type StoneValue As IntegerDistance As IntegerEnd Type需要定義顯示地域時(shí)的棋譜 Public Map(1 To 19, 1 To 19) As Stone,用于記錄最后的累加影響。其中 Map上每一點(diǎn) Map(i,j)的Dista nee與value的關(guān)系為:Value = 2 的 (6 - Dist
6、ance) 次方。 Map(i , j )的最終影響要通過計(jì)算影響模型,遞減定律以及反射 定律,經(jīng)過度量公式計(jì)算,大于定值A(chǔ)的點(diǎn)顯示為黑棋地域,小于 -A的點(diǎn)顯示為白棋地域。(二)影響模型由于棋盤上的每個(gè)棋子都要對(duì)盤面發(fā)出影響, 設(shè)黑棋影響為正, 白棋影響為負(fù)。 棋盤上 的每一點(diǎn)要受到多個(gè)棋子的累加影響,其中,受到該點(diǎn)最近的棋子影響最大,依次遞減。設(shè)這影響在棋子的緊鄰(距離為1)為最大值 32,并隨距離增加而按比例衰減,衰減因子為1/2。就是距離每增加1時(shí)影響值減半。此時(shí)一黑子對(duì)其周圍輻射的影響如圖 2。11 2 11 2 4 2 11 2 4 8 4 2 11 2 4 8 16 8 4 2
7、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 系統(tǒng)使用的影響模型 影響模型的實(shí)現(xiàn),采用循環(huán)嵌套,對(duì)一已落的棋子(i ,j ),計(jì)算其對(duì)周邊的影響,定義變量 row, column ,對(duì)于滿足 i-6<=row<=i+6, i-6<=column<=i+6的點(diǎn),( row , column )的距離distanee 為丨row-i | + | column-j
8、|,并記錄到顯示棋譜Map (19, 19)中。(三)力學(xué)模型棋盤上的每一個(gè)棋子, 都向周圍四個(gè)方向發(fā)出影響, 通過這種影響實(shí)現(xiàn)對(duì)空點(diǎn)的占領(lǐng)和 棋子之間的相互作用, 這種影響可以被視為一種控制力,沿四個(gè)方向大小相等,而黑白棋 子產(chǎn)生的控制力符號(hào)相反。 控制力產(chǎn)生后, 沿它的方向向前傳播, 其傳播方式遵守如下規(guī)律:1 、遞減規(guī)律控制力遇到一個(gè)點(diǎn)后, 力的大小被減弱, 符號(hào)方向不變地繼續(xù)向前傳播。 如果遇到空點(diǎn), 減弱后的控制力變?yōu)樵瓉淼囊粋€(gè)常數(shù)倍(取 1/2 ),該常數(shù)被稱為傳播率;如果遇到有子點(diǎn), 沿原方向的控制力消減。棋子(i , j )在傳播過程中,如遇到另一棋子( m n),則同方向 的
9、距離 distance+2 ,即受到的影響值減 1/4 倍。2、反射定律由于在圍棋中邊角更容易受到棋子的影響,有 “金角銀邊”之稱。 故在實(shí)現(xiàn)時(shí)設(shè)計(jì)了反 射定律。 控制力到達(dá)棋盤邊緣后, 會(huì)被反射回來, 該反射力與原控制力方向相反, 符號(hào)相同, 大小為原控制力的一個(gè)常數(shù)倍,該常數(shù)被稱為反射率。 實(shí)現(xiàn)時(shí),棋子(i , j)在傳播過程中,利用 row,column 雙重循環(huán),如遇到 row=1 或 19,則同方向的距離 distance- | row-i |; 如遇到 column=1 或 19,則同方向的距離 distance- | column-j |。每一個(gè)點(diǎn)都受到四個(gè)方 向的控制力的作用,
10、任一方向的控制力的大小是這個(gè)點(diǎn)所受這個(gè)方向所有控制力的代數(shù)和。在實(shí)際計(jì)算時(shí),?。海?1)任意棋子產(chǎn)生的初始控制力的大小為64;( 2)黑子的影響為正、白子的影響為負(fù);( 3)傳播率為 1/2 ;3(4)反射率為1 ;3、度量公式在得到任一棋盤狀態(tài)下個(gè)空點(diǎn)影響的分布圖后,可以由這些影響值經(jīng)過計(jì)算得到一些棋 盤狀態(tài)的深層信息,一些常用的度量公式如下。設(shè)一個(gè)點(diǎn)受到的四個(gè)控制力大小為:向上F0,向右F1,向下F2,向左F3??偭Γ篎=F0+F1+F2+F3表示一個(gè)點(diǎn)受到某一方影響的度量。F > 0:受黑的影響強(qiáng)一些;F < 0:受白的影響強(qiáng)一些;F = 0:雙方的影響基本平衡。4、判定雙方
11、的勢(shì)力范圍對(duì)于每一點(diǎn),它受到的總控制力F=F0+F1+F2+F3,當(dāng)丨F丨大于某一數(shù)值 n時(shí),將其顯示為地域。當(dāng)F> 0時(shí)受黑的影響強(qiáng)一些,該點(diǎn)能被黑方所控制,作為黑方實(shí)地,顯示為黑 方地域,反之,為白棋的勢(shì)力范圍。在顯示中規(guī)定:如果該點(diǎn)所受四個(gè)方向的力均大于0,且F大于20,則該點(diǎn)為黑方勢(shì)力范圍。對(duì)于白方的勢(shì)力范圍有類似的判斷規(guī)則。(四)圍棋勝負(fù)的判斷方法雙方下子完畢的棋局,計(jì)算勝負(fù)采用數(shù)子法。先將雙方死子全部清理出盤外,然后對(duì)一方的活棋(包括活棋圍住的點(diǎn))以子為單位進(jìn)行計(jì)數(shù)。雙方活棋之間的空點(diǎn)各得一半,一個(gè)點(diǎn)即為一子。勝負(fù)的基準(zhǔn)以棋局總點(diǎn)數(shù)的一半180又1/2點(diǎn)為歸本數(shù)。凡一方活棋與
12、所屬空點(diǎn)的總和大于此數(shù)者為勝,小于此數(shù)者為負(fù),等于此數(shù)者為和。三、核心算法流程圖(一)判定雙方的勢(shì)力范圍對(duì)于每一點(diǎn),它受到的總控制力F=F0+F1+F2+F3,當(dāng)丨F丨大于某一數(shù)值 n時(shí),將其顯示為地域。當(dāng)F> 0時(shí)受黑的影響強(qiáng)一些,該點(diǎn)能被黑方所控制,作為黑方實(shí)地,顯示為黑 方地域,反之為白棋的勢(shì)力范圍。在顯示中規(guī)定:如果該點(diǎn)所受四個(gè)方向的力均大于0,且F大于20,則該點(diǎn)為黑方勢(shì)力范圍。 對(duì)于白方的勢(shì)力范圍有類似的判斷規(guī)則。雙方的勢(shì)力范圍的實(shí)現(xiàn)流程圖如圖 3。是影響范圍內(nèi)遞減定律度量公式 顯示勢(shì)力 畫出雙方控制地域m_Map( 19, 19)記錄)上影響模型結(jié) 束一圖3局面分析實(shí)現(xiàn)流程
13、圖(二)判斷圍棋輸贏這里定義了 Item的數(shù)據(jù)結(jié)構(gòu),用于記錄每一枚棋子的顏色及搜索的狀態(tài):Public Type ItemsValue As In tegerChecked As Boolea nEnd Type定義終局棋譜數(shù)組:Public m_GameOverMap(1 To 19, 1 To 19) As Items,終局的每結(jié)點(diǎn)存儲(chǔ)為Item結(jié)構(gòu),記錄每一點(diǎn)的歸屬。對(duì)待盤棋局(用每一點(diǎn)用循環(huán)掃描,記錄每一點(diǎn)是哪一方的領(lǐng)域。F圖為判斷圍棋勝負(fù)的流程圖。判判斷斷生勝負(fù)負(fù)行數(shù)否圍否確疋該點(diǎn)顏色是黑八、是被同色棋包圍9<=919列數(shù)=1是計(jì)為單官計(jì)為單白官總數(shù)減1填入白子總數(shù)減1總數(shù)加1
14、 填入黑子結(jié)束是單官為奇數(shù)算/x 坐標(biāo), 1-19 間的整數(shù)/y 坐標(biāo), 1-19 間的整數(shù)/所放棋子顏色, 1為黑, 2為白/訪問標(biāo)識(shí),用于遞歸算法/該位置所在矩形區(qū)域/該位置狀態(tài)標(biāo)識(shí)/該位置坐標(biāo)/指向該位置的四個(gè)鄰接點(diǎn)圖 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;#i
15、f _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* pLeft;CChessPos* pR
16、ight;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; c
17、onst int 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)(
18、void* e,void* steptag),int step);void del();void clearList();/刪除鏈表最后一個(gè)元素/清空鏈表bool searchele(int x, int y);/ 遍歷鏈表 ;struct _stateint x;/保存棋盤中每個(gè)格子的臨時(shí)狀態(tài),以判別處于該位置的棋子是否能存活/在棋盤中的橫坐標(biāo)int y;int fangxiang;/在棋盤中的縱坐標(biāo)int color;int footprint;int dead;/處于此格子的棋子可能死亡struct _statenode_state s;_statenode* next;class My
19、Stackpublic:_statenode* head;int size;MyStack(); virtual MyStack(); void init();void push(_state* s); _state* pop();/堆棧大小/初始化/入棧/出棧 /判斷是否為空 /輸出;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)的文件文檔的命令ON_COMMAND(
20、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_DA TA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/ Attributespublic:CPoint pointBegin;/左上角坐標(biāo)int nDistance;/每格間距
21、int nRadium;/點(diǎn)的半徑int r;/圍棋半徑int nCount;/下的數(shù)目CRect m_rectEllipse1919;/當(dāng)前圍棋子所在矩形int nSign2121;int nOldSign2121;/點(diǎn)標(biāo)志/吃掉前的標(biāo)志int nChainRow1920;/存放水平方向的點(diǎn)標(biāo)志之間的關(guān)系int nChainCol2019;int nBorder;/存放豎直方向的點(diǎn)標(biāo)志之間的關(guān)系/棋盤邊界寬度int nBackSign2121;int nBackTwoTimesBeforeSign2121; / 前兩次位置標(biāo)志備份 int nBackThreeTimesBeforeSign2
22、121; / 前兩次位置標(biāo)志備份/前次位置標(biāo)志備份int nBackOldSign2121;int nBackChainRow1920;int nBackChainCol2019;int nBackCount;int nBackCountTwoTimesBefore;/前兩次統(tǒng)計(jì)備份bool isEmpty(); void print();CPoint pointForGoPrompt;/下子提示點(diǎn)CPoint pointForRegret;/悔棋按鈕CPoint pointForWhiteCalculate;/顯示統(tǒng)計(jì)時(shí)白棋標(biāo)志的位置CPoint pointForBlackCalculate
23、;CPoint pointForIllegal;/非法提示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_nBitmapToR
24、ightWidth;CBitmap m_BitmapToLeft;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;/ Operationsp
25、ublic:virtual BOOL OnNewDocument(); virtual void Serialize(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 : publi
26、c CDocumentprotected: / create from serialization onlyCWQDoc();DECLARE_DYNCREA TE(CWQDoc)public:virtual BOOL OnNewDocument();virtual void Serialize(CArchive& ar);/" 開始游戲 "是否有效 /新建文檔初始化函數(shù) /判斷是否可以落子 /游戲模式 /所選擇的串口號(hào) /定義串口對(duì)象 m_MSComm /悔棋 enable 標(biāo)識(shí) /備份前次場(chǎng)景 /當(dāng)前場(chǎng)景 /前次場(chǎng)景 /上次場(chǎng)景public:BOOL m_bGam
27、eStartEnable;BOOL Initialization();BOOL m_bEnable;UINT nGameMode;UINT nComNum;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 M
28、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
29、ele(int x, int y);#include "PublicStruct.h"class CWeiQipublic:CWeiQi();virtual 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();DE
30、CLARE_DYNCREA TE(CWeiQ1_0View)private:space, int radius);void DrawChessboard(CDC* pDC,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 T
31、ESTRUCT lpCreateStruct); afx_msg void OnComm();CChessPos outside;CPoint origin;int nStep;int nHost;CChessPos CurPos1919; virtual CWQDoc();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpCont #endif/虛擬棋子位置,用于處理邊界問題/棋盤初始點(diǎn)/畫筆跳躍步幅/落子權(quán)標(biāo)志用于存儲(chǔ)棋盤19X 19點(diǎn)位信息const;22public:void reback_scen
32、e(int comeback1919);/ 當(dāng)前場(chǎng)景恢復(fù)到 comebackvoid 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();void deal_neighbor(CChessPos *mid);void del_dead(CChessPos *dead);BOOL dead_
33、or_live(CChessPos *mid);void change_nHost();CPoint locate(CPoint pt);virtual CWQView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endif/恢復(fù)各位置訪問標(biāo)識(shí)/處理 mid 周圍異色棋子/以dead為起點(diǎn)提掉與其相連的同色棋子/判斷 mid 是死棋還是活棋/轉(zhuǎn)換落子權(quán)/將單擊點(diǎn) pt 矯正到最近的棋盤點(diǎn)位,返回該點(diǎn)位坐標(biāo)class CWeiQ1_0Doc : pub
34、lic CDocumentprotected: / create from serialization only CWeiQ1_0Doc();DECLARE_DYNCREA TE(CWeiQ1_0Doc) / Attributes public:virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar);AFX_VIRTUALpublic:bool m_modified;char* m_openedFilename;/保存棋盤上剩下的棋子的信息/保存棋盤要顯示的信息,主要是易于判斷吃子/保存曾經(jīng)走過的每一步MyL
35、ist m_nowlist;int m_qiju2121;MyList m_historylist;int m_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;/所放棋子
36、顏色, 1 為黑, 2 為白;class MyListpublic: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),
37、int step);void del();/刪除鏈表最后一個(gè)元素void clearList();/ 清空列表bool searchele(int x, int y); / 搜索鏈表;/ MyOutFunction.h: interface for the MyOutFunction class.#endif / _MSC_VER > 1000class MyOutFunctionpublic:static bool saveQipu(MyList list,char* fileName);static char* _CStringToChars(CString string );sta
38、tic bool readQipu(MyList& list, char* fileName);static void initQiju(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); /判斷處
39、于該格子的棋子按某個(gè)方向能否走出該格子/ 判斷 goxy 能否存活,若不能存活,則將和 goxy 一起不能存活的子消掉 static bool isLive(int go2121,int x, int y, int color);MyOutFunction();virtual MyOutFunction();#endif#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000struct _state/ 保存棋盤中每個(gè)格子的臨時(shí)狀態(tài),以判別處于該位置的棋子是否能存活int x;int y;int fangxiang;int co
40、lor;int footprint;int dead;struct _statenode_state s;_statenode* next; ;class MyStackpublic:_statenode* head; int size;/在棋盤中的橫坐標(biāo)/在棋盤中的縱坐標(biāo)/從此格子走向下一格子的方向 -1 :向右走, 2: 向左走, 3:向上走, 4:向下走/此棋子的性質(zhì); 0:沒有棋子, 1:黑子, 2:白子 ,3:邊界 /是否來過試探過這顆棋子; 1:是, 0:否/處于此格子的棋子可能死亡/堆棧大小MyStack(); virtual MyStack(); void init();voi
41、d push(_state* s); _state* pop();bool isEmpty();void print();#if _MSC_VER > 1000 #pragma once#endif / _MSC_VER > 1000 struct pointint p_x;int p_y;int color;struct _node/入棧/出棧/判斷是否棧為空/x 坐標(biāo), 1-19 間的整數(shù)/y 坐標(biāo), 1-19 間的整數(shù)/所放棋子顏色, 1 為黑, 2 為白point data;_node* next;_node* pre; ;class MyListpublic:void i
42、nit();MyList(); virtual MyList();_node* head;_node* now;_node* tail;int size;short GetPointType(int x,int y);void ClearNodes();void Init();void Init2();/小棋盤void ClearBoardFlag();/記錄 500 步的棋局/棋局第多少步/當(dāng)前步狀態(tài) ,0:空, 1:黑, 2:白/右邊小棋盤用/當(dāng)前步狀態(tài) ,0:空, 1:黑, 2:白int save5001919; int saveDigtal5001919;int bak;int boa
43、rd1919;int boardDigtal1919;ChessBoard boardFlag1919; int board21919;short x, short y, short type, short index, char* strinfo, short nodeIndex)int boardDigtal21919; ChessNode* m_pOpen; ChessNode* m_pClosed; void popClosed(); void pushClosed(void add(_node* newNode);void add(int x, int y,int color);bo
44、ol 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" class CWeiQipublic:CWeiQi(); virtual CWeiQi();public:BOOL Ti
45、Zi(int x,int y); short GetPointType(int x,int y); void ClearNodes();void Init();void Init2();/ 小棋盤void ClearBoardFlag();/ 記錄 500 步的棋局int save5001919;int saveDigtal5001919;int bak;/ 棋局第多少步int board1919;/當(dāng)前步狀態(tài) ,0:空,1:黑, 2:白int boardDigtal1919;ChessBoard boardFlag1919;/右邊小棋盤用int board21919;/當(dāng)前步狀態(tài) ,0:空,
46、1:黑, 2:白int boardDigtal21919;ChessNode* m_pOpen;ChessNode* m_pClosed;void popClosed();void pushClosed( short x, short y, short type, short index, char* strinfo, short nodeIndex ); private:void popOpen();void pushOpen( short x, short y, short type, short index, char* strinfo, short nodeIndex ); BOOL
47、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;/讓子數(shù)/棋盤short m_fireCC; ;struct ChessBoardshort sType; short sMA; short sTR; short sSQ; short sLB;#define MAXSTEP 20 #define MAXPOINT 80#define MAXSTRLENGTH 2000struct
48、 ChessNodeshort x;short y;short type;#define MAXSTRHEADER 300/棋鏈/位置 X/位置 Y/0,空, 1,黑, 2,白short index;/當(dāng)前棋子數(shù)char* strInfo;/說明short NodeIndex;/分支索引short* treePos;/所處位置的記錄POINT* pt;/“LB ”說明點(diǎn)的位置short* lbIndex;POINT* MApt;/“MA ”說明點(diǎn)的位置POINT* SQpt;/ “SQ”說明點(diǎn)的位置POINT* TRpt;/“ TR ”說明點(diǎn)的位置int numChildren;ChessNo
49、de* next;public:BOOL TiZi(int x,int y); short GetPointType(int x,int y); void ClearNodes();void Init();void Init2();/ 小棋盤void ClearBoardFlag();/ 記錄 500 步的棋局int save5001919;int saveDigtal5001919;int bak;/ 棋局第多少步int board1919;/當(dāng)前步狀態(tài) ,0:空,1:黑, 2:白int boardDigtal1919;ChessBoard boardFlag1919;/右邊小棋盤用int board21919;/當(dāng)前步狀態(tài) ,0:空,1:黑, 2:白int boa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025重慶市建筑安全員-B證考試題庫及答案
- 單位安全培訓(xùn)合同范本
- 寫字樓出租三方合同范本
- 北京私人司機(jī)合同范本
- 傳統(tǒng)文化在小學(xué)數(shù)學(xué)教學(xué)中的應(yīng)用
- 農(nóng)場(chǎng)蔬菜大棚承包合同范本
- 化學(xué)教學(xué)中“資料卡片”的應(yīng)用
- 臨時(shí)施工押金合同范本
- 探究式教學(xué)在小學(xué)語文教學(xué)中的運(yùn)用
- SI2302-N溝道MOS管中文數(shù)據(jù)資料
- (中職)中職生創(chuàng)新創(chuàng)業(yè)能力提升教課件完整版
- 中班健康課件《我不挑食》
- 人教版(2024新版)七年級(jí)上冊(cè)英語各單元重點(diǎn)語法知識(shí)點(diǎn)講義
- 生豬屠宰獸醫(yī)衛(wèi)生人員考試題庫答案(414道)
- 《完善中國(guó)特色社會(huì)主義法治體系》課件
- 2025版 高考試題分析-數(shù)學(xué)-部分4
- 湘教版三年級(jí)美術(shù)下冊(cè)教案全冊(cè)
- 重癥監(jiān)護(hù)-ICU的設(shè)置、管理與常用監(jiān)測(cè)技術(shù)
- 2024版高一上冊(cè)語文模擬試卷
- 法律顧問服務(wù)投標(biāo)方案(完整技術(shù)標(biāo))
- 知道網(wǎng)課智慧樹《哲學(xué)導(dǎo)論(湖南師范大學(xué))》章節(jié)測(cè)試答案
評(píng)論
0/150
提交評(píng)論