Epic Game Maker는 레벨 편집기가있는 샌드 박스 2D 플랫폼입니다. 꿈의 레벨을 만들고 다른 플레이어와 창조물을 공유하십시오! Show 풍모: 이 게임에서 레벨을 만드는 것은 매우 재미 있고 쉬운 과정입니다. 셀에 객체를 그리기 만하면 블록, 객체 및 문자를 정렬 할 수 있습니다. 게임의 각 캐릭터는 독특한 무기와 특징을 가지고 있습니다. 모든 캐릭터는 전사, 궁수 및 마법사의 3 가지 유형으로 나눌 수 있습니다. 게임 업데이트에서는 더 많은 캐릭터와 오브젝트를 추가하여 다양한 레벨을 만들고 다른 플레이어를 행복하게 만들 계획입니다! 들어가며하나의 실용적인 프로그램을 만드는 것은 어렵습니다. 아주 간단한 프로그램은 만들기 쉽지만 대개 교육의 목적이기 때문에 심히 실용적이지 않습니다. 그렇다고 실용적인 프로그램을 직접 만들겠다 하면, 정말 많은 변수에 대해서 모두 핸들링할 수 있어야 합니다. 그래서 초기의 설계 단계에서부터 실제 구현 단계까지 생각해야 할 것이 한 두 가지가 아닙니다. 실전 경험이 없는 초보자들은 자신이 다룰 수 있는 도구의 사용법을 모두 익혔다고 해도 그것을 응용하기가 굉장히 어렵습니다. 그래서 교육적이고 간단한 프로그램과 실용적이고 복잡한 프로그램 가운데 어딘가에 끼여 있는, 교육용이기는 하지만 실용적인 프로그램을 만들 때 생각해야 할 것들을 정리할 수 있는 하나의 프로젝트를 진행하고자 합니다. 프로젝트는 현실에서 우리가 흔하게 접할 수 있어서 친근하게 느껴져야 하며, 또한 지금까지 배워온 여러가지 기법을 충분히 활용할 수 있는, 너무 작지 않은 규모의 프로젝트여야 합니다. 저는 간단한 게임을 만들면 좋겠다 싶었고, 어린 시절부터 간간히 친구들과 즐겨온 원 카드 게임을 직접 만들어보면 어떨까 생각이 들었습니다. (원 카드 게임에 대해 전혀 모르시는 분이라면 가까운 지인과 직접 해보시기를 권장드리며, 그것이 여의치 않다면 규칙 정하기를 아주 꼼꼼히 읽어주세요) 사전 공부
규칙 정하기우리는 원카드 게임을 만들 것입니다. 근데 원카드 게임이 무엇이죠?
정확합니다! 게임을 만약 한 문장으로 정리한다면 위와 같이 간단하게 정리할 수 있겠습니다. 하지만 우리의 컴퓨터에게는 처음부터 끝까지 일일히 가르쳐줘야 합니다. 저러한 자연어를 충분히 이해하려면 인공지능의 수준은 아직 멀었습니다. 사실 원카드를 전혀 모르는 사람 입장에서도 저 말은 굉장히 뜬금없습니다. "카드를 어떻게 얻는 것인가?", "카드를 낼 수 있는건가?", "카드를 어디에서 어디로 낸다는 것인가?", "카드를 아무 때에나 내도 되는 것인가?"등등 질문 투성이로 머리가 복잡하게 얽힐 것입니다. 지금부터는 컴퓨터가 이해할 수 있을 만큼 게임의 규칙을 상세하고 명확하게 정해나갈 것입니다. 원 카드를 전혀 모르는 원시인을 가르친다고 상상합시다.
규칙이 어느정도 상세해졌습니다. 가능하다면 규칙을 더욱 세부적으로 짜본 다음에 개발 순서를 정해보도록 합시다.
개발 단계 대략적으로 정해보기게임은 항상 일반적인 상황과 예외적인 상황으로 구분할 수 있습니다. 예를 들어 원카드 게임에서 게임 준비 단계와 게임 끝 단계는 절대 변하지 않습니다. 이런 것부터 개발 우선순위를 높게 잡습니다. 일반적인 카드를 내는 상황은 공격 카드를 내는 상황보다 훨씬 빈번합니다. 또한 공격 카드를 내는 상황이 7, J, Q, K 등의 특수카드를 내는 상황보다 더 빈번합니다. 그러므로 우리는 일반카드를 내는 메커니즘을 먼저 구상해본 뒤, 그 다음 공격 메커니즘, 그 다음 특수 카드 메커니즘을 실현해볼 것입니다. graph TD a["게임 시작과 끝 부분 구현"] b["일반적인 카드를 내는 상황 구현<br>(플레이어간 차례 전환 포함)"] c["공격 카드를 내는 상황 구현"] d["특수 카드를 내는 상황 구현"] a-->b-->c-->d 개발 흐름 정해보기 테스트 하기 쉬운 상황 고려하기우리가 실제 상황처럼 동작하는 것, 즉 완전히 완성된 프로그램과 개발 중인 프로그램의 개발은 다를 수 밖에 없습니다. 우리는 처음부터 아주 다양한 상황을 고려하여 차근차근 프로그램을 설계할 수도 있지만 이는 숙련된 프로그래머조차 넘기 힘든 난관입니다. 그러므로 우리는 프로그램을 다소 축소하여 더 개발하기 쉽도록 만들어 볼 것입니다.
코드 조각 구상하기지금껏 우리는 규칙을 대충 정해봤습니다. 하지만 이러한 규칙은 컴퓨터가 이해할 수 없지요. 이런 규칙을 컴퓨터가 이해할 수 있도록 바꾸어 보는 단계입니다. 우리는 각종 변수를 만들고, 분기를 만들 때 아래 규칙 문장들은 우선적으로 생각해볼 것들을 필자의 머릿속에 떠오른 대로 적어본 것입니다. 이 규칙들을 어떻게 실제로 코딩할지 한번 생각해봅시다. 그 다음에 아래 쪽에 구상의 실제 코드를 살펴봅시다. 구상 예시는 단지 필자가 생각하는 구현 방법에 지나지 않으며, 더 효율적이고 좋은 구상 방법이 있을 수 있습니다.
코드 조각 구상 예시
게임 준비 부분 코딩게임 준비 부분부터 차근차근 개발해봅시다. 우선
카드를 만들어야겠지요. 클래스를 이용할 수도 있겠지만, 그냥 튜플을 써보도록 합시다. 반복되는 부분은
그 다음 for문을 돌릴 것들을 생각해봅시다.
이제 특수 카드를 추가해줍시다. 조커는 모양 칸에 ‘Joker’가, 숫자 칸에는 색깔 정보가 들어가도록 합시다. 이는 애시당초의 카드 설계와 다소 어긋나지만, 특수 카드의 종류가 많은 것도 아니고 예외로 간주하여 적당히 처리할 수 있을 것 같습니다.
이제 카드를 섞어줍니다.
그리고 플레이어와 컴퓨터에 카드를 분배해줍니다.
마지막으로, 덱에서 낸 카드로 카드 하나만 옮겨줍니다.
이로써 게임 준비 부분의 모든 코드는 완료되었습니다. 아래 코드를 참조해주세요.
게임의 끝 부분 만들기본격적으로 코딩할 차례입니다. 게임이 끝나는 시점은 누군가가 패가 전부 떨어질 때입니다. 즉 게임은 플레이어나 컴퓨터의 패가 다 떨어질 때까지 무제한으로 반복합니다. 무제한 반복은
게임의 핵심 부분 코딩하기게임의 핵심 부분에 대한 순서를 간단히 생각해보도록 합시다. graph TD st[플레이어의 턴 시작] st-->imf[게임 진행 정보 출력]-->a a[낼 수 있는 카드를<br>모두 구해본다.]-->b{낼 수 있는<br>카드가<br>있는가?} b-->|Yes|c[이들 중 카드를<br>골라서 낸다.]-->en b-->|No|d[카드를 한 장<br>먹는다.] d-->en[플레이어의 턴 끝] st2[컴퓨터의 턴 시작] st2-->a2 a2[낼 수 있는 카드를<br>모두 구해본다.]-->b2{낼 수 있는<br>카드가<br>있는가?} b2-->|Yes|c2[이들 중 카드를<br>랜덤으로 골라서<br>낸다.]-->en2 b2-->|No|d2[카드를 한 장<br>먹는다.] d2-->en2[컴퓨터의 턴 끝] 게임의 순서도 간단한 정보 출력하기게임의 핵심 부분을 차례로 만들어갑시다. 우선 플레이어와 게임의 상태가 어떤지 출력해줄 수 있도록 합니다.
어떤 리스트에 낼 수 있는 카드인지 판단하기이제 낼 수 있는 카드를 판단해봅시다. 아직까지는 공격 메커니즘을 넣지 않았으므로 공격을 전혀 고려하지 않아도 됩니다. 낼 수 있는 카드인지 판단하는 순서는 다음과 같습니다. graph TD a[패에 있는 어떤 카드 card와 <br>이미 놓여져 있는 카드<br>put을 고려한다.] a-->b b{card와 put의<br>모양이 같은가?}-->|Yes|y c{card와 put의<br>숫자가 같은가?}-->|Yes|y d{card가 조커인가?}-->|Yes|y e{put이 조커인가?}-->|Yes|y b-->|No|c-->|No|d-->|No|e-->|No|f[card는 낼 수 없다.] y[card는 낼 수 있다.] 낼 수 있는 카드 판단 카드를 선택하는 시점은 낼 수 있는 카드를 모두 알게 된 다음이기 때문에 우선 모든 카드를 낼 수 있는지를 검사하고, 가능한 카드를
좋습니다. 제대로 동작합니다. 이제 이것들 중 플레이어가 선택할 수 있도록 해봅시다. 플레이어가 카드 선택하기사용자의 입력을 받는 방법은 굉장히 다양합니다. 우리는 사용 가능한 카드에 번호를 매기고, 이 번호를 통해 입력을 받는 방법을 취할 것입니다. 번호로 입력받기 위해서 리스트의 인덱스를 바로 얻는 방법이 있을 수 있겠습니다.
플레이어가 번호를 입력하여, 인덱스로 변환시킨 뒤 인덱스로 항목을 접근하고 있습니다. 리스트의 앗, 잠깐만요, 만약 낼 수 있는 카드가 없어서 카드를 먹을 수 밖에 없는 상황이라면 어떡하죠? 낼 수 있는 카드가 없는 경우 카드 먹기카드를 선택하기 전에 카드를 먹어야 하는 상황인지에 대해서 먼저 판단해야 할 것 같습니다. 우리가 앞서 카드 하나하나에 대해 검사한 후
좋습니다. 우리가 게임의 끝 부분까지 녹여서 코드를 만든다면 커다란
컴퓨터의 차례 만들기컴퓨터의 차례는 지금 껏 작성한 코드를 복사하여 그대로 붙여넣은 뒤, 일부만 수정해주면 됩니다.
중간 마무리지금까지 대략적으로 핵심적인 게임 기능을 구현해보았습니다. 실제로 플레이해보면 제대로 동작하고 있음을 확인할 수 있습니다. 하지만 아직 갈 길이 멀었습니다. 다음 시간에는 함수를 이용해서 비슷한 기능을 최대한 묶은 다음 공격 메커니즘이나 특수한 상황을 더 처리해볼 것입니다. 지금까지 작성한 모든 코드는 아래를 펼쳐 확인할 수 있습니다. |