Minwoo Dev.

(3) 2048 구현 - 3 본문

Project

(3) 2048 구현 - 3

itisminu 2023. 7. 15. 13:11
728x90
반응형
SMALL

2021.09.01

조원 중 한 친구가 배열을 사용한 것을 보고 동적 배열에 대하여 언급하였다.

우리가 사용하는 C언어의 배열은 정적 배열이다.

처음 배열을 생성할 때 칸을 지정하고, 지정한 칸으로 배열을 사용하는 것이다.

정적 배열과 반대되는 개념인 동적 배열은 배열의 크기를 조절할 수 있다는 점에서 정적 배열과 다르다고 할 수 있다.

찾아본 결과 파이썬에서의 배열은 동적 배열인 것 같다.

C언어는 기본적으로 정적 배열을 사용하기 때문에 동적 배열의 형태로 사용하기 위해서는 malloc 함수와 포인터를 사용해야 한다.

이러한 정보들을 찾아본 결과 이 프로그램에서 사용하면 정적 배열과 동적 배열의 차이는 배열의 칸 수를 늘이고 줄일 수 있느냐의 차이였다.

처음 시작할 때, 3x3 혹은 4x4 와 같은 게임 크기를 설정하고 시작하는 방법을 택하였기 때문에, 동적 배열을 사용하지 않아도 큰 무리가 없다고 판단하였다.

우선 4x4 배열의 2048 게임을 구현한 뒤, 3x3과 5x5 배열도 함수로 구현할 거라서 4x4 배열의 소스코드 구현으로 다시 넘어갔다.

지금까지 짠 소스코드는 아래와 같다.

 

#include<stdio.h> 
#include<stdlib.h> // random 함수를 위한 라이브러리
#include<conio.h> // 콘솔 키보드 입력 관련 라이브러리
#include<time.h> // 매번 랜덤값이 다르게 시드 변경

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

void Upcheck(int arr[][4])
{
    for(int i = 0;i<3;i++){
        if(arr[i][0]==0){
            arr[i][0] = arr[i+1][0];
            arr[i+1][0] = 0;
        }
    }
    printf("\n");
    PrintArr(arr);
}


void MakeArr(int *a,int *b,int arr[][4]) // 4x4 배열을 만드는 함수
{
    srand(time(NULL)); // 매번 다른 난수 생성을 위함
    
    for(int i = 0;i<2;i++){ // 2번 반복(처음에 2 2개가 형성되고 시작)
        *a = rand()%4; // 0부터 3까지 난수 생성
        *b = rand()%4; // 0부터 3까지 난수 생성
        arr[*a][*b] = 2; //랜덤으로 정해진 칸에 2 넣기
    }
    
    printf("처음 배열의 형태\n");
    PrintArr(arr);
    
}

void Up()
{
    printf("위 화살표");
}

void Down()
{
    printf("아래 화살표");
}

void Left()
{
    printf("왼쪽 화살표");
}

void Right()
{
    printf("오른쪽 화살표");
}

void Key(int arr[][4]) // 키보드 입력 관련 함수
{
    int key;
    while(1){
        if(kbhit()){
            key = getch();
            if(key==224 || key==0){
                key = getch();
                switch(key)
                {
                    case 72:
                        Upcheck(arr);
                        // up 화살표 동작함수
                        break;
                    case 75:
                        Left();
                        // left 화살표 동작함수
                        break;
                    case 77:
                        Right();
                        // right 화살표 동작함수
                        break;
                    case 80:
                        Down();
                        // down 화살표 동작함수
                        break;
                    default:
                        break;
                }
            }
        }
    }
}



int main(void)
{
    int a=0,b=0;
    int *ptr1;
    int *ptr2;
    ptr1 = &a;
    ptr2 = &b;

    int arr[4][4] = {0,};
    MakeArr(ptr1,ptr2,arr);
    // Key(arr);
    printf("a=%d,b=%d",a,b);
    
    return 0;
}

 

main 함수에서 무작위로 받은 a,b값을 받아오도록 포인터 값을 수정해야하고, Up, Down, Left, Right 각각 숫자 이동의 알고리즘을 구현해야한다.

Up, Down, Left, Right 중 한 가지를 먼저 구상하고, 나머지 세 개는 특정 값만 수정하는 형식으로 만들 거 같다.

Up 알고리즘을 먼저 짜야하는데, 키보드 위 방향키를 눌렀을 때, 위로 스와이프 한 효과가 일어나는 코드를 짜야한다.

곳곳에 있던 2를 위 칸으로 옮겨 원래 숫자가 있으면 더하고, 없으면 위쪽 끝까지 올라가는 형식을 어떻게 코드로 나타낼 지가 문제다.

우선, 각 팀원이 기존의 소스 코드를 이해해야 하고, Up 알고리즘에 대해 생각하고 짜와야 할 거 같다.

같은 프로그램이라도 소스 코드 작성의 방식은 정말 다양하기 때문에 우선 Up 알고리즘을 각자 구상해와서 다른 조원에게 소스 코드별 의도를 설명하고 피드백하여 가장 리스크가 적은 소스코드를 중심으로 수정할 것 같다.

이번 주차는 개강으로 인해 실질적 성과가 없다. 학교 수업과 함께 진행하기 때문에 학업에 지장이 없는 선에서 매주 1-2번 만나서 회의를 진행할 것이다.

Todo

- Up알고리즘 구상

- C언어 포인터, 함수, 배열 자유자재로 사용할 만큼 익히기

728x90
반응형
LIST

'Project' 카테고리의 다른 글

[Web Project] 네이버 웹 클론코딩하기 (1)  (2) 2023.12.29
수학 문제 프로그래밍으로 해결하기  (1) 2023.09.06
2048 구현 (2)  (0) 2023.06.03
2048 구현 (1)  (0) 2023.06.03