class CCcsDlg : public CDialog { // Construction public: int m_iGameOver; //游戏结束标志 int m_iTimes; //设置时钟速度(游戏难度) int m_iDirection; //蛇游动方向 int m_iLife; //生命点数 int m_iLen; //蛇长 int m_iColNum; //彩点个数(1~3个) int m_iScore; //游戏得分 int Over(); void fei(); struct SColPoint m_arrColPoi[3]; //彩点 POINT m_arrSnake[600]; ............. void CCcsDlg::fei() //随机分配彩点 { int key; do { key = 0; int x = rand()/(int)(RAND_MAX/25); int y = (int)rand()%23; m_arrColPoi[m_iColNum].x = 20*x; m_arrColPoi[m_iColNum].y = 20*y; for (int i = 0; i < m_iLen; i++) { if (m_arrSnake[i].x == m_arrColPoi[m_iColNum].x && m_arrSnake[i].y == m_arrColPoi[m_iColNum].y) { key = 1; } } for (i = 0; i < m_iColNum; i++) { if (m_arrColPoi[i].x == m_arrColPoi[m_iColNum].x && m_arrColPoi[i].y == m_arrColPoi[m_iColNum].y) { key = 1; } } }while (key); int k = rand()/(int)(RAND_MAX/10); if (k < 5) { m_arrColPoi[m_iColNum].col = RGB(0, 255, 0); } else if(k < 8) { m_arrColPoi[m_iColNum].col = RGB(255, 0, 0); } else { m_arrColPoi[m_iColNum].col = RGB(0, 0, 255); } m_iColNum++; } oid CCcsDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if (nIDEvent == 1) { //开始时钟1的计算↓ if (m_iColNum<3) { fei(); } CBitmap Bitmap; /*加载背景图*/ Bitmap.LoadBitmap(IDB_BITMAP2); CClientDC myDC(this); CDC MemDC; MemDC.CreateCompatibleDC(&myDC); CBitmap *OldBitmap = MemDC.SelectObject(&Bitmap); BITMAP bm; Bitmap.GetBitmap(&bm); myDC.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &MemDC, 0, 0, SRCCOPY); Bitmap.DeleteObject(); myDC.SelectObject(OldBitmap); //设置画笔、字体等,用于输出生命,得分. CFont *OldFont; CFont NewFont; COLORREF OldPenCol; COLORREF OldBrushCol; LOGFONT MyFont = {40, 15, 0, 0, 30, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "黑体"}; NewFont.CreateFontIndirect(&MyFont); OldBrushCol = myDC.SetBkColor( RGB(0,0,0) ); OldPenCol = myDC.SetTextColor( RGB(255,255,255) ); OldFont = myDC.SelectObject(&NewFont); char str1[5]; sprintf(str1, "%d", m_iScore); myDC.TextOut(620, 25, str1); sprintf(str1, "%d", m_iLife); myDC.TextOut(625, 255, str1); myDC.SetBkColor(OldBrushCol); //恢复设备环境 myDC.SetTextColor(OldPenCol); myDC.SelectObject(OldFont); int i; switch (m_iDirection) //判断方向,然后移动 { case 1: for (i = m_iLen-1; i >= 0; i--) { m_arrSnake[i+1] = m_arrSnake[i]; } m_arrSnake[0].y -= 20; break; case 2: for (i = m_iLen-1; i >= 0; i--) { m_arrSnake[i+1] = m_arrSnake[i]; } m_arrSnake[0].x += 20; break; case 3: for (i = m_iLen-1; i >= 0; i--) { m_arrSnake[i+1] = m_arrSnake[i]; } m_arrSnake[0].y += 20; break; case 4: for (i = m_iLen-1; i >= 0; i--) { m_arrSnake[i+1] = m_arrSnake[i]; } m_arrSnake[0].x -= 20; break; } if ( m_arrSnake[0].x < 0 || m_arrSnake[0].x > 24*20 || m_arrSnake[0].y < 0 || m_arrSnake[0].y > 22*20 ) //碰到边GameOver { Over();return; } for (i = 3; i < m_iLen; i++) //碰到自身GameOver { if ( m_arrSnake[0].x == m_arrSnake[i].x && m_arrSnake[0].y == m_arrSnake[i].y ) { Over();return; } } for (i = 0; i < m_iColNum; i++) { if (m_arrSnake[0].x == m_arrColPoi[i].x && m_arrSnake[0].y == m_arrColPoi[i].y) //判断是否吃到东西 { m_iLen++; switch (m_arrColPoi[i].col) { case RGB(0, 255, 0): { m_iScore += 3; break; } case RGB(255, 0, 0): { m_iScore+=6; break; } case RGB(0, 0, 255): { m_iScore+=3; break; } } if (m_iLife < 30) { m_iLife += 2; } if (m_iTimes != 100 && m_iScore > 500 ) //据score从设时钟间隔 { m_iTimes = 100; OnInitDialog(); } else if(m_iScore > 300) { m_iTimes = 120; OnInitDialog(); } else if (m_iScore > 150) { m_iTimes = 150; OnInitDialog(); } else if(m_iScore > 50) { m_iTimes = 180; OnInitDialog(); } for (int j = i; j < m_iColNum-1; j++) { m_arrColPoi[j] = m_arrColPoi[j+1]; } m_iColNum--; break; } } for (i = 0; i < m_iLen; i++) // 画蛇 { myDC.Ellipse(m_arrSnake[i].x, m_arrSnake[i].y, m_arrSnake[i].x+20, m_arrSnake[i].y+20); } CBrush *BrushOld; //画彩点 CBrush BrushNew; for (i = 0; i < m_iColNum; i++) { BrushNew.CreateSolidBrush(m_arrColPoi[i].col); BrushOld = myDC.SelectObject(&BrushNew); myDC.Ellipse(m_arrColPoi[i].x, m_arrColPoi[i].y, m_arrColPoi[i].x+20, m_arrColPoi[i].y+20); myDC.SelectObject(BrushOld); BrushNew.DeleteObject(); } } //结束时钟1
贪吃蛇游戏——主要代码
最新推荐文章于 2024-03-02 18:08:16 发布