贪吃蛇游戏——主要代码

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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值