欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>游戏开发>>文章内容
VC++游戏开发:五子棋
发布时间:2008-11-20   点击:   来源:本站原创   录入者:吕鸿

 

下载源代码

一、程序运行时情况


 
二、本程序里的计算机具有自动判断的功能,能根据当前棋子的布局情况采用相关的走子方式。为了避免在走子时候出现屏幕闪烁,采用双缓冲进行绘图输出,以下是软件实现的部分代码:

#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

附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步