// 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);
}
}