下载源代码
一、程序运行时情况
二、本程序里的计算机具有自动判断的功能,能根据当前棋子的布局情况采用相关的走子方式。为了避免在走子时候出现屏幕闪烁,采用双缓冲进行绘图输出,以下是软件实现的部分代码:
#include "stdafx.h" 在CFiveChessView类中定义了如下的数据结构: enum {MAX_X = 18, MAX_Y=18, MIN_X =1, MIN_Y =1}; // NONE :空位置:BLACK :黑 WHITE 白 enum {NONE = 0, BLACK = 1, WHITE = 2}; // ATTACK :进攻:DEFEND :防守 enum {ATTACK = 0, DEFEND = 1}; // MAN_FIRST :黑先:COMPUTER_FIRST :白先 enum {MAN_FIRST = 0, COMPUTER_FIRST = 1}; // BOTH_PEASE :和:BLACK_WIN :黑胜 WHITE_WIN: 白胜 enum {BOTH_PEASE=0, BLACK_WIN = 1, WHITE_WIN = 2}; // L_TO_R:左到右 T_TO_B :上到下: LB_TO_RT :左下到右上,LT_TO_RB左上到右下 enum {L_TO_R=0, T_TO_B = 1, LB_TO_RT = 2 , LT_TO_RB = 3}; CChess fiveChess; int m_nLastBlackPos_x; int m_nLastBlackPos_y; int m_nCurrentWhitePos_x; int m_nCurrentWhitePos_y; 在CMainFrame类中PreCreateWindow(CREATESTRUCT& cs)增加如下代码设置固定窗口大小:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX;// | WS_THICKFRAME; cs.style &= ~WS_BORDER; cs.dwExStyle &= ~WS_EX_CLIENTEDGE; int iWinBorderX = GetSystemMetrics(SM_CXBORDER); int iWinBorderY = GetSystemMetrics(SM_CYBORDER); int iCaptionY = GetSystemMetrics(SM_CYCAPTION); int iMenuY = GetSystemMetrics(SM_CYMENU); int iStausY = GetSystemMetrics(SM_CYMENU); cs.cx = 510 + iWinBorderX ; cs.cy = 530 + iWinBorderY + iCaptionY + iStausY + iMenuY; return TRUE; }
本软件还定义了CChess类,实现了走棋的数据结构和相关算法:
class CChess : public CObject { public: enum {MAX_X = 18, MAX_Y=18, MIN_X =1, MIN_Y =1}; // NONE :空位置:BLACK :黑 WHITE 白 enum {NONE = 0, BLACK = 1, WHITE = 2}; // ATTACK :进攻:DEFEND :防守 enum {ATTACK = 0, DEFEND = 1}; // MAN_FIRST :人先:COMPUTER_FIRST:计算机先 enum {MAN_FIRST = 0, COMPUTER_FIRST = 1}; // BOTH_PEASE :和:BLACK_WIN :黑胜 WHITE_WIN: 白胜 enum {BOTH_PEASE=0, BLACK_WIN = 1, WHITE_WIN = 2}; // L_TO_R:左到右 T_TO_B :上到下: LB_TO_RT :左下到右上,LT_TO_RB左上到右下 // enum {L_TO_R=0, T_TO_B = 1, LB_TO_RT = 2 , LT_TO_RB = 3}; //const static int public: static int Start_X; static int Start_Y; static int Width_X; static int Height_Y; CObList pList; CList <CNode,CNode&> List; // 热解二数据链表 public: void Draw(CDC *pDC,int x, int y, int nState); void Init(); inline void SetChessState (int x, int y, int nState) { if (x>=0 && x <MAX_X && y>=0 && y <MAX_Y ) m_chessman[x][y] = nState; } inline int GetChessState (int x, int y ){ return m_chessman[x][y];} inline void SetWhoFirst(int nWhoFirst) {m_nWhoFirst = nWhoFirst;} inline int GetWhoFirst() { return m_nWhoFirst;} inline void SetGoStyle(int nGoStyle) {m_nGoStyle = nGoStyle;} inline int GetGoStyle() { return m_nGoStyle;} inline void SetResult(int nResult) {m_nResult = nResult;} inline int GetResult() { return m_nResult;} public: BOOL GetSixComputerPos(int &col, int &row); BOOL ScanTwo(int side); int WhoWin(int state); BOOL ScanLTtoRbFive(int side); BOOL ScanLbtoRtFive(int side); BOOL ScanTtoBFive(int side); BOOL ScanLtoRFive(int side); void ScanLTtoRbSix(int side); void ScanLbtoRtSix(int side); void ScanTtoBSix(int side); void ScanLtoRSix(int side); int m_nWhoFirst ; //谁先出 int m_nGoStyle ; //走棋方式; int m_nResult ; //胜负结果 int m_chessman[MAX_X][MAX_Y]; //保存棋子状态 int m_nFNonePos_x; //空位置 x坐标 int m_nFNonePos_y; //空位置 y坐标 int m_nSNonePos_x; //空位置 x坐标 int m_nSNonePos_y; //空位置 y坐标 int m_nTNonePos_x; //空位置 x坐标 int m_nTNonePos_y; //空位置 y坐标 CChess(); virtual ~CChess(); };三、本程序在windows 2000,visual c++ 6.0下编译通过。
四、由于时间匆忙,程序中的部分算法设计不够合理,欢迎各位大虾们多多指教,希望能与你们多多交流,联系方式:
ldh5118@{域名已经过期},
qq:36201365