【VC++游戏开发】棋牌类游戏——五子棋

        在我学习游戏开发的过程中,遇到的最大的麻烦就是不知道一个游戏的完整实现过程,代码倒是其次。

这里,总结一下我做过的游戏,主要是梳理整每个步骤。


先看下最终的效果

【VC++游戏开发】棋牌类游戏——五子棋_第1张图片


 

第1步:

准备图片(黑棋、白棋各一张)

1.       五子棋位图

2.       光标位图

3.       图标位图

 

自己作图,或者网上下载都可以

 

第2步:

初始化界面和函数,包括

0.设置窗口大小、样式

在函数BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中

添加如下代码

cs.dwExStyle |= WS_EX_TOPMOST;
cs.style = WS_SYSMENU | WS_MINIMIZEBOX ;
cs.cx=610;
cs.cy=680;

还可以在OnCreate里设置图标(使用SetClassLang函数),图片左上角可爱的熊猫如是诞生^_^


1.在C**View构造函数中加载五子棋位图、光标位图、图标位图,初始化棋盘,设置白棋/黑棋先行等

//加载五子棋位图
m_bmblaak.LoadBitmap(IDB_BITMAP2);
m_bmwhite.LoadBitmap(IDB_BITMAP1);

//加载光标位图
hcursorBlack=AfxGetApp()->LoadCursor(IDC_CURSOR2);
hcursorWhite=AfxGetApp()->LoadCursor(IDC_CURSOR1);

//加载图标位图
hiconBlack=AfxGetApp()->LoadIcon(IDI_BLACK);
hiconWhite=AfxGetApp()->LoadIcon(IDI_WHITE);

//初始化棋盘为空
for(int i=0;i<19;i++)
	for(int j=0;j<19;j++)
		gomoku[i][j]=0;

//当前状态: 白棋下/人人对战模式
isWhite=1;
isComputer=0;

whitePoint.x=whitePoint.y=-1;
blackPoint.x=blackPoint.y=-1;


 

2.在OnDraw()函数中画界面

画棋盘背景

CBrush brush;
brush.CreateSolidBrush(RGB(192,192,192));
CRect rect(0,0,700,700);
pDC->FillRect(rect,&brush);


画棋盘线

CPen pen;
CPen *oldPen;
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
oldPen=pDC->SelectObject(&pen);

for(i=0;i<19;i++)
{
	pDC->MoveTo(30,30+i*30);
	pDC->LineTo(570,30+i*30);
	pDC->MoveTo(30+i*30,30);
	pDC->LineTo(30+i*30,570);
}


重画时显示棋子

CDC dc;
if(false==dc.CreateCompatibleDC(pDC))
	AfxMessageBox("Can't create dc");

for(i=0;i<19;i++)
	for(j=0;j<19;j++)
		if(1==gomoku[i][j])
		{
			dc.SelectObject(m_bmwhite);
			pDC->BitBlt(18+30*i,18+30*j,160,160,&dc,0,0,SRCCOPY);
		}
		else if(-1==gomoku[i][j])
		{
			dc.SelectObject(m_bmblaak);
			pDC->BitBlt(18+30*i,18+30*j,160,160,&dc,0,0,SRCCOPY);
		}


3.设置鼠标

第2步结束之后,鼠标放在棋盘上仍然是指针状态,要把它变为下图

所示的棋子形状。(使用OnSetCursor函数设置棋子的图标、状态栏的图标和提示文字)

【VC++游戏开发】棋牌类游戏——五子棋_第2张图片


BOOL CGomokuView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	if(HTCLIENT==nHitTest)
	{

		CMainFrame *pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;
		CStatusBar *pStatus=&pFrm->m_wndStatusBar;
		if(isWhite)
		{
			if(pStatus)
			{
				pStatus->GetStatusBarCtrl().SetIcon(0,hiconWhite);
				pStatus->SetPaneText(0,"白棋下");
			}
			SetCursor(hcursorWhite);
		}
		else 
		{
			SetCursor(hcursorBlack);
			if(pStatus)
			{
				pStatus->GetStatusBarCtrl().SetIcon(0,hiconBlack);
				pStatus->SetPaneText(0,"黑棋下");
			}
		}
		return 1;

	}

	return CView::OnSetCursor(pWnd, nHitTest, message);
}


第3步:

实现游戏操作

现在开始把棋子放在棋盘上

使用OnLButtonUp函数,在函数内除了把棋子放在棋盘上,还要判断游戏是否结束。如果未结束,要切换棋子状态(下完黑棋下白棋),下棋的时候,要判断原来位置是否有棋子,如果有,就不能再放了。

(关于如何把棋子放在棋盘上 和 如何判断是否结束,代码比较多,就不贴出来了。。。)



第4步

附加功能

1. 打开、保存游戏

主要涉及CFileDialog、CFile、CStdioFile、CArchive的使用。可以在工具栏上面创建相应的图标来对应相应的功能

 

2.      重新开始、人人对战、人机对战、悔棋操作

常见的悔棋操作一般可以一直回到第一步,这里为了简单起见,只设置回一步棋。



代码地址

VC++五子棋






 

 

 

 

 

 

 

 

 

你可能感兴趣的:(vc++,五子棋,游戏开发)