do / until 사용법
do / until 문장은 하나 이상의 명령어를 여러 번 반복하는 또 다른 방법으로, 특정 표현식이 참이 될 때까지 작업을 수행하게 합니다. 이 문장은 반드시 함께 사용해야 합니다.
문법
do {
<statement>;
<statement>;
...
} until (<expression>);
위에서 볼 수 있는 문법에서, 중괄호 {} 안의 명령어는 표현식이 참으로 평가될 때까지 반복 실행됩니다. 초기 명령어는 항상 최소 한 번 실행됩니다.
기본 예시
다음은 일반적인 do ... until 사용 예제입니다:
do {
x = random(room_width);
y = random(room_height);
} until (place_free(x, y));
위 코드는 현재 객체를 자유로운 위치에 배치하고, x와 y 변수는 최소 한 번 설정되며, place_free() 표현식이 참이 될 때까지 반복 실행합니다.
do / until 문을 언제 사용해야 할까요?
do / until 문은 반복해야 할 명령어의 횟수를 모를 때 사용해야 하며, 루프가 종료되기 전에 명령어가 반드시 한 번 실행되도록 보장하려고 할 때 유용합니다.
break와 continue 사용하기
do 루프 안에서 break와 continue 문을 사용할 수 있습니다.
break 사용 예시
다음 예시는 break 문을 사용하는 방법을 보여줍니다:
var _id = noone;
do {
||
||
if (instance_exists(_id)) {
break;
}
ds_list_delete(list, 0);
} until (ds_list_empty(list));
target = _id;
위 코드에서는 로컬 변수를 생성하고 'noone'으로 설정한 후, DS 리스트의 첫 번째 위치를 확인하여 유효한 인스턴스 ID가 있는지 확인합니다. 인스턴스가 존재하는 경우 루프를 종료하고, 그렇지 않으면 리스트 위치의 값을 삭제합니다. 루프가 종료된 후 로컬 변수의 값이 인스턴스 변수 target에 할당됩니다.
continue 사용 예시
continue 문을 사용하는 예시는 다음과 같습니다:
do {
var _x = random(room_width);
var _y = random(room_height);
if (instance_position(_x, _y, obj_Enemy)) {
continue;
}
instance_create_layer(_x, _y, "Instances", obj_Enemy);
} until (instance_number(obj_Enemy) >= 10);
이 코드는 방의 랜덤한 위치를 생성한 후, 해당 위치에 obj_Enemy 인스턴스가 존재하는지 확인합니다. 만약 존재한다면 현재 반복을 종료하고 새로운 반복이 시작됩니다. 존재하지 않으면 obj_Enemy의 인스턴스를 생성합니다. 이 루프는 obj_Enemy의 인스턴스가 10개 이상 존재할 때 종료됩니다.
주의사항
do 루프를 사용할 때는 무한 루프가 발생하지 않도록 주의해야 합니다. 무한 루프가 발생하면 게임이 정지하고 사용자 입력에 반응하지 않게 됩니다. 이러한 경우 강제로 종료해야 합니다.
활용 예시
| 번호 | 설명 | 코드 예제 |
|---|---|---|
| 1 | 무작위 위치에 적 생성 | gml do { x = random(room_width); y = random(room_height); if (!place_free(x, y)) { continue; } instance_create(x, y, obj_Enemy); } until (instance_number(obj_Enemy) >= 5); |
| 2 | 특정 조건 만족하기 전까지 반복 | gml do { player_score += 10; } until (player_score >= 100); |
| 3 | 리스트에서 유효한 값을 찾기 | gml do { _value = ds_list_find_value(my_list, index); index++; } until (_value != noone); |
더 많은 루프 키워드에 대한 예제는 repeat, while, 및 for 섹션을 참조하세요.