找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2497|回复: 0
打印 上一主题 下一主题
收起左侧

VC++游戏开发:五子棋

[复制链接]
跳转到指定楼层
楼主
ID:90014 发表于 2015-9-16 00:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、程序运行时情况
二、本程序里的计算机具有自动判断的功能,能根据当前棋子的布局情况采用相关的走子方式。为了避免在走子时候出现屏幕闪烁,采用双缓冲进行绘图输出,以下是软件实现的部分代码:

01.#include "stdafx.h"
02.在CFiveChessView类中定义了如下的数据结构:
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 :进攻: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)增加如下代码设置固定窗口大小:



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类,实现了走棋的数据结构和相关算法:

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 :进攻: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.    //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; // 热解二数据链表
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++游戏开发:五子棋
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 ;   //谁先出
70.    int m_nGoStyle  ;   //走棋方式;
71.    int m_nResult   ;   //胜负结果
72.    int m_chessman[MAX_X][MAX_Y];  //保存棋子状态
73.      
74.  
75.    int m_nFNonePos_x;    //空位置 x坐标
76.    int m_nFNonePos_y;    //空位置 y坐标
77.  
78.   
79.    int m_nSNonePos_x;    //空位置 x坐标
80.    int m_nSNonePos_y;    //空位置 y坐标
81.  
82.    int m_nTNonePos_x;    //空位置 x坐标
83.    int m_nTNonePos_y;    //空位置 y坐标
84.  
85.    CChess();
86.    virtual ~CChess();
87.  
88.};


三、本程序在windows 2000,visual c++ 6.0下编译通过。
四、由于时间匆忙,程序中的部分算法设计不够合理,欢迎各位大虾们多多指教,希望能与你们多多交流,联系方式:
ldh5118@sohu.com,
qq:36201365


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表