메인 코드와 별도로 게임 메커니즘 / 규칙을 구현할 가치가 있습니까?


25

이 커뮤니티의 범위에 맞는지 확실하지 않거나 대신 Stackoverflow로 이동해야합니다.

게임의 핵심을 쉽게 확장 할 수 있기를 원한다고 가정 해 봅시다. 예를 들어, 프로그래밍 지식이 없어도 많은 사람들이 기존 규칙을 조정할뿐만 아니라 완전히 새로운 게임 메커니즘을 추가 할 수 있기를 원합니다. 나는 좋은 프로그래머가 아니지만 배울 준비가되어 있습니다. 나는 지시가 필요하고 수행 할 수 있다고 확신합니다.

내가 생각한 것은 주 유틸리티 코드 와 별도로 게임 메커니즘을 어떻게 구현할 수 있는지 여부입니다 . 탁상용 게임의 경우 모든 작업의 ​​실제 알고리즘이 포함되어 있지 않지만 각 프로토콜의 제한을 설명하고 각 항목의 컨텍스트를 크게 참조하는 규칙 책이 있습니다. 인간 프로그래밍 언어로 쉽게 읽을 수 있고 변경 가능한 매우 높은 수준의 모든 규칙을 PC 게임과 비슷한 방식으로 설명하는 것이 가능합니까? 그런 다음 유틸리티 코드에 의해 "소비되고"파싱됩니다. 게임 역학의 실례?

그것은 실제로 내 언어와 컴파일러를 작성 해야하는 것처럼 보입니다.)) 물론 할 수는 없습니다. 그러나 문제에 대한 쉬운 접근 방법이있을 수 있습니까?

참고 : 유틸리티 코드에 사용되는 언어는 Python 3.x입니다.


경험이없고 단일 개발자로 일하면서 모든 것을 직접 구현하려고 시도하지 않는 것이 좋습니다. SDL2 라이브러리를 사용하면 많은 영역에서 매우 도움이 될 수 있으며 Python 바인딩이 있으므로 원하는 언어로 작업 할 수 있습니다. 원하는 것을 달성하려면 아키텍처 설계를 매우 신중하게 수행해야하며 숙련 된 팀이라도 최소한 한 번의 전체 재 작성을 기대합니다. 또한 파이썬은 다른 언어보다 배우기가 훨씬 쉽지 않으며 제 생각에는 중급 수준에 큰 어려움이 있습니다.
ttbek

당신이 찾고있는 개념은 게임 개발자 외부에서 일반적입니다. 정확하게 수행해야하는 비즈니스 규칙 엔진이라는 소프트웨어 도구 모음이 있습니다. 게임 개발에서는 이러한 도구를 활용할 수도 있습니다. 예를 들어 Apple의 GameplayKit에는 비슷한 목적으로 GKRuleSystem 및 GKRule 클래스가 포함되었습니다. 이를 외부 편집 할 수 있도록 확장하는 데 약간의 노력이 필요하지만 코드를 다시 컴파일하지 않고 동작을 변경하는 방식으로 구성 할 수 있습니다.
샌디 채프먼

답변:


34

일반적으로 시스템을 확장 할 수있는 용이성은 하위 시스템이 밀접하거나 느슨하게 연결된 정도에 따라 다릅니다 . 일반적으로 서브 시스템이 느슨하게 결합 될수록 서브 시스템이 분리되어 수정하기가 쉬워지며 시스템 전체를 완전히 이해하지 않아도됩니다.

그러나 공짜는 없습니다. 그러한 시스템은 일반적으로 더 많은 자원 (시간, 돈 및 기술의 다양한 조합)을 구축해야합니다. 당신이 묘사 한 확장 성의 정도는 당신이 생각한 기술 수준과 직접적으로 상충되는 것입니다. 그것은 가능하지만, 당신이 설명한대로 소프트웨어 제작은 매우 어려운 일입니다.

내가 알고있는 가장 가까운 기존 항목은 Vassal (설명한 것보다 훨씬 프로그래밍 방식 임)이거나 Tabletop Simulator (주로 인간의 상호 작용에 따라 게임 규칙을 해석하고 시행하는)에 대한 모드를 만드는 것입니다.


