您的位置:首页 > 编程语言 > C语言/C++

使用MFC做贪吃蛇小游戏

2017-07-24 20:08 435 查看
1、先启动vs2013 -- >新建项目 -->选择一个MFC应用程序 -->填上名称以及项目的位置 -->确定2、在应用程序向导中选择基于对话框的应用程序 -->完成。3、在资源视图中,把向导为我们生成的控件删掉。4、然后按F5运行一下程序。运行结果如下。一个空白的对话框。5、下面就要开始在这个对话框上面制作我们的游戏界面了!首先,我们需要做一下游戏界面的规划,在这里代码部分讲解初始化贪吃蛇起初有3个节点,长度为3,起始坐标;     食物默认为 1无0有 当然我更加喜欢0无1有*/void CMFC_SNAKEView::OnInitialUpdate(){CView::OnInitialUpdate();Snake[0].x = 10;Snake[0].y = 10;Snake[1].x = 11;Snake[1].y = 10;Snake[2].x = 12;Snake[2].y = 10;Snake[0].direct = 3;Snake[0].len = 3;Food.isfood = 1;// TODO: Add your specialized code here and/or call the base class}
/*对OnKeyDown()具体添加代码*/void CMFC_SNAKEView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){// TODO: Add your message handler code here and/or call defaultswitch (nChar){case VK_UP:if (Snake[0].direct != 2)Snake[0].direct = 1; break;case VK_DOWN:if (Snake[0].direct != 1)Snake[0].direct = 2; break;case VK_LEFT:if (Snake[0].direct != 4)Snake[0].direct = 3; break;case VK_RIGHT:if (Snake[0].direct != 3)Snake[0].direct = 4; break;}CView::OnKeyDown(nChar, nRepCnt, nFlags);CView::OnKeyDown(nChar, nRepCnt, nFlags);}/*Step 3*/void CMFC_SNAKEView::OnRButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default// TODO: Add your message handler code here and/or call defaultCString str;str.Format(_T("%d,%d"), point.x, point.y);AfxMessageBox(str);CView::OnRButtonDown(nFlags, point);CView::OnRButtonDown(nFlags, point);CView::OnRButtonDown(nFlags, point);}/*Step 4*/int CMFC_SNAKEView::oninit(){CDC *pDC = GetDC();CBrush DrawBrush = (RGB(100, 100, 100));CBrush *Drawbrush = pDC->SelectObject(&DrawBrush);for (int i = 0; i <= Snake[0].len - 1; i++)pDC->Rectangle(Snake[i].x * 20, Snake[i].y * 20, (Snake[i].x + 1) * 20, (Snake[i].y + 1) * 20);pDC->SelectObject(DrawBrush);return 0;/*此句在编译时出现必须有返回值 自己加的return 0,需要注意*/}/*Step 5 控件添加代码*///添加计时器void CMFC_SNAKEView::OnStart(){// TODO: Add your command handler code hereSetTimer(1, 3000, NULL);AfxMessageBox(_T("3秒后开始游戏!"));}
//添加暂停按钮void CMFC_SNAKEView::OnPause(){// TODO: Add your command handler code hereKillTimer(1);AfxMessageBox(_T("暂停游戏..."));}
//添加退出按钮void CMFC_SNAKEView::OnExit(){// TODO: Add your command handler code hereAfxMessageBox(_T("退出游戏..."));exit ;}void CMFC_SNAKEView::OnContinue(){// TODO: Add your command handler code hereSetTimer(1, 10, NULL);//第一个参数用于表示要设置的Timer事件的ID,用于区分存在多个Timer的情况//第二个参数表示时间间隔,多长时间会触发一次这个事件,以毫秒为单位//第三个参数表示回调函数,当事件发生的时候会调用这个函数,如果这个参数为空,当事件发生的时候,将向应用程序的消息队列发送WM_TIMER消息,一般都不写回调函数,直接处理CWnd的WM_TIMER消息就可以了}/*Step 6 对OnDraw()的添加代码*///画蛇身选颜色void CMFC_SNAKEView::OnDraw(CDC* pDC){CMFC_SNAKEDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCBrush backBrush(RGB(100, 100, 0));CBrush* pOldBrush = pDC->SelectObject(&backBrush);CRect rect;pDC->GetClipBox(&rect);pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);pDC->SelectObject(pOldBrush);pDC->Rectangle(19, 19, 501, 501);oninit();}//游戏进行后不同阶段游戏难度不同(吃食物后增加蛇移动速度)/*Step 7 对OnTime()的添加代码*/void CMFC_SNAKEView::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCDC *pDC = GetDC();CString soure;if (Snake[0].len == 3){SetTimer(1, 370, NULL);}if (Snake[0].len == 6){SetTimer(1, 270, NULL);}if (Snake[0].len == 9){SetTimer(1, 200, NULL);}if (Snake[0].len == 12){SetTimer(1, 100, NULL);}soure.Format(_T("得分:%d!", (Snake[0].len - 3) * 10));//撞界判断if (Snake[0].x * 20 <= 37 || Snake[0].y * 20 <= 37 || Snake[0].x * 20 >= 462 || Snake[0].y * 20 >= 462){KillTimer(1);AfxMessageBox(soure);// s=0;}//蛇身相撞判断if (Snake[0].len>3)for (int sn = Snake[0].len - 1; sn>0; sn--){if (Snake[0].x * 20 == Snake[sn].x * 20 && Snake[0].y * 20 == Snake[sn].y * 20){KillTimer(1);AfxMessageBox(soure);//  s=0;}}///////////////////////////////////////////////////////////////////////////pDC->SelectStockObject(WHITE_PEN);pDC->Rectangle(Snake[Snake[0].len - 1].x * 20, Snake[Snake[0].len - 1].y * 20, (Snake[Snake[0].len - 1].x + 1) * 20, (Snake[Snake[0].len - 1].y + 1) * 20);for (int i = Snake[0].len - 1; i>0; i--){Snake[i].x = Snake[i - 1].x;Snake[i].y = Snake[i - 1].y;}//行走方向判断if (Snake[0].direct == 1)Snake[0].y--;if (Snake[0].direct == 2)Snake[0].y++;if (Snake[0].direct == 3)Snake[0].x--;if (Snake[0].direct == 4)Snake[0].x++;pDC->SelectStockObject(BLACK_PEN);CBrush DrawBrush = (RGB(100, 100, 100));CBrush *Drawbrush = pDC->SelectObject(&DrawBrush);pDC->Rectangle(Snake[0].x * 20, Snake[0].y * 20, (Snake[0].x + 1) * 20, (Snake[0].y + 1) * 20);pDC->SelectObject(DrawBrush);//判断吃豆的条件,撞到就吃if (Snake[0].x * 20 == Food.x * 20 && Snake[0].y * 20 == Food.y * 20){Snake[0].len++;Food.isfoo4000d = 1;Snake[Snake[0].len - 1].x = Snake[Snake[0].len - 2].x;Snake[Snake[0].len - 1].y = Snake[Snake[0].len - 2].y;}//如果食物被吃了 就生成if (Food.isfood == 1){srand((unsigned)time(NULL));do{for (int isfo = Snake[0].len - 1; isfo >= 0; isfo--)if (Snake[0].x * 20 == Snake[isfo].x * 20 && Snake[0].y * 20 == Snake[isfo].y * 20){Food.x = rand() % 25 ;Food.y = rand() % 25;}} while (Food.x * 20<70 || Food.y * 20<70 || Food.x * 20>430 || Food.y * 20>430);pDC->Rectangle(Food.x * 20, Food.y * 20, (Food.x + 1) * 20, (Food.y + 1) * 20);Food.isfood = 0;}CView::OnTimer(nIDEvent);}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC 游戏 贪吃蛇 c++