MFC課程設(shè)計———五子棋_第1頁
MFC課程設(shè)計———五子棋_第2頁
MFC課程設(shè)計———五子棋_第3頁
MFC課程設(shè)計———五子棋_第4頁
MFC課程設(shè)計———五子棋_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、【精品文檔】如有侵權(quán),請聯(lián)系網(wǎng)站刪除,僅供學(xué)習(xí)與交流MFC課程設(shè)計五子棋.精品文檔.Windows程序設(shè)計課程考核報告班 級: 學(xué) 號: 姓 名: 得 分: 2016年6月 25 日1.設(shè)計目的及要求31.1設(shè)計目的及內(nèi)容31.2設(shè)計要求31.3軟件、硬件環(huán)境32.課程設(shè)計步驟43. 課程設(shè)計內(nèi)容153.1 概要設(shè)計153.1.1 程序總體框架描述153.1.2程序常用類聲明163.2主要技術(shù)173.3系統(tǒng)設(shè)計結(jié)果 (界面截圖、操作流程)174.設(shè)計總結(jié)194.1遇到的問題及如何解決194.2體會195.源代碼201.設(shè)計目的及要求 1.1設(shè)計目的及內(nèi)容描述 1. 了解Windows編程的基礎(chǔ)

2、知識,掌握MFC應(yīng)用程序的基本知識;2. 基本掌握面向?qū)ο蟪绦蛟O(shè)計的基本思路和方法;3. 掌握用VC+開發(fā)應(yīng)用程序的的一般步驟和方法;4. 能夠利用所學(xué)的基本知識, 設(shè)計一個簡單的五子棋游戲,具有以下功能:數(shù)據(jù)結(jié)構(gòu)的設(shè)計;五子棋棋盤的繪制。兩人下棋時,兩人下棋算法的設(shè)計。兩人下棋時,判斷任一方獲勝的算法的設(shè)計。1.2設(shè)計要求 用VS 2010進行編碼,實現(xiàn)應(yīng)用程序的功能。注重編碼質(zhì)量,代碼要有適當(dāng)?shù)淖⑨?;提交設(shè)計報告一份(課程設(shè)計任務(wù)書、目錄、主要的數(shù)據(jù)結(jié)構(gòu)、設(shè)計的基本思路、設(shè)計的步驟及主要代碼、心得體會、參考文獻)。游戲規(guī)則: 首先可以在更多選項里面選擇進行人人對戰(zhàn)與人機對戰(zhàn),并可以在人機對

3、戰(zhàn)的功能框里選擇難易程度。當(dāng)棋子連成有五個時游戲結(jié)束。程序功能模塊棋局的繪制、保存、和AI三大塊1.3軟件、硬件環(huán)境 軟件:Windows 10操作系統(tǒng),Microsoft Visual studio 2010 硬件:Inter(R) Core(TM) i5-4200H CPU 3.40GHz2.課程設(shè)計步驟 新建單文檔程序Gobang_FiveChess 接著就是定義變量了,但是,由于這個游戲要添加的變量和函數(shù)太多了,我們要建一個新類。是否應(yīng)該先添加應(yīng)該類呢?最好是這樣。因為新類將會涉及到變量。添加普通類CChessclass CChesspublic:CChess(void);CChess

4、(void);void Init(CRectrect);void Draw(CDC*pDC); / 畫棋局void SetPiecePos(CPointptCurrent);/ 設(shè)置當(dāng)前棋子的位置 下棋函數(shù)void NewGame(); / 新游戲BOOL Regret();/ 悔棋void SetVSMode(enumVSModeemVSMode);/ 設(shè)置對戰(zhàn)模式enumVSModevoid SetAIDepth(intemAIDepth); / 設(shè)置AI智能程度enumWinFlagGetWinFlag(); / 獲取輸贏狀況CRect GetRectBoard(); / 獲取棋盤區(qū)域p