확실한 조언. 확장 성을 쉽게하기 위해 코드를 가능한 한 느슨하게 결합하려고 노력하지만 무언가를 하드 코딩 / 결합하는 것이 훨씬 쉬운 경우가 항상 있습니다. 전문 개발자로서 쉬운 일이 아니며 초보자도 아닙니다.
angarg12

TTS는 이제 Lua를 지원하며 시행 규칙은 이제 인간의 상호 작용에 전적으로 달려 있지 않습니다.
Ave

17

내가 생각한 것은 주 유틸리티 코드와 별도로 게임 메커니즘을 어떻게 구현할 수 있는지 여부입니다.

절대적으로 가능합니다. 게임에서 자주 사용되는 한 가지 방법은 Lua 스크립팅 입니다.

링크 된 기사에서 :

Lua는 원래 1993 년에 증가하는 커스터마이징 요구에 부응하기 위해 소프트웨어 응용 프로그램을 확장하기위한 언어로 설계되었습니다.

많은 게임에서 루아를 사용합니다. (링크하지만 새 사용자 평판이 링크 수를 제한하고 있습니다.)

Lua 스크립트는 런타임에 컴파일 할 수 있습니다. 즉, 게임의 "스크립트"디렉토리에 텍스트 파일이 있고 모더로 쉽게 편집 할 수 있습니다. 게임이로드되어 실행됩니다.

Lua 스크립트가 게임 내 유닛의 속성을 정의하는 것을 보았습니다. 이리 은 TA Spring의 무작위 예입니다.

그러나 "모든 규칙을 설명하십시오". 이론 상으로는 루아가 완전한 언어이기 때문에 가능하지만 문제는 핵심 게임 코드가 동작을 확장하기 위해 스크립트를 찾을 수있을 정도로 예리해야한다는 것입니다.

예를 들어, "scripts / cards"디렉토리에서 카드를 찾는 카드 게임을 개발할 수 있습니다. 새 카드를 추가하거나 기존 카드를 편집 할 때 좋습니다. 그러나 나중에 그리드에 미니어처를 포함하도록 게임을 확장하려는 경우 핵심 코드를 편집해야합니다.

참고 : Lua는 게임 및 사용자 지정 용 소프트웨어 모두에서 일반적으로 사용되는 것을 알고 있기 때문에 제공합니다. 나는 그것이 유일한 해결책이라고 제안하지 않으며 질문자의 요구에 가장 적합하지 않습니다.


7
이 답변은 Lua가 이런 식으로 사용되는 유일한 스크립팅 언어임을 의미합니다. 게임 엔진에 내장 될 수있는 다른 많은 스크립팅 언어가 있습니다. 일부 엔진은 또한 고유 한 방식으로 고유 한 도메인 별 스크립팅 언어를 구현합니다. 나는 언어를 만드는 것이 많은 일이기 때문에 일반적으로 권장하지는 않지만 언급해야합니다.
Philipp

3

연속적인 접근 방식이 있으며 그 중 하나가 가치가 있는지 여부는 수행하려는 작업에 따라 다릅니다. 구체적으로, 트위 커를 얼마나 많이 제어하고 싶습니까?

제어의 극단적 인 끝에서, 당신은 단순히 트위 커가 전체 게임의 코드를 수정하게 할 수 있습니다. 이 시점에서 유틸리티 코드와이를 사용하는 방법에 대한 최소한 하나의 예를 게시해야합니다. 트위 커는 원하는만큼 코드를 사용할 수 있습니다.

약간 덜 제어하는 ​​접근 방식은 유틸리티 코드를 어떻게 든 "고정"하여 (예를 들어 미리 컴파일하여) 트위 커가 특정 기능 (콜백)을 작성하여 수행 할 수있는 작업을 제한하는 것입니다. 수행하려는 작업에 따라이 방법은 여러 가지 형태를 취할 수 있습니다. 일반적인 방법은 모든 디스플레이 파트를 유틸리티 / 메인 코드에 넣고 모든 메커니즘을 조정 가능한 부분에 배치하는 것입니다. 또는 플레이어가 변경하기를 원치 않거나 변경하기가 너무 복잡하기 때문에 일부 고정 장치를 "냉동 된"부분에 유지하려고 할 수 있습니다.

