上一篇文章中我们留了个坑,就是 吃了东西以后 蛇身没有变长,其实有两个方法 在吃到东西以后 添加一个蛇尾,或者添加一个蛇头都行,我们采用第一种方法 在蛇尾添加一个元素m_listSnake.push_back(*itHead); 我们只要往list的尾部添加一个元素即可 这个元素的X Y其实无所谓的,因为蛇一移动,我们便会对他进行重新计算,也就是说 不管这个值是多少 一动 就会到最后面去,为了显示效果,我们选蛇身上任意一个元素丢进去,最终的OnTimer函数 代码如下

void CSnakeDlg::OnTimer(UINT_PTR nIDEvent)
{
	if (nIDEvent == BEGINGAME)
	{
		list<SNAKE>::iterator itHead = m_listSnake.end();
		list<SNAKE>::iterator itBody = m_listSnake.end();
		
		itBody--;
		itHead--;

		while (itHead != m_listSnake.begin())
		{
			itHead--;
			itBody->nCol = itHead->nCol;
			itBody->nRow = itHead->nRow;
			itBody--;
		}
		itHead = m_listSnake.begin();
		if (m_arrGameRange[itHead->nCol][itHead->nRow] == 2)
		{
			m_arrGameRange[itHead->nCol][itHead->nRow] = 0;
			m_listSnake.push_back(*itHead);
			CreateFood();
		}
		switch (m_snakeMove)
		{
		case LEFT:
			itHead->nCol -= 1;
			break;
		case RIGHT:
			itHead->nCol += 1;
			break;
		case UP:
			itHead->nRow -= 1;
			break;
		case DOWN:
			itHead->nRow += 1;
			break;
		}
		
		Invalidate();
	}

	CDialogEx::OnTimer(nIDEvent);
}

好了 开始今天的内容,让蛇碰到墙壁会死掉的效果~ 

那么 我们只要判断判断 蛇头的行等于0 或者列等于0 再或者行等于最好一行 列等于最后一列 那就表示已经碰到墙壁,我们就弹出一个Game Over的对话框,并且用KillTimer结束定时器

方法二 就是 判断m_arrGameRange[itHead->nCol][itHead->nRow] != 0 的话 就表示碰到墙壁

代码如下

void CSnakeDlg::OnTimer(UINT_PTR nIDEvent)
{
	if (nIDEvent == BEGINGAME)
	{
		list<SNAKE>::iterator itHead = m_listSnake.end();
		list<SNAKE>::iterator itBody = m_listSnake.end();
		itBody--;
		itHead--;

		while (itHead != m_listSnake.begin())
		{
			itHead--;
			itBody->nCol = itHead->nCol;
			itBody->nRow = itHead->nRow;
			itBody--;
		}
		itHead = m_listSnake.begin();
		//判断蛇是否碰到墙壁
// 		if (itHead->nRow <= 0 || itHead->nRow >= GAME_ROW - 1 ||
// 			itHead->nCol <= 0 || itHead->nCol >= GAME_COL - 1)
// 		{
// 			KillTimer(BEGINGAME);
// 
// 			MessageBox(L"Game Over");
// 			return;
// 		}
		if (m_arrGameRange[itHead->nCol][itHead->nRow] != 0)
		{
			KillTimer(BEGINGAME);
			 
			MessageBox(L"Game Over");
			return;
		}
		if (m_arrGameRange[itHead->nCol][itHead->nRow] == 2)
		{
			m_arrGameRange[itHead->nCol][itHead->nRow] = 0;
			m_listSnake.push_back(*itHead);
			CreateFood();
		}
		switch (m_snakeMove)
		{
		case LEFT:
			itHead->nCol -= 1;
			break;
		case RIGHT:
			itHead->nCol += 1;
			break;
		case UP:
			itHead->nRow -= 1;
			break;
		case DOWN:
			itHead->nRow += 1;
			break;
		}
		
		Invalidate();
	}

	CDialogEx::OnTimer(nIDEvent);
}