學C++的時候,課程設計編寫了C++版的貪吃蛇遊戲,當時,將很多的東西都分裝在了Snake類中,所以,將其移植到VC中,只需將Snake類稍作修改,然後添加到VC中即可。
此處,我感受到複用性的好處,將與顯示或平台無關的東西分裝在一起,如果能進一步抽象的盡量抽象,就可以充分發揮其複用性。
具體的關於Snake的設計,請參見我的部落格《C++版貪吃蛇遊戲》。
下面是VC下的遊戲介面:
在這裡說一下VC下與C++不同的及新家的東西。
1)播放背景音樂:
//引入庫#include <mmsystem.h>#pragma comment(lib,"winmm.lib")// TODO: Add your command handler code here /////////////加背景音樂PlaySound(NULL,NULL,NULL);//停止用playsound函數播放的音樂mciSendString( "open ./res/650.mp3 alias bk", 0, 0, 0 );mciSendString( "play bk repeat", 0, 0, 0 );///////////////
2)顯示的不同,這是最大的變化,但不難,因為在C++中就已用二維數組表示了,這裡只需根據二維數組的值,來顯示成為不同的圖片就行了。
看一部分代碼:
/////////////////////////////////////////////////////////////////////////////// CSnakeView message handlersvoid CSnakeView::display(int image[20][20],CDC *pDC){int nSize=20;CRect rect; CRect rc; CBitmap bitmap9;bitmap9.LoadBitmap(IDB_BITMAP8);CBrush brush9; brush9.CreatePatternBrush(&bitmap9);GetClientRect(&rect); pDC->FillRect(rect,&brush9); //pDC->Rectangle(21,21,421,421);CBitmap bitmap10;bitmap10.LoadBitmap(IDB_BITMAP9);CBrush brush10; brush10.CreatePatternBrush(&bitmap10);CRect rec1,rec2,rec3,rec4;rec1=CRect(0,0,440,20);rec2=CRect(420,20,440,440);rec3=CRect(0,0,20,440);rec4=CRect(20,420,440,440);pDC->FillRect(rec1,&brush10); pDC->FillRect(rec2,&brush10);pDC->FillRect(rec3,&brush10);pDC->FillRect(rec4,&brush10); for(i=0;i<20;i++) {for(j=0;j<20;j++) {rc=CRect(j*nSize+20,i*nSize+20,(j+1)*nSize+20,(i+1)*nSize+20);if(image[i][j]!=0) {if(image[i][j]==3){CBitmap bitmap2;bitmap2.LoadBitmap(IDB_BITMAP3);CBrush brush1; brush1.CreatePatternBrush(&bitmap2);CBrush *pOldBrush = pDC->SelectObject(&brush1); pDC->Ellipse(rc); pDC->SelectObject(pOldBrush); //pDC->FillRect(rc,&brush1);}else if(image[i][j]==1) {if(direction==2){CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);CBrush brush; brush.CreatePatternBrush(&bitmap);pDC->FillRect(rc,&brush);}else if(direction==4){CBitmap bitmap4;bitmap4.LoadBitmap(IDB_BITMAP5);CBrush brush4; brush4.CreatePatternBrush(&bitmap4);pDC->FillRect(rc,&brush4);}else if(direction==6){CBitmap bitmap5;bitmap5.LoadBitmap(IDB_BITMAP6);CBrush brush5; brush5.CreatePatternBrush(&bitmap5);pDC->FillRect(rc,&brush5);}else if(direction==8){CBitmap bitmap6;bitmap6.LoadBitmap(IDB_BITMAP7);CBrush brush6; brush6.CreatePatternBrush(&bitmap6);pDC->FillRect(rc,&brush6);}}else if(image[i][j]==2){CBitmap bitmap3;bitmap3.LoadBitmap(IDB_BITMAP4);CBrush brush3; brush3.CreatePatternBrush(&bitmap3);CBrush *pOldBrush = pDC->SelectObject(&brush3); pDC->Ellipse(rc); pDC->SelectObject(pOldBrush);//pDC->FillRect(rc,&brush3);}}} } CBitmap bitmap11;bitmap11.LoadBitmap(IDB_BITMAP10);CBrush brush11; brush11.CreatePatternBrush(&bitmap11);CRect rec5;rec5=CRect(440,0,540,495);pDC->FillRect(rec5,&brush11);char buf[100];//GotoXY(46,9); sprintf(buf,"SCORE:%-5d",score); //記錄分數//pDC->SetBkMode(TRANSPARENT);pDC->TextOut(445,120,buf);//GotoXY(46,10); sprintf(buf,"LEVEL=%-5d",level); //記錄等級pDC->TextOut(445,150,buf);}
3)為了避免螢幕的閃爍,採用雙緩衝機制。
代碼:
void CSnakeView::OnDraw(CDC* pDC){CSnakeDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); int m_nWidth,m_nHeight;CDC m_memDC;CBitmap m_memBmp;//1.用於映射螢幕的記憶體環境//擷取遊戲視窗的大小用於設定下面記憶體為徒的尺寸CRect windowRect;GetClientRect(&windowRect);m_nWidth=windowRect.Width();m_nHeight=windowRect.Height();//記憶體裝置環境與螢幕記憶體環境相關聯m_memDC.CreateCompatibleDC(pDC);//記憶體為圖與螢幕關聯,大俠為遊戲視窗的尺寸m_memBmp.CreateCompatibleBitmap(pDC,m_nWidth,m_nHeight);//記憶體裝置環境與記憶體位元影像關聯,以便通過m_memDC在記憶體為圖上畫圖m_memDC.FillSolidRect(windowRect,RGB(255,255,255));m_memDC.SelectObject(&m_memBmp);display(image,&m_memDC);//把記憶體DC上的圖形拷貝到電腦螢幕上pDC->BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);m_memDC.DeleteDC(); //刪除DCm_memBmp.DeleteObject();//刪除位元圖// TODO: add draw code for native data here}
4)其他的就是採用VC中的按鍵響應函數及Timer時間控制就OK了,別的都和C++差不多。
轉載請標明出處:http://blog.csdn.net/u012027907