연속체의 제어 수준이 낮은 쪽에서는 트위 커가 고정 된 범위 내에서만 값을 변경할 수 있습니다. 게임 내 사물의 색상을 선택할 수있는 데이터 파일이 그 예입니다. 그러나이 방법을 사용하면서도 많은 사용자 정의를 제공 할 수 있습니다. 함수 선택을 정의하고 트위 커가 이전 접근 방식에서 콜백을 작성하도록 구성 할 수 있지만 새 기능을 정의 할 수는 없습니다. 또는 컴포지션 부분을 건너 뛰고 유한 선택을 제공 할 수도 있습니다.

이러한 모든 접근 방식과 사용 사례에 적합한 방법의 세부 사항은 어떤 종류의 기본 게임을 만들고 싶은지, 얼마나 많은 제어를 포기하고 싶은지에 달려 있습니다. 상용 게임은 일반적으로 두 번째 및 세 번째 방법 만 사용합니다. 첫 번째 방법은 플레이어가 완전히 별개의 게임을 만들 수 있기 때문에 복잡한 라이센스 문제가 발생합니다. 이러한 접근 방식이 연속체를 형성하므로 두 번째 접근 방식에서도 이러한 문제가 발생할 수 있습니다.


실제로 오픈 소스로 만드는 것이 저의 목표입니다. 내가 문제로 생각하는 것은이 확장 성을 가장 쉬운 방법으로 구현하는 방법입니다. 따라서 게임의 다른 플레이어 (MP 게임, btw)는 기본 규칙 세트의 자체 확장을 만들고 각 규칙을 공유 할 수 있습니다 다른 방법으로 동시에 충돌을 피할 수 있습니다. 따라서 한 사용자가 특정 규칙을 재정의하는 확장 기능을 개발하고 다른 사용자가 다른 확장 기능을 개발하는 경우 게임에서 두 기능을 모두 사용하려는 세 번째 사용자가 호환성 문제가 발생하지 않도록하려면 어떻게해야합니까? 그들에게 긴밀하게 협력하도록 강요하는 것 외에도.
tis

.. 유틸리티 코드를 수정하지 않아도되고 프로그래밍에 대해 너무 많은 지식을 요구하지 않는 방식으로 구현해야합니다.
tis

1
호환성 문제를 방지 할 수있는 방법은 없다고 생각합니다 (물론 색을 설정해도 문제가 발생할 수 있습니다!) 응답합니다. 유틸리티 코드 인터페이스의 설계 및 해당 확장에 따라 원하는 결과를 생성하는 콜백 등을 주문하는 방법이있을 수 있습니다. 그런 다음 다시 없을 수도 있습니다. 설명없이 문제가 발생하는 것보다 문제가있을 수 있으며 사용자 경험이 더 나은 것처럼 보이는 이유를 사용자에게 경고합니다.
Ryan1729

2

시스템 규칙을 해당 규칙을 적용하는 코드와 분리 할 수 ​​있습니다. 기본 시스템에 버그를 도입하지 않고 새로운 규칙을 추가하거나 나중에 규칙을 변경하기 쉽기 때문에 복잡한 프로젝트에 맞게 코드를 구성하는 것을 선호합니다. 규칙 엔진의 버그는 규칙과 다른 코드가 서로 섞여있는 시스템의 버그보다 더 빨리 발견됩니다. 모든 규칙에서 동일한 규칙 엔진이 반복해서 사용되기 때문입니다.

그것이 가치가 있는지 여부는 시스템의 복잡성에 달려 있습니다. Pac-Man을 귀찮게하지는 않지만 Dwarf Fortress를 다른 방법으로 쓰는 것을 상상할 수 없었습니다.


감사합니다, @Robyn. 이 디자인에 올바르게 접근하는 방법을 모르는 사람에게 읽어야 할 조언이 있습니까? 이러한 응용 분야에 대해 잘 정립 된 디자인 패턴이 있습니까? 주제를 다루는 책이 있습니까?
tis

책이 없습니다. 죄송합니다. 그러나 간단한 규칙 엔진의 기본 개념은 규칙을 설명하는 데 필요한 모든 정보에 대한 속성이있는 규칙 클래스를 만드는 것입니다. 이러한 속성 중 일부에 람다 함수가 있으면 복잡한 동작을 할당 할 수 있습니다. 규칙 목록을 인스턴스화하는 클래스를 만들어 모든 규칙이 한 곳에있게하십시오. 규칙 목록을 입력으로 받아서 시스템에 적용하는 메소드가있는 다른 클래스를 작성하십시오.
Robyn

