미누에요
(3) 2048 구현 - 3 본문
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언어 포인터, 함수, 배열 자유자재로 사용할 만큼 익히기
'Project' 카테고리의 다른 글
[Web Project] 네이버 웹 클론코딩하기 (1) (2) | 2023.12.29 |
---|---|
수학 문제 프로그래밍으로 해결하기 (1) | 2023.09.06 |
2048 구현 (2) (0) | 2023.06.03 |
2048 구현 (1) (0) | 2023.06.03 |