VC++游戏开发:五子棋

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

VC++游戏开发:五子棋

作者:吕鸿

下载源代码

一、程序运行时情况

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

#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@sohu.com,

qq:36201365

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航