5、rivate:enumChessColorm_iPositionPieceCOLUMNSROWS;/ 棋子的信息CChessDraw m_chessdraw; / 棋局繪制類CRectm_rcBoard; / 棋盤區(qū)域CPointm_ptCurrent; / 棋子當(dāng)前位置enumWinFlag m_emWin; / 輸贏狀況enumVSMode m_emVSMode; / 對戰(zhàn)模式 STC_REGRET m_stcLastPos; / 記錄最近一次的下棋位置 BOOL m_bTurnBlack; / 是否輪到黑方下棋 int m_emAIDepth; / AI智能程度 為方便外部調(diào)用SetAI

6、Depth(),所以設(shè)為了int類型BOOL IsWin(UINTuiCol,UINTuiRow,enumChessColor emChessColor); / 在第uiCol列第uiRow行,判斷是否結(jié)束,若結(jié)束則返回TRUE BOOL GetBestPosByAI(UINT&uiCol,UINT&uiRow,enumChessColor emEnemyChessColor = BLACK); / 獲取最好的下棋位置,機器都為白色添加函數(shù):構(gòu)造函數(shù):CChess:CChess(void) m_bTurnBlack = TRUE;m_emWin= FIGHTING;m_emVS

7、Mode = PERSON_VS_MACHINE; m_emAIDepth = AI_MIDDLE; m_ptCurrent= CPoint(-1,-1);/ 只要不在棋盤內(nèi)的點都可以memset(m_iPositionPiece,0,sizeof(m_iPositionPiece); m_stcLastPos.iPieceNum = 0; m_stcLastPos.ptBlack = CPoint(0,0); m_stcLastPos.ptWhite = CPoint(0,0); m_stcLastPos.ptLastCurPoint = CPoint(-1,-1);畫圖函數(shù):void CC

8、hess:Draw(CDC*pDC)CMyMemDCmemDC(pDC);m_chessdraw.SetDC(memDC);m_chessdraw.DrawBackground();m_chessdraw.DrawBoard();/ - 重畫整個棋局 - if(FIGHTING= m_emWin)/ 沒分勝負時才允許改變m_emWin的狀態(tài)m_emWin= PEACE;for(inti = 0;i < COLUMNS;i+)for(intj = 0;j < ROWS;j+)if(NONE != m_iPositionPieceij)m_chessdraw.DrawPiece(i,

9、j,BLACK= m_iPositionPieceij);elseif(PEACE = m_emWin)m_emWin= FIGHTING;/ 若有空位,則還可以繼續(xù),否則平局,即m_emWin= PEACE;m_chessdraw.DrawPieceCur(m_ptCurrent.x, m_ptCurrent.y);/ 標(biāo)記當(dāng)前棋子 下棋函數(shù):voidCChess:SetPiecePos(CPointptCurrent)if(FIGHTING!= m_emWin) return;/ 沒分勝負時才允許改變m_ptCurrent的狀態(tài)UINTuiPosX,uiPosY;if(! m_chessd

10、raw.GetCoordinateWithPoint(ptCurrent,&uiPosX, &uiPosY)return;/ 不在棋盤內(nèi)的位置不做處理if(NONE!= m_iPositionPieceuiPosXuiPosY)return;/ 已有棋子的位置不做處理 for(int i = 0; i < 2 ; i+) m_iPositionPieceuiPosXuiPosY= m_bTurnBlack ? BLACK : WHITE; / - 判斷輸贏 - if(IsWin(uiPosX,uiPosY,m_iPositionPieceuiPosXuiPosY) m_p

11、tCurrent = CPoint(uiPosX, uiPosY); return; / 已分出勝負 / - 記錄上一次的棋子位置 - if(PERSON_VS_PERSON = m_emVSMode) | (m_bTurnBlack && (PERSON_VS_MACHINE = m_emVSMode) m_stcLastPos.ptLastCurPoint = m_ptCurrent; if(m_bTurnBlack) m_stcLastPos.ptBlack = CPoint(uiPosX, uiPosY); else m_stcLastPos.ptWhite = CPo

12、int(uiPosX, uiPosY); m_stcLastPos.iPieceNum+; m_ptCurrent = CPoint(uiPosX, uiPosY); / - 輪到白方下棋 - m_bTurnBlack = ! m_bTurnBlack; if(! m_bTurnBlack && (PERSON_VS_MACHINE = m_emVSMode) if(! GetBestPosByAI(uiPosX, uiPosY, (! m_bTurnBlack) ? BLACK : WHITE) return; / 已分出勝負 if(PERSON_VS_PERSON = m_

13、emVSMode) break; / 如果是人人對戰(zhàn),則退出循環(huán)enumWinFlagCChess:GetWinFlag()returnm_emWin;悔棋函數(shù):OOLCChess:Regret() if(m_stcLastPos.iPieceNum > 0) && (FIGHTING = m_emWin) / 如已分出勝負,則不再允許悔棋 m_stcLastPos.iPieceNum = 0; /只允許悔一步 m_ptCurrent = m_stcLastPos.ptLastCurPoint; if(PERSON_VS_MACHINE = m_emVSMode) m_i

14、PositionPiecem_stcLastPos.ptBlack.xm_stcLastPos.ptBlack.y = NONE; m_iPositionPiecem_stcLastPos.ptWhite.xm_stcLastPos.ptWhite.y = NONE; if(PERSON_VS_PERSON = m_emVSMode) if(! m_bTurnBlack) m_iPositionPiecem_stcLastPos.ptBlack.xm_stcLastPos.ptBlack.y = NONE; else m_iPositionPiecem_stcLastPos.ptWhite.x

15、m_stcLastPos.ptWhite.y = NONE; m_bTurnBlack = ! m_bTurnBlack; return TRUE; return FALSE;設(shè)置對戰(zhàn)模式:voidCChess:SetVSMode(enumVSModeemVSMode) m_emVSMode = emVSMode;voidCChess:SetAIDepth(int emAIDepth) m_emAIDepth = emAIDepth;3. 課程設(shè)計內(nèi)容 3.1 概要設(shè)計 游戲的操作方面主要以鼠標(biāo)點擊為主,鼠標(biāo)點擊方格里面進行落子操作。選擇人人對戰(zhàn),人機對戰(zhàn)(選擇對戰(zhàn)難度),五子連棋時就判斷白方

16、或者黑方勝利。3.1.1 程序總體框架描述 1.創(chuàng)建程序2.棋盤功能構(gòu)建3.游戲構(gòu)架組成4.游戲過程以及結(jié)束設(shè)定3.1.2本項目主要有棋局繪制、棋局功能、機器AI三個類,主要源碼文件如下圖 3.2主要技術(shù) 1.界面的設(shè)置2.下棋處理函數(shù);3.視圖框架設(shè)置;4.機器AI算法。5.功能的設(shè)置。3.3系統(tǒng)設(shè)計結(jié)果 (界面截圖、操作流程)1.界面截圖:此為困難級別,白色為機器方。操作流程圖界面更多選項選擇開始人人人機結(jié)束難度4.設(shè)計總結(jié)4.1遇到的問題及如何解決隨著五子棋游戲的開發(fā)完成,本游戲中預(yù)期的主要功能也基本實現(xiàn)。本系統(tǒng)以Visual studio 2010作為前臺開發(fā)工具,Visual stu

17、dio 2010以簡單、易用等優(yōu)點成為開發(fā)本系統(tǒng)的首選工具。本論文闡述了五子棋游戲的分析與設(shè)計的全過程,并在論文中相應(yīng)的位置插入了圖片、流程圖以及一些具有技巧性的程序代碼,更加清晰的描述了該游戲是如何實現(xiàn)的。五子棋游戲是一款益智類游戲,該游戲與那些網(wǎng)絡(luò)游戲和3D游戲相比,它有編寫簡單容易上手等特點,非常適合人們在完成工作的時候適當(dāng)?shù)膴蕵芬?。這些小游戲大都是以益智和娛樂為目的,不僅給緊張工作的人們以放松,還可以讓人們的大腦得到開發(fā)。由于我學(xué)習(xí)Visual studio 2010和MFC的時間比較短,其中的很多知識還沒有了解和掌握,當(dāng)然出現(xiàn)了很多錯誤,在設(shè)計過程中出現(xiàn)鼠標(biāo)不響應(yīng)操作的現(xiàn)象,這是因

18、為定義鼠標(biāo)函數(shù)時出現(xiàn)了錯誤;在設(shè)計過程中對位圖的設(shè)置不夠了解,總是不能調(diào)用位圖,通過百度,才知道缺少了一部分代碼;對于分號、引號的符號出現(xiàn)了不少的錯誤,主要是中英文切換時沒注意,導(dǎo)致編譯出錯;完成程序之后,對程序進行編譯,系統(tǒng)總是提示鏈接出錯,經(jīng)過仔細檢查沒有找到語句或定義錯誤,后來發(fā)現(xiàn)是電腦問題,我在任務(wù)管理器中結(jié)束wkh.exe。再次鏈接,錯誤就消除了。4.2體會在五子棋游戲中有些功能還不夠完善,例如在五子棋游戲中不能實現(xiàn)游戲的保存和聲音的添加。希望在以后的工作和學(xué)習(xí)中不斷的充實自己的知識結(jié)構(gòu),把掃雷游戲的功能進一步完善,使它成為一個更具有實用價值的游戲軟件,同時也懇請老師給予批評指正。5

19、.源代碼CChess:CChess(void) m_bTurnBlack = TRUE;m_emWin= FIGHTING;m_emVSMode = PERSON_VS_MACHINE; m_emAIDepth = AI_MIDDLE; m_ptCurrent= CPoint(-1,-1);/ 只要不在棋盤內(nèi)的點都可以memset(m_iPositionPiece,0,sizeof(m_iPositionPiece); m_stcLastPos.iPieceNum = 0; m_stcLastPos.ptBlack = CPoint(0,0); m_stcLastPos.ptWhite = C

20、Point(0,0); m_stcLastPos.ptLastCurPoint = CPoint(-1,-1);CChess:CChess(void) NewGame();void CChess:NewGame() m_bTurnBlack = TRUE;m_emWin= FIGHTING;m_ptCurrent= CPoint(-1,-1);memset(m_iPositionPiece,0,sizeof(m_iPositionPiece); m_stcLastPos.iPieceNum = 0; m_stcLastPos.ptBlack = CPoint(0,0); m_stcLastPo

21、s.ptWhite = CPoint(0,0); m_stcLastPos.ptLastCurPoint = CPoint(-1,-1); if(MACHINE_VS_MACHINE = m_emVSMode) CPoint ptFirst; srand(time(NULL); ptFirst.x= rand()%COLUMNS; ptFirst.y= rand()%ROWS; m_chessdraw.GetPointWithCoordinate(ptFirst, ptFirst.x, ptFirst.y); SetPiecePos(ptFirst);void CChess:Init(CRec

22、trect)m_chessdraw.InitBoard(rect, COLUMNS, ROWS, rect.Height() / ROWS, rect.Height() / ROWS / 2 - 2);m_rcBoard= m_chessdraw.GetRectBoard();CRectCChess:GetRectBoard()returnm_rcBoard;void CChess:Draw(CDC*pDC)CMyMemDCmemDC(pDC);m_chessdraw.SetDC(memDC);m_chessdraw.DrawBackground();m_chessdraw.DrawBoard

23、();/ - 重畫整個棋局 - if(FIGHTING= m_emWin)/ 沒分勝負時才允許改變m_emWin的狀態(tài)m_emWin= PEACE;for(inti = 0;i < COLUMNS;i+)for(intj = 0;j < ROWS;j+)if(NONE != m_iPositionPieceij)m_chessdraw.DrawPiece(i, j,BLACK= m_iPositionPieceij);elseif(PEACE = m_emWin)m_emWin= FIGHTING;/ 若有空位,則還可以繼續(xù),否則平局,即m_emWin= PEACE;m_chess

24、draw.DrawPieceCur(m_ptCurrent.x, m_ptCurrent.y);/ 標(biāo)記當(dāng)前棋子 voidCChess:SetPiecePos(CPointptCurrent)if(FIGHTING!= m_emWin) return;/ 沒分勝負時才允許改變m_ptCurrent的狀態(tài)UINTuiPosX,uiPosY;if(! m_chessdraw.GetCoordinateWithPoint(ptCurrent,&uiPosX, &uiPosY)return;/ 不在棋盤內(nèi)的位置不做處理if(NONE!= m_iPositionPieceuiPosXui

25、PosY)return;/ 已有棋子的位置不做處理 for(int i = 0; i < 2 ; i+) m_iPositionPieceuiPosXuiPosY= m_bTurnBlack ? BLACK : WHITE; / - 判斷輸贏 - if(IsWin(uiPosX,uiPosY,m_iPositionPieceuiPosXuiPosY) m_ptCurrent = CPoint(uiPosX, uiPosY); return; / 已分出勝負 / - 記錄上一次的棋子位置 - if(PERSON_VS_PERSON = m_emVSMode) | (m_bTurnBlack

26、 && (PERSON_VS_MACHINE = m_emVSMode) m_stcLastPos.ptLastCurPoint = m_ptCurrent; if(m_bTurnBlack) m_stcLastPos.ptBlack = CPoint(uiPosX, uiPosY); else m_stcLastPos.ptWhite = CPoint(uiPosX, uiPosY); m_stcLastPos.iPieceNum+; m_ptCurrent = CPoint(uiPosX, uiPosY); / - 輪到白方下棋 - m_bTurnBlack = ! m_b

27、TurnBlack; if(! m_bTurnBlack && (PERSON_VS_MACHINE = m_emVSMode) if(! GetBestPosByAI(uiPosX, uiPosY, (! m_bTurnBlack) ? BLACK : WHITE) return; / 已分出勝負 if(PERSON_VS_PERSON = m_emVSMode) break; / 如果是人人對戰(zhàn),則退出循環(huán)enumWinFlagCChess:GetWinFlag()returnm_emWin;BOOLCChess:IsWin(UINTuiCol,UINTuiRow,enum

28、ChessColor emChessColor) intiSameColorMAXCREASE; GetSameColor(uiCol, uiRow, emChessColor, iSameColor, m_iPositionPiece); for(intm = 0; m < MAXCREASE;m+) if(iSameColorm > MAXCREASE) m_emWin= (BLACK = emChessColor) ? BLACK_WIN : WHITE_WIN; returnTRUE;returnFALSE;BOOLCChess:Regret() if(m_stcLastP

29、os.iPieceNum > 0) && (FIGHTING = m_emWin) / 如已分出勝負,則不再允許悔棋 m_stcLastPos.iPieceNum = 0; /只允許悔一步 m_ptCurrent = m_stcLastPos.ptLastCurPoint; if(PERSON_VS_MACHINE = m_emVSMode) m_iPositionPiecem_stcLastPos.ptBlack.xm_stcLastPos.ptBlack.y = NONE; m_iPositionPiecem_stcLastPos.ptWhite.xm_stcLast

30、Pos.ptWhite.y = NONE; if(PERSON_VS_PERSON = m_emVSMode) if(! m_bTurnBlack) m_iPositionPiecem_stcLastPos.ptBlack.xm_stcLastPos.ptBlack.y = NONE; else m_iPositionPiecem_stcLastPos.ptWhite.xm_stcLastPos.ptWhite.y = NONE; m_bTurnBlack = ! m_bTurnBlack; return TRUE; return FALSE;voidCChess:SetVSMode(enum

31、VSModeemVSMode) m_emVSMode = emVSMode;voidCChess:SetAIDepth(int emAIDepth) m_emAIDepth = emAIDepth;BOOL CChess:GetBestPosByAI(UINT&uiCol,UINT&uiRow,enumChessColor emEnemyChessColor) POINT ptPosWhite, ptPosBlack = CPoint(uiCol, uiRow); BOOL bContinue = TRUE; switch(m_emAIDepth) case AI_FOOLIS

32、H: bContinue = :AIFoolish(ptPosWhite,ptPosBlack,emEnemyChessColor, m_iPositionPiece); break; case AI_PRIMARY: bContinue = :AIPrimary(ptPosWhite, m_iPositionPiece); break; case AI_MIDDLE: bContinue = :AIMiddle(ptPosWhite, m_iPositionPiece); break; case AI_HIGH: bContinue = :AIHigh(ptPosWhite, m_iPosi

33、tionPiece); break; default: break; uiCol = ptPosWhite.x; uiRow= ptPosWhite.y; if(! bContinue) m_emWin= PEACE; return FALSE; return TRUE;CChessDraw:CChessDraw()m_pDC= NULL;m_rcBK.SetRectEmpty();m_rcBoard.SetRectEmpty();m_crBKBegin= RGB(255,232,166);m_crBKEnd= RGB(255,220,200);m_crBoard= RGB(0,0,0);m_

34、uiPieceRadius= 0;m_uiBoardRows= 0;m_uiBoardCols= 0;m_uiBoardWidth= 0;CChessDraw:CChessDraw()/ 不能這么做,因為指向的是外部指針,不要對外部指針做任何更改/ m_pDC->DeleteDC();/m_pDC= NULL;voidCChessDraw:InitBoard(CRectrect, UINTuiRows, UINTuiCols, UINTuiBoardWidth, UINTuiPieceRadius)m_rcBK= rect;m_uiBoardRows= uiRows;m_uiBoardC

35、ols= uiCols;m_uiBoardWidth= uiBoardWidth;m_uiPieceRadius= uiPieceRadius;/ 計算棋盤區(qū)域m_rcBoard= m_rcBK;m_rcBoard.DeflateRect(CSize(20,20);/ 背景區(qū)域的左上點偏移(20,20)再畫棋盤m_rcBoard.right= m_rcBoard.left + m_uiBoardWidth * (m_uiBoardCols - 1);m_rcBoard.bottom= m_rcBoard.top + m_uiBoardWidth * (m_uiBoardRows - 1);CR

36、ectCChessDraw:GetRectBoard()returnm_rcBoard;voidCChessDraw:SetDC(CDC*pDC) m_pDC= pDC;void CChessDraw:DrawBackground() if(! m_pDC) return; GradientFillRect(m_pDC,m_rcBK,m_crBKBegin,m_crBKEnd,TRUE);void CChessDraw:DrawBoard()if(! m_pDC)return;/ 畫橫線UINTptTop= m_rcBoard.top;for(UINT i= 0;i < m_uiBoar

37、dRows;i +)m_pDC->MoveTo(m_rcBoard.left, ptTop);m_pDC->LineTo(m_rcBoard.right,ptTop);ptTop+= m_uiBoardWidth;/ 畫豎線UINTptLeft= m_rcBoard.left;for(UINT i= 0;i < m_uiBoardCols;i +)m_pDC->MoveTo(ptLeft, m_rcBoard.top);m_pDC->LineTo(ptLeft,m_rcBoard.bottom);ptLeft+= m_uiBoardWidth;/ 畫天元等點Dra

38、wSpecialPoints();BOOL CChessDraw:DrawPiece(CPointpt,BOOLbBlack)if(! m_pDC| ! GetCoordinateWithPoint(pt)returnFALSE;CRectrc(pt - CSize(m_uiPieceRadius,m_uiPieceRadius),pt + CSize(m_uiPieceRadius,m_uiPieceRadius);CRgnrgn;rgn.CreateEllipticRgnIndirect(rc);m_pDC->SelectClipRgn(&rgn, RGN_AND);if(b

39、Black)FillGradientEx(m_pDC,rc,RGB(140,130,120),RGB(0,0,0),FALSE); / 畫黑棋/GradientFillRect(m_pDC,rc,RGB(0,0,255),RGB(180,180,180),TRUE);/ 此函數(shù)有點問題(以這行代碼運行后,可以看出來)elseFillGradientEx(m_pDC,rc,RGB(255,255,255),RGB(180,200,180),FALSE); / 畫白棋m_pDC->SelectClipRgn(NULL);returnTRUE;BOOLCChessDraw:DrawPiece(

40、UINTuiX,UINTuiY,BOOLbBlack)CPointpt;if(! m_pDC| ! GetPointWithCoordinate(pt, uiX, uiY)returnFALSE;CRectrc(pt - CSize(m_uiPieceRadius,m_uiPieceRadius),pt + CSize(m_uiPieceRadius,m_uiPieceRadius);CRgnrgn;rgn.CreateEllipticRgnIndirect(rc);m_pDC->SelectClipRgn(&rgn, RGN_AND);if(bBlack)FillGradien

41、tEx(m_pDC,rc,RGB(140,130,120),RGB(0,0,0),FALSE);elseFillGradientEx(m_pDC,rc,RGB(255,255,255),RGB(180,200,180),FALSE);m_pDC->SelectClipRgn(NULL);returnTRUE;void CChessDraw:DrawPieceCur(CPointpt)if(! m_pDC| ! GetCoordinateWithPoint(pt)return;CPenpenNew(PS_DASH, 1, RGB(255,0,0);CPen*penOld= m_pDC-&g

42、t;SelectObject(&penNew);/intiSize= 5;intiSize= m_uiPieceRadius/3;/ 畫橫線m_pDC->MoveTo(pt.x-iSize, pt.y);m_pDC->LineTo(pt.x+iSize, pt.y);/ 畫豎線m_pDC->MoveTo(pt.x,pt.y-iSize);m_pDC->LineTo(pt.x,pt.y+iSize);m_pDC->SelectObject(penOld);voidCChessDraw:DrawPieceCur(UINTuiX,UINTuiY)CPointpt

43、;if(! m_pDC| ! GetPointWithCoordinate(pt, uiX, uiY)return;CPenpenNew(PS_DASH, 1, RGB(255,0,0);CPen*penOld= m_pDC->SelectObject(&penNew);intiSize= m_uiPieceRadius/2 - 1;/ 畫橫線m_pDC->MoveTo(pt.x-iSize, pt.y);m_pDC->LineTo(pt.x+iSize, pt.y);/ 畫豎線m_pDC->MoveTo(pt.x,pt.y-iSize);m_pDC->L

44、ineTo(pt.x,pt.y+iSize);m_pDC->SelectObject(penOld);void CChessDraw:DrawSpecialPoints()if(! m_pDC)return;CRect rcTmp;CRect rc= m_rcBoard;COLORREFrgb = RGB(0,0,0);UINT uiSpecialRadius = m_uiPieceRadius/2 - 1;/ 天元等點的半徑(默認為正方形,此值表示邊長的一半)CSize szRadius(uiSpecialRadius,uiSpecialRadius);constintSPACE= 3

45、 * m_uiBoardWidth; / 偏移rc.DeflateRect(CSize(SPACE,SPACE);rcTmp= CRect(rc.TopLeft(),rc.TopLeft();rcTmp.InflateRect(szRadius);m_pDC->FillSolidRect(rcTmp,rgb);rcTmp= CRect(rc.BottomRight(),rc.BottomRight();rcTmp.InflateRect(szRadius);m_pDC->FillSolidRect(rcTmp,rgb);rcTmp= CRect(CPoint(rc.right, r

46、c.top),CPoint(rc.right, rc.top);rcTmp.InflateRect(szRadius);m_pDC->FillSolidRect(rcTmp,rgb);rcTmp= CRect(CPoint(rc.left, rc.bottom),CPoint(rc.left, rc.bottom);rcTmp.InflateRect(szRadius);m_pDC->FillSolidRect(rcTmp,rgb);rcTmp= CRect(rc.CenterPoint(),rc.CenterPoint();rcTmp.InflateRect(szRadius);

47、m_pDC->FillSolidRect(rcTmp,rgb);BOOLCChessDraw:GetCoordinateWithPoint(CPoint&pt,UINT*puiX,UINT*puiY)/ 對坐標(biāo)點進行取整,使其剛好在線條交叉處CRectrcTmp= m_rcBoard;rcTmp.InflateRect(CSize(m_uiBoardWidth/2, m_uiBoardWidth/2);if(! rcTmp.PtInRect(pt)returnFALSE;/UINTuiPosX= (pt.x - m_rcBoard.left + m_uiBoardWidth/2)/m_uiBoardWidth;/ 在第uiPosX個交叉點/UINTuiPosY= (pt.y - m_rcBoard.top + m_uiBoardWidth/2)/m_uiBoardWidth;UINTuiPosX= (pt.x - rcTmp.left)/m_uiBoardWidth;/ 在第uiPosX個交叉點UINTuiPosY= (pt.y - rcTmp.top)/m_uiBoardWidth;pt.x= m_rcBoard

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論