본문 바로가기
GameMaker강좌[GM8]/기초강좌

[게임메이커-기초]데이터 구조체-1(ds_stack, ds_queue, ds_list)

by 타락카얀 2018. 4. 19.
728x90

 

 

GAME MAKER 강좌

 

 

KAYAN

 

 

 

 

 

 

 

◈데이터 구조체

 

 

게임메이커에서 배열과 비슷한 기능이지만, 단순하면서도 사용하기 편리한 데이터 구조체라는 기능이

있습니다.
이들은 값을 입력하고 원하는 값을 쉽게 찾을 수 있으며, 삭제하여 메모리에서 완전히 제거할 수도 있습니다.
배열은 낱개의 아이템들의 모임이라고 한다면, 데이터 구조물은 아이템을 담은 박스 그 자체라고 보시면

됩니다.

 

 

 

 

 


◈ 스택 (ds_stack)

 

 

스택 (ds_stack)은 값을 순차적으로 입력하고, 최근에 입력한 값을 반환시킬 수 있습니다.
보통 값을 되돌릴 때 유용하게 사용할 수 있습니다.

 


(▲ 스택의 구조)


스택은 기본적으로 아래의 함수를 통해 생성하고, 또는 파기하여 메모리에서 완전히 제거할 수 있습니다.

 



   ds_stack_create( ) : 새로운 스택을 생성합니다.
   ds_stack_destroy(id) : 생성된 스택을 완전히 파기합니다.
   ds_stack_clear(id) : 생성된 스택을 클리어하여 입력된 값들을 모두 지웁니다.


 

스택을 생성할 때는 아래와 같이 생성하고, 스택의 id를 변수에 할당한 후, 그 변수를 통해 스택을
제어하게 됩니다.

 



   예)


   stack=ds_stack_create( );


값을 넣을 때는 아래의 함수를 통해 값을 입력하게 됩니다.

 



   ds_stack_push(id,val) : (id)스택에 (val)값을 넣습니다.


스택은 최근에 입력된 값을 찾은 후 해당 값을 제거하는 것과 값만 찾는 2가지 형태가 있습니다.

입력된 값을 찾고자 할 때는 아래의 함수를 사용합니다.

 



   ds_stack_pop(id) : 최근에 입력된 (id)스택의 값을 반환하고, 스택에서 제거합니다.
   ds_stack_top(id) : 최근에 입력된 (id)스택의 값을 반환하지만, 스택에서 제거하지는 않습니다.

 

참고로 값을 찾을 때, 값을 제거(ds_stack_pop)하게 되면 다음 스텝에서 그 다음 값을 읽을 수

있게 됩니다. 하지만 값을 제거하지 않으면(ds_stack_top) 최근에 입력한 값만 읽을 수 있습니다.

상황에 따라 맞는 함수를 사용하시면 됩니다.

 

스택의 크기(입력된 값들의 개수)를 체크하고자 할 때는 아래의 함수를 사용합니다.

 



   ds_stack_size(id) : 스택에 저정된 값의 수를 반환합니다.
   ds_stack_empty(id) : 스택이 비었는지를 반환합니다. 이것은 사이즈가 0 일지 테스트하는
   것과 같습니다.

 

 

 

 

 

 


◈ 큐 (ds_queue)

 

 

(ds_queue)는 순차적으로 값을 입력하고, 맨 처음에 입력한 값을 반환시킬 수 있습니다.
큐는 스택과 비슷하지만, 값을 가장 처음에 입력한 값을 읽을 수 있고, 스택은 가장 나중에

입력한 값(나중에 입력한 값)을 읽는다는 것이 다릅니다.
보통 값의 변화를 알아보거나 리플레이 기능을 사용할 때 유용합니다.

 


(▲ 큐의 구조)


큐는 기본적으로 아래의 함수를 통해 생성하고, 또는 파기하여 메모리에서 완전히 제거할 수 있습니다.

 



   ds_queue_create( ) : 새로운 큐를 생성합니다.
   ds_queue_destroy(id) : 지정한 (id)큐를 완전히 파기합니다.
   ds_queue_clear(id) : 지정한 (id)큐를 클리어하여 입력된 값들을 모두 지웁니다.



큐을 생성할 때는 아래와 같이 생성하고, 큐의 id를 변수에 할당한 후, 그 변수를
통해 큐를 제어하게 됩니다.

 



   예)


   queue=ds_queue_create( );


값을 넣을 때는 아래의 함수를 통해 값을 입력하게 됩니다.

 



   ds_queue_enqueue(id,val) : (id)큐에 (val)값을 입력합니다.


큐는 맨 처음에 입력된 값을 찾은 후 해당 값을 제거하는 것과 값만 찾는 2가지 형태가 있습니다.

입력된 값을 찾고자 할 때는 아래의 함수를 사용합니다.

 



   ds_queue_dequeue(id) : (id)큐에서 맨 처음에 추가한 값을 반환하고, 큐에서 제거합니다.

   ds_queue_head(id) : (id)큐에서 맨 처음 추가한 값을 반환하고 큐에서 제거하지는 않습니다.
   ds_queue_tail(id) : (id)큐에서 맨 나중에 추가한 값을 반환하고 큐에서 제거하지는 않습니다.


 

