본문 바로가기
코드업(codeup)/C

[코드업(codeup)/C]코드업(codeup) 2050 : 2048게임 3 C언어

by starfish22 2022. 1. 16.
728x90

▶문제 : 2048게임 3 (codeup.kr)

 

2048게임 3

미는 방향이 입력된다.(상:U, 하:D, 좌:L, 우:R) 그 다음 줄부터 4*4의 게임판이 입력된다.

codeup.kr

 

▶코드 작성

#include <stdio.h>

void change(char w, int (*arr)[4])
{
    int temp[4][4];

    if (w == 'R') //오른쪽 회전
    {
        for (int ia = 0, it = 3; ia < 4; ia++, it--)
        {
            for (int j = 0; j < 4; j++)
            {
                temp[j][it] = arr[ia][j];
            }
        }
    }
    else if (w == 'L') //왼쪽 회전
    {
        for (int i = 0; i < 4; i++)
        {
            for (int ja = 0, jt = 3; ja < 4; ja++, jt--)
            {
                temp[jt][i] = arr[i][ja];
            }
        }
    }
    else if (w == 'V') //좌우 반전
    {
        for (int i = 0; i < 4; i++)
        {
            for (int ja = 0, jt = 3; ja < 4; ja++, jt--)
            {
                temp[i][jt] = arr[i][ja];
            }
        }
    }

    for (int i = 0; i < 4; i++) { //복사
        for (int j = 0; j < 4; j++) {
            arr[i][j] = temp[i][j];
        }
    }
}

int main()
{
    char ch;
    int temp[4][4];
    int(*arr)[4] = temp;
    scanf("%c", &ch);
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            scanf("%d", &temp[i][j]);
        }
    }

    if (ch == 'D') change('R', arr); //모두 왼쪽으로 밀도록 회전,반전
    else if (ch == 'U') change('L', arr);
    else if (ch == 'R') change('V', arr);

    int n, t;
    for (int i = 0; i < 4; i++)//가로로 한줄씩 값을 구함
    {
        t = 1;
        while (t == 1)//합쳐지는게 있을 때 만 반복
        {
            t = 0;
            for (int j = 0; j < 3; j++)
            {
                if (arr[i][j] > 0)//0이 아닌 값일 때
                {
                    for (int l = j + 1; l < 4; l++)
                    {
                        if (arr[i][l] > 0)//0이 아닌 값일 때
                        {
                            if (arr[i][j] == arr[i][l])
                            {//같은 값을 찾으면
                                arr[i][j] *= 2;//합침
                                arr[i][l] = 0;
                                t = 1;//한 번 더 반복하게 함
                            }
                            break;//처음 찾은 값 다음 값은 볼 필요가 없으므로 종료
                        }
                    }
                }
            }

            n = 0;
            for (int j = 0; j < 4; j++)
            {
                if (arr[i][j] > 0)//0이 아닌 값은
                {
                    arr[i][n++] = arr[i][j];//앞에서부터 차곡차곡
                }
            }
            for (int j = n; j < 4; j++)
            {
                arr[i][j] = 0;//나머지 빈 공간은 0으로 채움
            }
        }
    }

    if (ch == 'D') change('L', arr); //원래 상태로
    else if (ch == 'U') change('R', arr);
    else if (ch == 'R') change('V', arr);

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

▶해석

데이터를 입력받고 상, 하, 좌, 우 방향으로 밀어야 하는데 너무 정신없어서 한 방향으로 밀도록 하였다. 가장 편할 것 같은 왼쪽으로 밀 수 있도록 각 방향에 맞게 change함수로 회전을 하였다. change함수에서 회전한 후 복사를 한 이유는 static으로 포인터에 넣기엔 함수를 나중에 한번 더 써서 원 상태로 돌려놓아야 하므로 쓸 수 없고, 4 x 4 배열로 양도 적으니 복사하였다.

왼쪽으로 밀면서 합치고 밀고는 2048게임 2에서 한 것처럼 같은 방법으로 하였다.

코드업(codeup) 2049 : 2048게임 2 C언어 (tistory.com)

 

코드업(codeup) 2049 : 2048게임 2 C언어

▶문제 : 2048게임 2 (codeup.kr) 2048게임 2 4*4의 판이 입력된다. (게임 방법은 앞의 문제를 참고 바람) codeup.kr ▶코드 작성 #include int main() { int arr[4][4]; for (int i = 0; i < 4; i++) { for (int..

starfish22.tistory.com

간단하게 설명하면 근접해있는 0이 아닌 값을 찾아서 두 값이 같으면 합치고 t를 1로 하여 while문을 한 번 더 반복하게 한다. 반복문은 0이 아닌 값을 찾으면 두 값이 같을 필요 없이 종료한다. 다음으로 0이 아닌 값들을 앞에서부터 대입하고 남은 자리는 0으로 채웠다.

728x90

댓글