본문 바로가기
<ALGORITHM>/NOTE

20210120(수)

by CodeGrimie 2021. 1. 20.

삽입 정렬(Insertion Sort)

범위를 늘려가면서 검사하는 것이 특징인 정렬법.

 

▼ 전체 코드

#include <cstdio>

int  Compare(int lhs, int rhs);
void Swap(int* lhs, int* rhs);
void InsertionSwap(int* pArr, int length);
void PrintArray(int* pArr, int length);

int main()
{
    int iArr[5] = { 5,4,3,2,1 };

    PrintArray(iArr, 5);

    InsertionSwap(iArr, 5);

    PrintArray(iArr, 5);

    return (0);
}

int Compare(int lhs, int rhs)
{
    return (lhs - rhs);
}

void Swap(int* lhs, int* rhs)
{
    int temp = *lhs;
    *lhs = *rhs;
    *rhs = temp;
}

void InsertionSwap(int* pArr, int length)
{
    for (int i = 1; i < length; i++)
    {
        for (int j = i; j > 0; j--)
        {
            if (Compare(pArr[j - 1], pArr[j]) > 0)
                Swap(&pArr[j - 1], &pArr[j]);
            else
                break;
        }
    }
}

void PrintArray(int* pArr, int length)
{
    printf("{ ");
    for (int i = 0; i < length; i++)
    {
        printf("%d ", pArr[i]);
    }
    printf("}\n");
};

 

두 점 사이의 거리값

▼ 게임 수학 기초 중의 기초

#include <cmath>

double GetDistance(double x1, double y1, double x2, double y2)
{
    return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}

게임은 두 점 사이의 거리 값에서 시작해서 두 점 사이의 거리 값으로 끝난다고 해보 과언이 아니다.

우리나라 중학교 의무 교육에서 배우는 삼각 함수가 이렇게 중요하고 쓸모 있는 존재였다니..

 

몬스터를 피하는 게임

플레이어가 좌표를 하나 입력하고 컴퓨터가 랜덤 한 좌표를 입력해서 피격 유무를 가리는 게임이다.

 

▼ 작동 모습

랜덤 함수라고는 하지만 똑같은 패턴으로 값을 던지는 걸 발견했다.

이걸 문제를 해결하려면 srand()라는 걸 사용해서 시드(Seed)를 바꿔줘야 한다.

 

시간문제로 적용시키지는 못했지만

double형 좌표를 배열로 표시하는 데 성공한 것에 의의를 둔다.

 

▼ 이것저것 시험해본다고 코드는 더럽다.

#include <cstdio>
#include <cstdlib>
#include <clocale>
#include <cmath>

// 좌표 구조체
typedef struct _Point2D {
    double x;
    double y;
}Point2D;

double  GetDistance(Point2D p1, Point2D p2);
int     ConvertToInt(double d);
void    DrawArray(Point2D p1, Point2D p2);

int main()
{
    _wsetlocale(LC_ALL, L"Korean");

    Point2D p1 = { 0.0f,0.0f };
    Point2D p2 = { 0.0f,0.0f };

    double monsterAttackRange = 3.0f;

    while (1)
    {
        wprintf(L"▦▦  플레이어 턴  ▦▦\n");
        wprintf(L"플레이어 좌표 : ");
        scanf_s("%lf %lf", &p1.x, &p1.y);
        printf("\n");

        wprintf(L"▦▦  몬 스 터 턴  ▦▦\n");
        wprintf(L"몬스터가 좌표를 입력합니다.\n");
        p2.x = (rand() % 10) * 1.0f;
        p2.y = (rand() % 10) * 1.0f;
        printf("\n");

        double distance = GetDistance(p1, p2);
        wprintf(L"▦▦    결   과    ▦▦\n");
        DrawArray(p1, p2);
        wprintf(L"◎ 플레이어 좌표(%lf, %lf)\n", p1.x, p1.y);
        wprintf(L"● 몬 스 터 좌표(%lf, %lf)\n", p2.x, p2.y);
        printf("\n");
        wprintf(L"몬스터의 공격범위 : %lf\n", monsterAttackRange);
        wprintf(L"몬스터로부터 거리 : %lf\n", distance);

        if (distance <= monsterAttackRange)
        {
            wprintf(L"몬스터에게 공격받았습니다.\n");
            break;
        }
        else
        {
            printf("\n");
            wprintf(L"※ 다시 시도합니다.\n");
        }
    }

    return (0);
}

double GetDistance(Point2D p1, Point2D p2)
{
    return sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}

int ConvertToInt(double d)
{
    double temp = 0;

    temp = floor(d);

    if (d - temp > 0.5)
        return (int)(ceil(d));
    else if (d - temp == 0)
        return (int)(d);
    else
        return (int)(floor(d));
}

void DrawArray(Point2D p1, Point2D p2)
{
    wchar_t iArr[100];
    int x1, y1, x2, y2 = 0;

    x1 = ConvertToInt(p1.x);
    y1 = ConvertToInt(p1.y);
    x2 = ConvertToInt(p2.x);
    y2 = ConvertToInt(p2.y);

    for (int i = 0; i < 100; i++)
    {
        iArr[i] = L'□';
    }

    iArr[x1 + y1 * 10] = L'◎';
    iArr[x2 + y2 * 10] = L'●';

    for (int i = 0; i < 100; i++)
    {
        if (i > 0 && i % 10 == 0)
            printf("\n");
        wprintf(L"%c", iArr[i]);
    }
    printf("\n");
}

'<ALGORITHM> > NOTE' 카테고리의 다른 글

20210127(수)  (0) 2021.01.27
20210121(목)  (0) 2021.01.21
20210119(화)  (0) 2021.01.19
210118(월)  (0) 2021.01.18
210115(금)  (0) 2021.01.15

댓글