25일 차 : 베이직 반 복습 ~ 5번과제, 6번 과제
프로그래스 코딩 연습
베이직반 복습 공부 (2h)
2번 과제 복습
추상클래스 base class 쓰는 이유
멤버 변수, 멤버 함수가 공통으로 사용될 시 추상 class를 상속받아 사용
순수 가상 함수 : 자식에서 무조건 구현해야하는 함수 (virtual sleep() = 0; )
가상 함수 : 자식에서 선택적으로 구현하는 함수 (virtual sleep(); )
순수 가상함수를 구현하지 않으면 에러 발생 Override
3번 과제 복습
타입에 의존하지 않는 템플릿을 사용하기 전, 정수 int형 타입으로 만들어두고 나중에 템플릿을 바꾸는 것도 괜찮음
오버로딩 : 자료 타입에 따라 출력값이 자동 지정된다
5번 과제
헤더 파일
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "RandomMovementActor.generated.h"
UCLASS()
class HW05_API ARandomMovementActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ARandomMovementActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
private:
int32 CurrentX;
int32 CurrentY;
int32 MoveCount;
// 총 이동거리
double TotalDistanceMoved;
// 총 이벤트 발생 횟수
int32 EventCount;
int32 GetRandomStep();
void MoveCharacterRandomly();
// 이벤트 발생 여부 (50%)
bool ShouldGenerateEvent();
double CalculateDistance(int32 X1, int32 Y1, int32 X2, int32 Y2);
};
cpp 파일
#include "RandomMovementActor.h"
#include "Kismet/KismetMathLibrary.h"
#include "Math/UnrealMathUtility.h"
// Sets default values
ARandomMovementActor::ARandomMovementActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = false;
CurrentX = 0;
CurrentY = 0;
MoveCount = 0;
//도전 과제 초기화
TotalDistanceMoved = 0.0;
EventCount = 0;
}
// Called when the game starts or when spawned
void ARandomMovementActor::BeginPlay()
{
Super::BeginPlay();
//도전 값 초기화
CurrentX = 0;
CurrentY = 0;
MoveCount = 0;
TotalDistanceMoved = 0.0;
EventCount = 0;
UE_LOG(LogTemp, Warning, TEXT("ARandomMovementActor has spawned!Starting random movement simulation."));
UE_LOG(LogTemp, Warning, TEXT("Initial Position : (%d, %d"), CurrentX, CurrentY);
MoveCharacterRandomly();
}
// Called every frame
void ARandomMovementActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
int32 ARandomMovementActor::GetRandomStep() {
return FMath::RandRange(0, 1);
}
double ARandomMovementActor::CalculateDistance(int32 X1, int32 Y1, int32 X2, int32 Y2)
{
double dx = static_cast<double>(X2 - X1);
double dy = static_cast<double>(Y2 - Y1);
return FMath::Sqrt(dx * dx + dy * dy);
}
void ARandomMovementActor::MoveCharacterRandomly() {
for (int32 i = 0; i < 10; ++i)
{
MoveCount++;
// 이전 좌표
int32 PrevX = CurrentX;
int32 PrevY = CurrentY;
// 랜덤 이동
int32 StepX = GetRandomStep();
int32 StepY = GetRandomStep();
// 새 좌표 계산
CurrentX += StepX;
CurrentY += StepY;
// 이동거리 계산 및 출력 (유클리드 거리)
double Distance = CalculateDistance(PrevX, PrevY, CurrentX, CurrentY);
TotalDistanceMoved += Distance;
// 이벤트 발생 확인 및 출력
bool bEventOccurred = ShouldGenerateEvent();
FString EventStatus = bEventOccurred ? TEXT("Event Occurred.") : TEXT("No Event.");
if (bEventOccurred)
{
EventCount++;
}
UE_LOG(LogTemp, Log, TEXT("Step %d : Moved by (%d, %d). Current Position : (%d, %d). Distance : %.2f. %s"), MoveCount, StepX, StepY, CurrentX, CurrentY, Distance, *EventStatus);
}
UE_LOG(LogTemp, Warning, TEXT("Random Movement Simulation Complete."));
// 총 이동거리 총 이벤트 발생 횟수 출력
UE_LOG(LogTemp, Warning, TEXT("Total Distance Moved : %.2f"), TotalDistanceMoved);
UE_LOG(LogTemp, Warning, TEXT("Total Events Occurred : %d"), EventCount);
}
// RandRange 활용하여 50% 확률로 이벤트 발생
bool ARandomMovementActor::ShouldGenerateEvent()
{
int32 RandomValue = FMath::RandRange(1, 100);
float Probability = 50.0f;
if (RandomValue <= Probability)
{
return true;
}
else
{
return false;
}
}
6번 과제 - TRPG 만들기
기획 - 텍스트로 진행되는 RPG 게임, 선택지를 통해 직업과 던전을 정할 수 있고 캐릭터 성장이 무한정으로 가능하
장르 - 로그라이크, RPG
포인트 - 스토리텔링과 선택지 옵션, 여러차례 도전하는 로그라이크 재미