1. 맵을 만든다.(벽에 닿으면 못나가게 충돌체크)
2. 움직일 플레이어와 도착지점을 만든다.
3. 플레이어가 도착점에 들어가면 종료
-----------------------------------------------------------------------------------------------------------
이번 문제는 VS에서 주는 기본적인 함수를 알고 깨야한다.
바로 이 함수인데, 좌표값을 잡아주는 함수이다. 함수 이름은 마음대로 정해도 된다.
꼭 배열로 안 만들어도 되지만, 쉽고 간편하게 만들기 위해서 배열을 사용한다.
필자는 배열에 0 , 1 , 2라는 숫자를 넣었고 각각 ROAD,BLOCK, FINISH 로 enum으로 이름을 정의해 줬다. (꼭 해줄 필요는 없다. 가독성을 위해서 한 것 이므로)
이번꺼는 원래 C++로 짰다. C로 바꾸기 귀찮아서.... C++로 올리겠다. 차이는 구조체를 클래스로 만들어줬자는 거 밖에 없으므로 그렇게 혼동은 안 올 것이다.
//Terrain.h
#pragma once
#include"Define.h"
class Terrain
{
private:
int m_state;
int m_x;
int m_y;
char *m_name;
public:
// 초기화
Terrain();
void Init();
void SetPos(int _x, int _y);
void Render();
int GetX();
int GetY();
int Getstate();
void Setstate(int _state);
};
//Terrain.cpp
#include"Terrain.h"
Terrain::Terrain()
{
int m_state = 0;
int m_x = 0;
int m_y = 0;
char *m_name = "";
}
void Terrain::Init()
{
if (m_state == state::BLOCK)
{
m_name = "□";
}
else if (m_state == state::ROAD)
{
m_name = "";
}
else if (m_state == state::FINISH)
{
m_name = "★";
}
}
void Terrain::SetPos(int _x, int _y)
{
m_x = _x;
m_y = _y;
}
void Terrain::Render()
{
setXY(m_x * 2, m_y);
printf("%s", m_name);
}
int Terrain::GetX()
{
return m_x;
}
int Terrain::GetY()
{
return m_y;
}
int Terrain::Getstate()
{
return m_state;
}
void Terrain::Setstate(int _state)
{
m_state = _state;
}
//Object.h
#pragma once
#include"Define.h"
class Object
{
private:
int m_x;
int m_y;
char *m_name;
public:
Object();
void Move(int _x, int _y);
void SetPos(int _x, int _y);
void Render();
int GetX();
int GetY();
};
//Object.cpp
#include"Object.h"
Object::Object()
{
m_x = 1;
m_y = 1;
m_name = "○";
}
void Object::Move(int _x, int _y)
{
m_x += _x;
m_y += _y;
}
void Object::SetPos(int _x, int _y)
{
m_x = _x;
m_y = _y;
}
void Object::Render()
{
setXY(m_x * 2, m_y);
printf("%s", m_name);
}
int Object::GetX()
{
return m_x;
}
int Object::GetY()
{
return m_y;
}
//Define.h
#pragma once
#include <iostream>
#include<Windows.h>
#include <conio.h>
#define CLRSCR() system("cls")
#define WIDTH 10
#define HEIGHT 10
enum state {BLOCK = 1, ROAD = 0, FINISH = 2};
void setXY(int _x, int _y);
void Curclear();
//Define.cpp
#include"Define.h"
void setXY(int _x, int _y)
{
COORD cur;
cur.X = _x;
cur.Y = _y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cur);
}
// 커서 지우는 함수
void Curclear()
{
CONSOLE_CURSOR_INFO cur;
cur.dwSize = 1;
cur.bVisible = false;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cur);
}
//main.cpp
#include"Define.h"
#include"Object.h"
#include"Terrain.h"
void main()
{
Object obj;
Terrain ter[WIDTH][HEIGHT];
Curclear();
// 맵 그리는 2차원 배열
int map[WIDTH][HEIGHT] =
{
{ 1,1,1,1,1,1,1,1,1,1 },
{ 1,0,1,0,0,0,0,0,0,1 },
{ 1,0,1,0,0,0,0,1,0,1 },
{ 1,0,0,1,0,0,0,1,0,1 },
{ 1,0,0,1,0,0,0,0,0,1 },
{ 1,0,0,0,0,1,1,0,0,1 },
{ 1,0,0,0,0,1,1,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,1,1,0,2,1 },
{ 1,1,1,1,1,1,1,1,1,1 },
};
for (int i = 0; i < WIDTH; i++)
{
for (int j = 0; j < HEIGHT; j++)
{
ter[i][j].SetPos(i, j);
ter[i][j].Setstate(map[i][j]);
ter[i][j].Init();
}
}
char ch;
bool check = true;
while (true == check)
{
CLRSCR();
if (_kbhit())
{
ch = _getch();
switch (ch)
{
case 'd':
if (ter[obj.GetX() + 1][obj.GetY()].Getstate() != state::BLOCK)
obj.Move(1, 0);
break;
case 'a':
if (ter[obj.GetX() - 1][obj.GetY()].Getstate() != state::BLOCK)
obj.Move(-1, 0);
break;
case 'w':
if (ter[obj.GetX()][obj.GetY() - 1].Getstate() != state::BLOCK)
obj.Move(0, -1);
break;
case 's':
if (ter[obj.GetX()][obj.GetY() + 1].Getstate() != state::BLOCK)
obj.Move(0, 1);
break;
}
}
obj.Render();
for (int i = 0; i < WIDTH; i++)
{
for (int j = 0; j < HEIGHT; j++)
{
ter[i][j].Render();
}
}
// 끝나는 지점 찾기
if (ter[obj.GetX()][obj.GetY()].Getstate() == state::FINISH)
check = false;
}
}