2

확실히 실현 가능합니다. 가치가 있다면 목표에 달려 있습니다.

이 작업을 수행하기 위해 자신의 언어를 발명하거나 컴파일러를 작성할 필요가 없습니다.

게임을 쉽게 확장 할 수있게하려면 게임을하는 것이 좋습니다.

이해하기 쉬운 시스템을 만들고 쉽게 수정할 수 있도록하는 것이 적어도 단기적으로는 더 많은 일입니다.

이것을하는 하나의 게임은 Rimworld입니다 (나는 제휴 관계가 없음)이며 사용자가 수행 한 방식을보고 배울 수 있습니다. 기본적으로 누구나 게임 폴더에있는 XML 파일에 많은 게임 데이터와 메커니즘을보고 누구나 볼 수 있습니다. 수정하십시오. 게임의 핵심 / 엔진은 Unity를 사용하여 만들어졌습니다.

실제 코딩으로 게임을 더 심층적으로 확장 할 가능성도 있지만, 그에 대해서는 잘 모르지만 mods 포럼을 통해 배울 수 있습니다.

모딩의 가능성은 많은 사람들에게 게임을 더 흥미롭게 만들고 그것이 성공에 많은 기여를 한 것으로 생각합니다. 또한 개발자가 원하는 모드 콘텐츠를 핵심 게임에 가져올 수 있도록하며 많은 사람들의 도움을 받아 개발 속도를 높이고 게임을 개선하며 인기있는 것, 작동하는 것 등

물론 소규모 독립 스튜디오의 경우 수백 명의 사람들이 아이디어를 생각해 내고 테스트 해 보았습니다. 이는 스스로 할 수 없었던 많은 일이거나 아마도 사람들을 고용 할 수없는 일입니다.


게임 데이터가 xml로 어떻게 정의되는지 알 수 있지만 게임 메카니즘 / 규칙을 정의하는 데 사용할 수있는 방법은 상상할 수 없습니다. 아마도 주제에 대한 몇 가지 예와 기사를 제공해 줄 수 있습니까?
tis

@tis 규칙은 또 다른 종류의 데이터입니다. 내 엔진에 "A가 B 인 경우"가 있으면 XML 파일에서 A와 B를로드 할 수 있습니다. 이제 사용자는 상당히 임의의 규칙을 지정할 수 있습니다. 사용자가 지원하는 가능한 모든 As와 B를 목록으로 제공하는 데 도움이되는 추가 비트가 있습니다. 예를 들어 "상태 상태 유형 인 경우 이동 속도 100 인 경우", "상태 상태 유형 및 시간> x 인 경우 상태 상태 유형 인 경우"따라서 설계에서 어떤 종류의 객체 (상태, 시간, 이동 속도)에 대해 어떤 종류의 규칙을 허용할지 생각합니다. 어떤 종류의 구성을 허용해야합니까? 수중 상태 및 시간> 5 건강 -10.
ttbek

1

객체 지향 디자인 을 살펴볼 수 있습니다 . 파이썬은 그것을 잘 지원합니다.

두꺼운 책은 이것에 대해 쓰여져 새로 왔을 때 무서울 수 있지만 주요 원칙은 매우 쉽습니다.

주요 요점은 작업하는 객체의 종류를 식별한다는 것입니다. 어떤 종류의 게임을 생각하고 있는지 말하지는 않지만 Player, Monster, Item, Equipment, Weapon, Armor 등과 같은 것이 일반적인 객체입니다.

다른 게임 유형을 원한다면 아마도 승리 조건 등을 처리하는 Game 객체가 필요할 것입니다. 아마도지도 객체입니까?

때로는 물건이 될만한 가치가 있는지 분명하지 않은 경우가 있습니다 (예 : 손상). 객체를 손상시키지 않으면 코드가 더 간단 해지지 만 객체를 만들면 더 쉽게 사용자 지정할 수 있습니다.

서브 클래: 무기와 갑옷은 장비입니다. 장비는 품목입니다. 다른 유형의 항목이있을 수 있습니다. Players와 Monsters가 모두 서브 클래스 인 Combatant 클래스를 정의하면 유용 할 것입니다.

