VC版贪吃蛇

此处,我感受到复用性的好处,将与显示或平台无关的东西分装在一起,如果能进一步抽象的尽量抽象,就可以充分发挥其复用性。

    具体的关于Snake的设计,请参见我的博客《C++版贪吃蛇游戏》。

下面是VC下的游戏界面截图:

在这里说一下VC下与C++不同的及新家的东西。

1)播放背景音乐:

[cpp]  view plain copy
  1. //引入库  
  2. #include <mmsystem.h>  
  3. #pragma comment(lib,"winmm.lib")      
  4. // TODO: Add your command handler code here  
  5.     /加背景音乐  
  6.     PlaySound(NULL,NULL,NULL);//停止用playsound函数播放的音乐  
  7.     mciSendString( "open ./res/650.mp3 alias bk", 0, 0, 0 );  
  8.     mciSendString( "play bk repeat", 0, 0, 0 );  
  9.     ///  

2)显示的不同,这是最大的变化,但不难,因为在C++中就已用二维数组表示了,这里只需根据二维数组的值,来显示成为不同的图片就行了。

看一部分代码:

[cpp]  view plain copy
  1. /  
  2. // CSnakeView message handlers  
  3. void CSnakeView::display(int image[20][20],CDC *pDC)  
  4. {  
  5.   
  6.     int nSize=20;  
  7.     CRect rect;  
  8.     CRect rc;  
  9.     CBitmap bitmap9;  
  10.     bitmap9.LoadBitmap(IDB_BITMAP8);  
  11.     CBrush brush9;              
  12.     brush9.CreatePatternBrush(&bitmap9);  
  13.     GetClientRect(&rect);  
  14.     pDC->FillRect(rect,&brush9);   
  15. //  pDC->Rectangle(21,21,421,421);  
  16.     CBitmap bitmap10;  
  17.     bitmap10.LoadBitmap(IDB_BITMAP9);  
  18.     CBrush brush10;             
  19.     brush10.CreatePatternBrush(&bitmap10);  
  20.     CRect rec1,rec2,rec3,rec4;  
  21.     rec1=CRect(0,0,440,20);  
  22.     rec2=CRect(420,20,440,440);  
  23.     rec3=CRect(0,0,20,440);  
  24.     rec4=CRect(20,420,440,440);  
  25.     pDC->FillRect(rec1,&brush10);  
  26.     pDC->FillRect(rec2,&brush10);  
  27.     pDC->FillRect(rec3,&brush10);  
  28.     pDC->FillRect(rec4,&brush10);  
  29.     
  30.     for(i=0;i<20;i++)    
  31.     {     
  32.     for(j=0;j<20;j++)    
  33.     {  
  34.         rc=CRect(j*nSize+20,i*nSize+20,(j+1)*nSize+20,(i+1)*nSize+20);  
  35.         if(image[i][j]!=0)    
  36.         {  
  37.             if(image[i][j]==3)  
  38.             {  
  39.             CBitmap bitmap2;  
  40.             bitmap2.LoadBitmap(IDB_BITMAP3);  
  41.             CBrush brush1;              
  42.             brush1.CreatePatternBrush(&bitmap2);  
  43.             CBrush *pOldBrush = pDC->SelectObject(&brush1);  
  44.             pDC->Ellipse(rc);  
  45.             pDC->SelectObject(pOldBrush);   
  46.             //pDC->FillRect(rc,&brush1);  
  47.             }  
  48.             else if(image[i][j]==1)  
  49.             {  
  50.                 if(direction==2)  
  51.                 {  
  52.                     CBitmap bitmap;  
  53.                     bitmap.LoadBitmap(IDB_BITMAP1);  
  54.                     CBrush brush;               
  55.                     brush.CreatePatternBrush(&bitmap);  
  56.                     pDC->FillRect(rc,&brush);  
  57.                 }  
  58.                 else if(direction==4)  
  59.                 {  
  60.                     CBitmap bitmap4;  
  61.                     bitmap4.LoadBitmap(IDB_BITMAP5);  
  62.                     CBrush brush4;              
  63.                     brush4.CreatePatternBrush(&bitmap4);  
  64.                     pDC->FillRect(rc,&brush4);  
  65.                 }  
  66.                 else if(direction==6)  
  67.                 {  
  68.                     CBitmap bitmap5;  
  69.                     bitmap5.LoadBitmap(IDB_BITMAP6);  
  70.                     CBrush brush5;              
  71.                     brush5.CreatePatternBrush(&bitmap5);  
  72.                     pDC->FillRect(rc,&brush5);  
  73.                 }  
  74.                 else if(direction==8)  
  75.                 {  
  76.                     CBitmap bitmap6;  
  77.                     bitmap6.LoadBitmap(IDB_BITMAP7);  
  78.                     CBrush brush6;              
  79.                     brush6.CreatePatternBrush(&bitmap6);  
  80.                     pDC->FillRect(rc,&brush6);  
  81.                 }  
  82.             }  
  83.             else if(image[i][j]==2)  
  84.             {  
  85.                 CBitmap bitmap3;  
  86.                 bitmap3.LoadBitmap(IDB_BITMAP4);  
  87.                 CBrush brush3;              
  88.                 brush3.CreatePatternBrush(&bitmap3);  
  89.                 CBrush *pOldBrush = pDC->SelectObject(&brush3);  
  90.                 pDC->Ellipse(rc);  
  91.                 pDC->SelectObject(pOldBrush);  
  92.             //  pDC->FillRect(rc,&brush3);  
  93.             }  
  94.         }  
  95.     }    
  96. }    
  97.     CBitmap bitmap11;  
  98.     bitmap11.LoadBitmap(IDB_BITMAP10);  
  99.     CBrush brush11;             
  100.     brush11.CreatePatternBrush(&bitmap11);  
  101.     CRect rec5;  
  102.     rec5=CRect(440,0,540,495);  
  103.     pDC->FillRect(rec5,&brush11);  
  104. char buf[100];  
  105. //GotoXY(46,9);   
  106. sprintf(buf,"SCORE:%-5d",score);         //记录分数  
  107. //pDC->SetBkMode(TRANSPARENT);  
  108. pDC->TextOut(445,120,buf);  
  109. //GotoXY(46,10);   
  110. sprintf(buf,"LEVEL=%-5d",level);         //记录等级  
  111. pDC->TextOut(445,150,buf);  
  112. }  

