카테고리 없음

25일 차 : 베이직 반 복습 ~ 5번과제, 6번 과제

maypawn 2025. 6. 17. 20:50

프로그래스 코딩 연습 


베이직반 복습 공부 (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 

 

포인트 - 스토리텔링과 선택지 옵션, 여러차례 도전하는 로그라이크 재미