참고로 값을 찾을 때, 값을 제거(ds_queue_dequeue)하게 되면 다음 스텝에서 맨 처음에 추가한 값

다음 값을 읽을 수 있게 됩니다. 하지만 값을 제거하지 않으면(ds_queue_head, ds_queue_tail)

최근에 입력한 값과 맨 나중에 추가한 값 2가지만 읽을 수 있습니다.

큐의 크기(입력된 값들의 개수)를 체크하고자 할 때는 아래의 함수를 사용합니다.

 



   ds_queue_size(id) : (id)큐에 저장된 값의 수를 반환합니다.
   ds_queue_empty(id) : (id)큐가 비었는지를 반환합니다. 이것은 사이즈가 0 일지 테스트하는

   것과 같습니다.



 

 

 


◈ 리스트 (ds_list)

 

 

리스트 (ds_list)는 값을 순차적으로 입력하거나, 순서와 상관없이 어느 위치에서든 값을 끼워 추가할 수

있고, 변경할 수도 있는 유용한 기능을 가졌습니다. 마치 책장에 여러 책들을 진열하는 것과 같은

형태라 볼 수 있지요.


(▲ 리스트의 구조)


리스트는 기본적으로 아래의 함수를 통해 생성하고, 또는 파기하여 메모리에서 완전히 제거할 수 있습니다.

 



   ds_list_create( ) : 새로운 리스트를 생성합니다.
   ds_list_destroy(id) : 지정한 (id)리스트를 완전히 파기합니다.
   ds_list_clear(id) : 지정한 (id)리스트를 클리어하여 입력된 값들을 모두 지웁니다.


 

리스트를 생성할 때는 아래와 같이 생성하고, 리스트의 id를 변수에 할당한 후, 그 변수를 통해 리스트를

제어하게 됩니다.

 



   예)


   list=ds_list_create( );


값을 넣을 때는 아래의 함수를 통해 값을 입력하게 됩니다.

 



   ds_list_add(id,val) : (id)리스트의 끝에 (val)값을 추가합니다.
   ds_list_insert(id,pos,val) : (id)리스트의 (pos)위치에 (val)값을 추가합니다. 첫번째 위치는 0,

   마지막 위치는 리스트의 사이즈에 -1을 뺀 값입니다.


   ds_list_replace(id,pos,val) : (id)리스트의 (pos)위치에 값을 새로운 (val)값으로 교체합니다.


 

값을 삭제할 때는 아래의 함수를 사용합니다.

 



   ds_list_delete(id,pos) : (id)리스트의 (pos)위치에 값을 삭제합니다. (0은 첫번째 위치)

 

참고로 값을 삭제하면, 삭제한 위치 이후에 있는 값들의 위치가 순차적으로 당겨집니다.

즉, [0,1,2,3,4,5] 가 있을 때, 2번을 삭제하면, [0,1, ,3,4,5] 처럼 비는 것이 아니라,

[0,1,3,4,5] 와 같이 위치가 재정렬 되는 것입니다.

 

입력된 값을 찾고자 할 때는 아래의 함수를 사용합니다.

 



   ds_list_find_index(id,val) : 지정한 (val)값을 저장한 위치를 찾습니다. 만약 값이 없다면 -1이
   반환됩니다.

   ds_list_find_value(id,pos) : 지정한 (pos)에 저장된 값을 찾습니다.


 

보통 아래와 같이 값을 검색하게 됩니다.

 



   예) 리스트에 값이 있는지 찾을 때

   //인스턴스의 id가 저장된 리스트에서 자신의 id가 있는지 체크 하고 싶을 때
   pos=ds_list_find_index(list,id); //자신의 id 값이 있는 위치를 검색
   if !(pos<0){ //찾고자 하는 id 값이 있으면 위치를 반환하고, 값이 리스트에 없으면 -1
   ds_list_delete(list,pos);//해당 위치의 값을 삭제
   instance_destroy( );
   }






   예)리스트에서 값을 찾을 때


   //모든 리스트를 검색하여 값을 모두 더하고 싶을 떄
   a=0;
   for(i=0;i<ds_list_size(list);i+=1;){
   val=ds_list_find_value(list,pos);
   a+=val;
   }


 

리스트는 입력된 값에 따라 오름차순, 또는 내림차순으로 정렬하거나, 값들을 랜덤으로 섞을 수 있습니다.

 



   ds_list_sort(id,ascend) : 리스트의 값을 정렬합니다.
      ascend : false 또는 true
              false - 내림순(값을 큰순으로 정렬. 처음은 최대값, 마지막은 최소값)
               true - 오름순(값을 작은순으로 정렬. 처음은 최소값, 마지막은 최대값)

   ds_list_shuffle(id) : 리스트의 값을 랜덤으로 뒤섞습니다.


 

리스트의 크기(입력된 값들의 개수)를 체크하고자 할 때는 아래의 함수를 사용합니다.

 



   ds_list_size(id) : 리스트에 저장된 값의 수를 반환합니다.
   ds_list_empty(id) : 리스트가 비었는지를 반환합니다. 이것은 사이즈가 0과 같은지를

   테스트하는 것과 같습니다.




 

300x250

댓글