VC版的貪吃蛇遊戲

來源:互聯網
上載者:User

    學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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.