mfc_snake_game_ad - 8BitsCoding/RobotMentor GitHub Wiki


// Dlg.h
CImage m_draw_image;
CDC m_draw_dc;

// ๋จน์ด ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”
//COLORREF m_table[60][80] = { 0, };		// 60 * 80 * 4 = 19200 Bytes(18.75K)
//POINT m_eat_pos[MAX_EAT_COUNT];			// 8 * 300 = 2400 Bytes
MapPoint m_eat_pos[MAX_EAT_COUNT];			// 2 * 300 = 600 Bytes

// ๋ฑ€ ํฌ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”
//int m_count_map[60][80] = { 0, };			// 60 * 80 * 4 = 19200 Bytes(18.75K)
MapPoint m_snake_pos[MAX_LENGTH];			// 2 * 250 = 500 Bytes

// POINT m_pos = { 40, 30 };		// ๋…น์ƒ‰ ๋ฑ€์˜ ์œ„์น˜
MapPoint m_pos = { 40, 30 };

int m_direction = 0;			// 0 left / 1 up / 2 right / 3 bottom
int m_eat_count = 0;

int m_remain_count = MAX_EAT_COUNT;
BOOL CMFCApplication1Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// ์ด ๋Œ€ํ™” ์ƒ์ž์˜ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ ์ฐฝ์ด ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ์—๋Š”
	//  ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
	SetIcon(m_hIcon, TRUE);			// ํฐ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
	SetIcon(m_hIcon, FALSE);		// ์ž‘์€ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

	// TODO: ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

	m_draw_image.Create(801, 601, 32);
	m_draw_dc.Attach(m_draw_image.GetDC());


	m_draw_dc.SetDCBrushColor(RGB(0, 0, 0));

	srand((unsigned int)time(NULL));
	MapPoint * p = m_eat_pos, *p_check;
	for (int i = 0; i < MAX_EAT_COUNT; i++, p++) {
		p->x = rand() % 80;
		p->y = rand() % 60;

		p_check = m_eat_pos;
		for (int sub_i = 0; sub_i < i; sub_i++, p_check++) {
			if (p_check->x == p->x && p_check->y == p->y) {
				i--;
				p--;
				break;
			}
		}
	}

	DrawMap();
	SetTimer(1, 200, NULL);

	return TRUE;  // ํฌ์ปค์Šค๋ฅผ ์ปจํŠธ๋กค์— ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด TRUE๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
}
void CMFCApplication1Dlg::DrawMap()
{
	m_draw_dc.SelectStockObject(DC_BRUSH);
	m_draw_dc.SelectStockObject(DC_PEN);

	m_draw_dc.SetDCPenColor(RGB(48, 48, 12));
	m_draw_dc.SetDCBrushColor(RGB(0, 0, 0));

	// ๋งต ๊ทธ๋ฆฌ๊ธฐ
	for (int y = 0; y < 60; y++) {
		for (int x = 0; x < 80; x++)
		{
			m_draw_dc.Rectangle(x * 10, y * 10, x * 10 + 11, y * 10 + 11);
		}
	}

	// ๋จน์ด ๊ทธ๋ฆฌ๊ธฐ
	MapPoint * p = m_eat_pos;
	m_draw_dc.SetDCBrushColor(RGB(255, 0, 0));
	for (int i = 0; i < MAX_EAT_COUNT - m_eat_count; i++, p++)
	{
		m_draw_dc.Rectangle(p->x * 10, p->y * 10, p->x * 10 + 11, p->y * 10 + 11);
	}

	// ๋ฑ€ ๊ทธ๋ฆฌ๊ธฐ
	p = m_snake_pos;
	m_draw_dc.SetDCBrushColor(RGB(0, 255, 0));
	for (int i = 0; i < m_eat_count + 1; i++, p++)
	{
		m_draw_dc.Rectangle(p->x * 10, p->y * 10, p->x * 10 + 11, p->y * 10 + 11);
	}
}
void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent)
{
	if (nIDEvent == 1) {
		//m_table[m_pos.y][m_pos.x] = 0;

		if (m_direction == 0) m_pos.x--;
		else if (m_direction == 1) m_pos.y--;
		else if (m_direction == 2) m_pos.x++;
		else m_pos.y++;

		if (m_pos.x >= 0 && m_pos.x <= 79 && m_pos.y >= 0 && m_pos.y <= 59) {

			MapPoint * p = m_eat_pos;
			int eat_flag = 0;

			// ๋จน์ด ์ฒดํฌ ์ฝ”๋“œ
			for (int i = 0; i < m_remain_count; i++, p++) {
				if (p->x == m_pos.x && p->y == m_pos.y) {
					m_eat_count++;
					m_remain_count--;
					SetDlgItemInt(IDC_EAT_COUNT_EDIT, m_eat_count);
					if (m_remain_count > 0 && i < m_remain_count) {
						p->x = m_eat_pos[m_remain_count].x;
						p->y = m_eat_pos[m_remain_count].y;
					}
					eat_flag = 1;	// ๋จน์ด ๋จน์Œ
					break;
				}
			}

			// ๋จน์ด๋ฅผ ๋จน์ง€ ๋ชปํ•œ๊ฒฝ์šฐ ์ž์‹ ๊ณผ ๋งŒ๋‚˜๋Š”์ง€ ํ™•์ธ
			if (eat_flag == 0 && m_eat_count) {
				p = m_snake_pos;
				for (int i = 0; i < m_eat_count; i++, p++) {
					if (p->x == m_pos.x && p->y == m_pos.y) {
						GameOver();
					}
				}

				// ๊ผฌ๋ฆฌ๋ฅผ ๋’ค๋กœ ์ด๋™
				p = m_snake_pos + m_eat_count;
				for (int i = 0; i < m_eat_count; i++, p++) *p = *(p - 1);
			}
			// ๋จธ๋ฆฌ ์œ„์น˜ ๋Œ€์ž…
			m_snake_pos[0].x = m_pos.x;
			m_snake_pos[0].y = m_pos.y;

			DrawMap();
			CClientDC dc(this);
			m_draw_image.Draw(dc, 0, 0);
		}
		else {
			// ๊ฒŒ์ž„ ์˜ค๋ฒ„
			GameOver();
		}


	}
	else {
		CDialogEx::OnTimer(nIDEvent);
	}
}