3)为了避免屏幕的闪烁,采用双缓冲机制。

代码:

[cpp]  view plain copy
  1. void CSnakeView::OnDraw(CDC* pDC)  
  2. {  
  3.     CSnakeDoc* pDoc = GetDocument();  
  4.     ASSERT_VALID(pDoc);  
  5.       
  6.     int m_nWidth,m_nHeight;  
  7.     CDC m_memDC;  
  8.     CBitmap m_memBmp;  
  9.     //1.用于映射屏幕的内存环境  
  10.     //获取游戏窗口的大小用于设置下面内存为徒的尺寸  
  11.     CRect windowRect;  
  12.     GetClientRect(&windowRect);  
  13.     m_nWidth=windowRect.Width();  
  14.     m_nHeight=windowRect.Height();  
  15.     //内存设备环境与屏幕内存环境相关联  
  16.     m_memDC.CreateCompatibleDC(pDC);  
  17.     //内存为图与屏幕关联,大侠为游戏窗口的尺寸  
  18.     m_memBmp.CreateCompatibleBitmap(pDC,m_nWidth,m_nHeight);  
  19.     //内存设备环境与内存位图关联,以便通过m_memDC在内存为图上画图  
  20.     m_memDC.FillSolidRect(windowRect,RGB(255,255,255));  
  21.     m_memDC.SelectObject(&m_memBmp);  
  22.     display(image,&m_memDC);  
  23.     //把内存DC上的图形拷贝到电脑屏幕上  
  24.     pDC->BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);  
  25.     m_memDC.DeleteDC(); //删除DC  
  26.     m_memBmp.DeleteObject();//删除位图  
  27.     // TODO: add draw code for native data here  
  28. }  

4)其他的就是采用VC中的按键响应函数及Timer时间控制就OK了,别的都和C++差不多。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值