找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 3229|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

VC++游戲開發(fā):五子棋

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:90014 發(fā)表于 2015-9-16 00:39 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一、程序運(yùn)行時(shí)情況
二、本程序里的計(jì)算機(jī)具有自動(dòng)判斷的功能,能根據(jù)當(dāng)前棋子的布局情況采用相關(guān)的走子方式。為了避免在走子時(shí)候出現(xiàn)屏幕閃爍,采用雙緩沖進(jìn)行繪圖輸出,以下是軟件實(shí)現(xiàn)的部分代碼:

01.#include "stdafx.h"
02.在CFiveChessView類中定義了如下的數(shù)據(jù)結(jié)構(gòu):
03.  
04.    enum    {MAX_X = 18, MAX_Y=18, MIN_X =1, MIN_Y =1};
05.      
06.    // NONE :空位置:BLACK :黑 WHITE 白
07.    enum    {NONE  = 0, BLACK = 1, WHITE = 2};  
08.  
09.    // ATTACK :進(jìn)攻:DEFEND :防守
10.    enum    {ATTACK = 0, DEFEND = 1};  
11.  
12.    // MAN_FIRST :黑先:COMPUTER_FIRST :白先
13.    enum    {MAN_FIRST = 0, COMPUTER_FIRST = 1};  
14.  
15.    // BOTH_PEASE :和:BLACK_WIN :黑勝 WHITE_WIN: 白勝
16.    enum    {BOTH_PEASE=0, BLACK_WIN = 1,  WHITE_WIN = 2};  
17.  
18.    // L_TO_R:左到右 T_TO_B :上到下: LB_TO_RT :左下到右上,LT_TO_RB左上到右下
19.    enum    {L_TO_R=0, T_TO_B = 1,  LB_TO_RT = 2 , LT_TO_RB = 3};  
20.  
21.  
22.        CChess fiveChess;
23.    int m_nLastBlackPos_x;
24.    int m_nLastBlackPos_y;
25.    int m_nCurrentWhitePos_x;
26.    int m_nCurrentWhitePos_y;
27.  
28.在CMainFrame類中PreCreateWindow(CREATESTRUCT& cs)增加如下代碼設(shè)置固定窗口大�。�



01.BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
02.{
03.    if( !CFrameWnd::PreCreateWindow(cs) )
04.        return FALSE;
05.    cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX;// | WS_THICKFRAME;
06.    cs.style &= ~WS_BORDER;
07.    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
08.    int iWinBorderX = GetSystemMetrics(SM_CXBORDER);
09.    int iWinBorderY = GetSystemMetrics(SM_CYBORDER);
10.    int iCaptionY = GetSystemMetrics(SM_CYCAPTION);
11.    int iMenuY = GetSystemMetrics(SM_CYMENU);
12.    int iStausY = GetSystemMetrics(SM_CYMENU);
13.    cs.cx = 510 + iWinBorderX ;
14.    cs.cy = 530 + iWinBorderY + iCaptionY + iStausY + iMenuY;
15.    return TRUE;
16.}


本軟件還定義了CChess類,實(shí)現(xiàn)了走棋的數(shù)據(jù)結(jié)構(gòu)和相關(guān)算法:

01.class CChess : public CObject   
02.{
03.public:
04.    enum    {MAX_X = 18, MAX_Y=18, MIN_X =1, MIN_Y =1};
05.  
06.    // NONE :空位置:BLACK :黑 WHITE 白
07.    enum    {NONE  = 0, BLACK = 1, WHITE = 2};  
08.  
09.    // ATTACK :進(jìn)攻:DEFEND :防守
10.    enum    {ATTACK = 0, DEFEND = 1};  
11.  
12.    // MAN_FIRST :人先:COMPUTER_FIRST:計(jì)算機(jī)先
13.    enum    {MAN_FIRST = 0, COMPUTER_FIRST = 1};  
14.      
15.    // BOTH_PEASE :和:BLACK_WIN :黑勝 WHITE_WIN: 白勝
16.    enum    {BOTH_PEASE=0, BLACK_WIN = 1,  WHITE_WIN = 2};  
17.  
18.         // L_TO_R:左到右 T_TO_B :上到下: LB_TO_RT :左下到右上,LT_TO_RB左上到右下
19.  //    enum    {L_TO_R=0, T_TO_B = 1,  LB_TO_RT = 2 , LT_TO_RB = 3};  
20.  
21.    //const static int  
22.public:
23.    static int Start_X;
24.    static int Start_Y;
25.    static int Width_X;
26.    static int Height_Y;
27.    CObList pList;
28.    CList <CNode,CNode&> List; // 熱解二數(shù)據(jù)鏈表
29.  
30.   
31.public:
32.  
33.    void Draw(CDC *pDC,int x, int y, int nState);
34.    void Init();
35.    inline void SetChessState (int x,  
36.                    int y,
37.                    int nState)
38.    {  
39.        if (x>=0 && x <MAX_X && y>=0 && y <MAX_Y )
40.                m_chessman[x][y] = nState;
41.    }
42.    inline int GetChessState (int x, int y ){ return m_chessman[x][y];}
43.  
44.    inline void SetWhoFirst(int nWhoFirst) {m_nWhoFirst = nWhoFirst;}
45.    inline int GetWhoFirst() { return m_nWhoFirst;}
46.  
47.    inline void SetGoStyle(int nGoStyle) {m_nGoStyle = nGoStyle;}
48.    inline int GetGoStyle() { return m_nGoStyle;}
49.  
50.    inline void SetResult(int nResult) {m_nResult = nResult;}
51.    inline int GetResult() { return m_nResult;}
52.  
53.  
54.public:
55.    BOOL GetSixComputerPos(int &col, int &row);
56.    BOOL ScanTwo(int side);
57.    int WhoWin(int state);
58.    BOOL ScanLTtoRbFive(int side);
59.    BOOL ScanLbtoRtFive(int side);
60.    BOOL ScanTtoBFive(int side);
61.    BOOL ScanLtoRFive(int side);
62.  
63.  VC++游戲開發(fā):五子棋
64.    void ScanLTtoRbSix(int side);
65.    void ScanLbtoRtSix(int side);
66.    void ScanTtoBSix(int side);
67.    void ScanLtoRSix(int side);
68.  
69.    int m_nWhoFirst ;   //誰(shuí)先出
70.    int m_nGoStyle  ;   //走棋方式;
71.    int m_nResult   ;   //勝負(fù)結(jié)果
72.    int m_chessman[MAX_X][MAX_Y];  //保存棋子狀態(tài)
73.      
74.  
75.    int m_nFNonePos_x;    //空位置 x坐標(biāo)
76.    int m_nFNonePos_y;    //空位置 y坐標(biāo)
77.  
78.   
79.    int m_nSNonePos_x;    //空位置 x坐標(biāo)
80.    int m_nSNonePos_y;    //空位置 y坐標(biāo)
81.  
82.    int m_nTNonePos_x;    //空位置 x坐標(biāo)
83.    int m_nTNonePos_y;    //空位置 y坐標(biāo)
84.  
85.    CChess();
86.    virtual ~CChess();
87.  
88.};


三、本程序在windows 2000,visual c++ 6.0下編譯通過。
四、由于時(shí)間匆忙,程序中的部分算法設(shè)計(jì)不夠合理,歡迎各位大蝦們多多指教,希望能與你們多多交流,聯(lián)系方式:
ldh5118@sohu.com,
qq:36201365


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表