예를 들어 무기는 다른 모든 유형의 항목과 공통점이 많으며 무게, 크기 및 기타 다른 속성을 갖습니다.

따라서, 서브 클래 싱은 "무기는 다른 아이템과 비슷하지만, 휘두를 수 있으며, 피해 등에도 영향을줍니다."라고 말하는 방법을 제공합니다.

서브 클래 싱은 또한 모드 빌더가 "내 새로운 유형의 무기는 표준 무기와 같습니다 ..."

그런 다음 어떤 개체가 무엇을 담당하는지 결정해야합니다. 이것은 쉬운 일이 아니므로 그것에 대해 약간의 생각을해야합니다. 잘못된 선택은 기본 게임에 큰 영향을 미치지 않지만 사용자 정의하기가 더 어려워집니다.

혼자서 땜질하는 한 주위를 바꿀 수는 있지만 대중에게 무언가를 공개하는 순간 변화가 훨씬 어려워집니다! 사람들은 지금과 같은 것에 의존하는 개조를 할 것입니다. 버그조차도. 사람들은 코드에 남아있는 버그에 의존하는 모드를 작성합니다. 물건을 바꾸면 그 개조 품이 부러지고 집게에 몹이 나타납니다.

예를 들면 다음과 같습니다.

무기를 휘두르는 플레이어는 여러 갑옷을 입고있는 몬스터를 공격합니다. 이것은 특정 게임 모드와 특정 맵에서 이루어집니다.

두 전투원 모두 치명타 및 회피와 같은 기술을 보유 할 수 있습니다.

이제 어떤 개체가 무엇을 담당합니까?

이에 대한 정답은 없습니다. 어떤 종류의 사용자 정의를 허용 할 것인지에 따라 다릅니다.

오브젝트 (예 : 맵)를 호출하지 않으면 해당 오브젝트는 어떤 식 으로든 공격을 변경할 수 없습니다.

이러한 모든 결정을 한 후에 문서화하십시오 . "개체 매뉴얼"을 작성하십시오. 각 객체가 가지고있는 수정 가능한 메소드, 가지고있는 매개 변수, 반환해야 할 항목 등을 정확하게 나열합니다.

행운을 빕니다!


귀하의 의견에 진심으로 감사 드리며 많은 노력을 기울 였으므로 +1의 가치가 있지만 OOP에 대해서는 일반적으로 알고 있습니다 (경험이 부족함). 나의 현재 이슈는 내가 취해야 할 가장 일반적인 디자인 접근 방식입니다. 내 게임은 규모별로 D & D만큼 크지는 않지만 그럼에도 불구하고 그 메커니즘은 매우 깊습니다. 이는 여러 수준의 규칙에 복잡하고 복잡한 많은 것을 의미합니다. 어떤 값을 약간 조정할뿐만 아니라 사용자가 크게 확장하도록 허용하고 싶습니다. 실제로 더 쉬운 해결책이 없을 수도있다.
tis

@tis 이것의 핵심 은 게임의 OO 모델에서 실제로 어떤 객체 인지에 대한 올바른 결정을 내리는 것 입니다. "명백한"시작 장소는 무기, 갑옷 등과 같은 "명사"가 유일한 방법은 아니며 사용자 정의 할 수없는 코드의 혼란을 초래할 수 있습니다. 규칙에 "자정에 교회에서은 총알을 가진 괴물을 겨냥한 유일한 괴물"이라고 적힌다면 코드에서 그 규칙을 어디에 적용해야합니까? Gun (또는 Bullet) 클래스, Monster 클래스, gun 사용자의 Fighter 클래스, Churchyard 클래스 또는 Time 클래스에서? 가장 좋은 대답은 "위의 어느 것도
아니다

... 그리고 규칙 클래스 (아마도 데이터베이스 일 것입니다)와 충돌 해결 클래스 측면에서 전체 디자인을 다시 생각하십시오. 찰리가 밥을 쏘려고하는 동안 앨리스가 총알을 가지고 있지 않아도 총을 클럽으로 사용할 수 있습니다. 그런 다음 .... "는 코드에서 구현할 단일하고"명백한 "장소를 갖습니다. 텍스트 기반 게임 인 경우 일부 오디오-비주얼 효과를 제외하고는 원래 건 클래스가 이제 거의 수행하지 않습니다.
alephzero

