🙇‍♀️우수법

오른손 법칙, 순환구조가 아니고 모든 정점들이 이어져있다면 가능


🪐우수법


🪐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;
}