C++ Rookiss Part3 자료구조와 알고리즘 : 우수법
🙇♀️우수법
오른손 법칙, 순환구조가 아니고 모든 정점들이 이어져있다면 가능
🪐우수법
🪐player.h
#pragma once
class Board;
class Player
{
enum
{
MOVE_TICK = 20
};
public:
void Init(Board* board);
void Update(uint64 deltaTick);
void SetPos(Pos pos) { _pos = pos; }
Pos GetPos() { return _pos; }
bool CanGo(Pos pos);
private:
Pos _pos = {};
int32 _dir = DIR_UP;
Board* _board = nullptr;
vector<Pos> _path; // 이때까지 갔던 경로를 vector로 저장
uint32 _pathIndex = 0;
uint64 _sumTick = 0;
};
🪐player.cpp
#include "pch.h"
#include "Player.h"
#include "Board.h"
void Player::Init(Board* board)
{
_pos = board->GetEnterPos(); // 플레이어 시작위치 설정
_board = board; // 멤버 변수 보드에 board 대입
Pos pos = _pos; // 멤버 변수 _pos를 복사
_path.clear();
_path.push_back(pos);
// 목적지 도착하기 전에는 계속 실행
Pos dest = board->GetExitPos();
Pos front[4] = // 이렇게 하지 않는다면 switch사용
{
Pos { -1, 0 }, // UP
Pos { 0, -1 }, // LEFT
Pos { 1, 0 }, // DOWN
Pos { 0, 1 }, // RIGHT
};
while (pos != dest)
{
// 1. 현재 바라보는 방향을 기준으로 오른쪽으로 갈 수 있는지 확인.
int32 newDir = (_dir - 1 + DIR_COUNT) % DIR_COUNT;
if (CanGo(pos + front[newDir]))
{
// 오른쪽 방향으로 90도 회전
_dir = newDir;
// 앞으로 한 보 전진
pos += front[_dir];
_path.push_back(pos);
}
// 2. 현재 바라보는 방향을 기준으로 전진 할 수 있는지 확인.
else if (CanGo(pos + front[_dir]))
{
// 앞으로 한 보 전진
pos += front[_dir];
_path.push_back(pos);
}
else
{
// 왼쪽 방향으로 90도 회전
_dir = (_dir + 1) % DIR_COUNT; // switch로 대체 가능
}
}
}
void Player::Update(uint64 deltaTick)
{
if (_pathIndex >= _path.size())
return;
_sumTick += deltaTick;
if (_sumTick >= MOVE_TICK)
{
_sumTick = 0;
_pos = _path[_pathIndex];
_pathIndex++;
}
}
bool Player::CanGo(Pos pos) // 입력한 위치가 빈 곳 인지 아닌지 체크
{
TileType tileType = _board->GetTileType(pos);
return tileType == TileType::EMPTY;
}