在我学习游戏开发的过程中,遇到的最大的麻烦就是不知道一个游戏的完整实现过程,代码倒是其次。
这里,总结一下我做过的游戏,主要是梳理整每个步骤。
先看下最终的效果
第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函数设置棋子的图标、状态栏的图标和提示文字)
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++五子棋