1

이것에 대한 기본적인 지원을 얻는 간단한 방법은 대부분의 숫자 값을 하나 이상의 별도의 텍스트 파일로 분리하여 관심있는 개인이 그것들을 망각으로 조정할 수 있도록하는 것입니다.

예를 들어, 탁상용 게임을 언급했습니다. D & D를 기반으로하는 게임을 가지고 있다면, 다음 weapon_damage과 같은 줄을 포함 하는 파일 이있을 수 있습니다 Battleaxe: 1d12. 귀하의 유틸리티 코드는 해당 파일을 읽을 것이다 피해가에 의해 처리 될 때마다 Battleaxe코드 것 generate a number from 1-12, 1 time(s)및 추가합니다. Battleaxe: 4d6대신 읽을 줄을 조정하면 generate a number from 1-6, 4 time(s)추가됩니다. 마찬가지로 폴더를 만들 수 있으며 Creatures내부에는 AC: 12; 와 같은 줄을 포함하여 각 생물체에 대한 파일이 있습니다 . 그 폴더에 새로운 파일을 추가하면 새로운 생물이 생성됩니다. 캐릭터 클래스, 지형 유형, 수많은 것들에 대해서도 가능합니다.

이 스타일의 비 코드 커스터마이징은 여전히 ​​매우 강력하고 많은 게임을 커버 할 수 있습니다. 그러나 실제로 사용자가 명시 적으로 지정하지 않은 변경을 수행 할 수는 없습니다. 예를 들어, 틈새 공격의 조건을 충족하는 공격 Sneak Attack: [damage]에 추가 할 수 있도록 생물 또는 클래스에 부여 할 수 있습니다 [damage]. "스텔스 공격을 할 때마다"또는 "가장 앉을 때마다"또는 "장점이있을 때마다"와 같이 조건을 변경하는 방법을 제공 할 수도 있습니다. 그러나 사용자가 몰래 공격을 원한다고 결정하면 "공격 롤을 만들 때 대상의 인식에 대해 스텔스를 굴릴 수도 있습니다. 두 롤 모두 성공하면 몰래 공격 피해 추가"

개발자와 동일한 수준의 코딩 기술이 없어도 사용자가 게임에 완전히 새로운 행동을 추가 할 수 있기를 원한다면 사람들이 언급 한 것처럼 본질적으로 게임 엔진이나 별도의 프로그래밍 언어를 만들려고합니다. 코딩 지식이 필요없는 수정의 경우 텍스트 기반 데이터 파일 및 폴더 구조는 여전히 많은 옵션을 제공 할 수 있습니다. 사용자가 그 이상을 수정하도록하려면 프로그래밍 언어를 배우거나 알도록 요청해야합니다.


예, 새로운 역학을 추가 할 수 있어야합니다. 일부 값만 조정해도 효과가 없습니다. 나는 이것이 별도의 언어가 필요할 수도 있다고 생각했는데, 파이썬 유틸리티 코드에 이미 사용할 수있는 언어가있을 것이라고 생각했습니다.
tis

@tis 위키피디아의 주제에 대해 아직 생각해 보셨습니까? en.wikipedia.org/wiki/Logic_programming
ttbek

0

[저는 수십 년에 걸친 소프트웨어 개발자이지만 게임 개발 경험이 없으므로 게임 산업은 다른 이유로 접근 할 수 있습니다.

당신의 접근 방식은 절대적으로 이해가됩니다. 핵심은 역학과 규칙이 구축하는 기본 기능을 제공하므로 상위 수준의 구성 요소에서 사용하는 API입니다.

그리고 API를 디자인 할 때 가장 선호하는 지침은 더 높은 수준의 코드를 표현할 언어를 만드는 것입니다 (물론 프로그래밍 언어의 구문 제한을 사용함).

따라서 좋은 접근법은 (물론 파이썬의 구문을 사용하여) 표현하고자하는 방식으로 가상의 규칙과 기법을 작성하여 핵심 API가 규칙과 기법에 제공하고자하는 것을 찾는 것입니다. 층.

물론 기존 게임의 스크립팅 기능을 살펴보고 자신이하는 일을 알아볼 것을 권장합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.