728x90
▶문제 : 2048게임 3 (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)
간단하게 설명하면 근접해있는 0이 아닌 값을 찾아서 두 값이 같으면 합치고 t를 1로 하여 while문을 한 번 더 반복하게 한다. 반복문은 0이 아닌 값을 찾으면 두 값이 같을 필요 없이 종료한다. 다음으로 0이 아닌 값들을 앞에서부터 대입하고 남은 자리는 0으로 채웠다.
728x90
'코드업(codeup) > C' 카테고리의 다른 글
코드업(codeup) 3715 : 올바른 괄호 3 C언어 (0) | 2022.01.17 |
---|---|
코드업(codeup) 3129 : 올바른 괄호 2 C언어 (0) | 2022.01.17 |
코드업(codeup) 2049 : 2048게임 2 C언어 (0) | 2022.01.15 |
코드업(codeup) 2048 : 2048게임 1 C언어 (0) | 2022.01.15 |
코드업(codeup) 3109 : 정올 참여 학생 리스트 만들기 2 C언어 (0) | 2022.01.14 |
댓글