2021. 1. 7. 22:46ㆍPython
이때까지 파이썬으로 유닛을 생성하고, 생성한 유닛들이 이동하고, 공격하는 프로그램을 만들어 보겠습니다.
그래서, 스타크래프트의 게임을 실제로 시작하고 끝내는것까지 전부 파이썬으로 출력해보는 코딩을 시작해보려 합니다.
저는 마린, 탱크, 레이스 이 3가지 종류의 유닛을 뽑고, 이동시키고 공격시키는 프로그램을 만들으려고 합니다.
그럼 먼저 유닛에 대한 클래스를 만들어 보겠습니다.
일반 유닛에 대한 클래스는 위와 같습니다.
유닛에 대한 함수를 설정해주고,
추가로 유닛이 받는 데미지에 대해 추가해 주었습니다.
그리고 공격유닛에 대한 클래스를 설정해 보겠습니다.
공격유닛은 앞서 만든 일반 유닛에 대해 상속을 받아 설정해 보겠습니다.
위와 같이 공격 유닛에 대한 클래스를 설정하고,
추가로 공격유닛이기 때문에 공격한다는 함수를 추가로 생성하였습니다.
이번에는 마린에 대한 클래스를 만들어 보겠습니다.
마린에 특성중 하나인 스팀팩에 대한 설정을 만들어 보려 합니다.
스팀팩이란 마린의 기술중 하나인데 이것을 사용하면 마린의 체력이 줄어드는것을 의미합니다.
위와 같이 마린에 대한 클래스를 만들었습니다. 공격유닛 클래스를 상속받고 스팀팩에 대한 함수를 설정하였습니다.
이번에는 탱크에 대한 클래스를 만들어 보겠습니다.
탱크의 기술중 시즈모드라는 것이 있습니다. 시즈모드는 스팀팩과 다르게 탱크가 시즈모드인 상태와 시즈모드가 아닌 상태가 있습니다.
위와 같이 탱크의 클래스를 만들었습니다.
이 또한 공격유닛이라는 클래스를 상속받았고, 시즈모드일떄와 아닐때의 함수를 설정했습니다.
시즈모드일때에는 공격력이 2배가 되고 시즈모드를 해제할때에는 공격력이 /2이 되게 설정하였습니다.
이번에는 공격유닛에 대한 클래스를 설정해 보겠습니다.
먼저 공격유닛을 설정하기 위해 날수있는유닛이라는 클래스를 상속받기 위해 날수있는유닛(Flyable)클래스를 설정한 이후, 이를 상속받아 공중 공격 유닛 클래스를 설정하겠습니다.
위처럼 먼저 Flyable클래스를 설정한 이후, FlyableAttackUnit클래스를 설정하였습니다. 이는 다중상속을 통해 AttaciUnit(공격유닛)과 Flyable(날수있는유닛) 이 두가지 클래스를 상속받았습니다.
그리고 def move라는 오버라이딩을 사용하였습니다.
오버라이딩을 사용하는 이유는, 이를 설정하지 않으면 공격 유닛이 이동할때에는 move함수를 사용하지만 공중 공격 유닛이 이동할 경우 fly함수를 사용하여야 되어 번거로움이 있습니다. 따라서 오버라이딩을 사용하여 일반 공격유닛이든, 공중공격유닛이든 같이 move 함수를 사용할 수 있게 오버라이딩을 설정하였습니다.
이번에는 레이스에 대한 클래스를 설정하겠습니다.
레이스의 기술중인 클로킹모드에 대한 기술을 설정하겠습니다.
클로킹 모드는 스텔스 모드로 잠시동안 투명해지는 기술을 말하는대, 처음에는 클로킹모드가 아닌 상태입니다.
위와 같이 레이스 클래스를 설정하고, 공중공격유닛 클래스를 상속받고, 클로킹 모드 함수를 설정한 모습을 볼 수 있습니다.
그리고 실제 게임을 진행한다는 내용과 게임이 종료된다는 내용을 출력하기 위해 입력문을 작성하겠습니다.
game_start와 game_over을 입력하였습니다.
Player:gg 구문은 스타크래프트 게임상에서 사용하는 구문입니다.
이제 게임을 시작해보겠습니다.
먼저 게임을 시작하고,유닛들을 생성해보겠습니다.
위와 같이 게임을 시작하였고, 마린3기와 탱크2기 레이스1기를 생성하였습니다.
그리고, 유닛을 쉽게 일괄관리하기 위하여, 마린,탱크,레이스를 합병하여 관리하기 위해 리스트를 사용하여 입력문을 작성하였습니다.
위와 같이 attack_units이라는 변수를 만들어 유닛 전군을 관리하는 변수를 설정하였습니다.
그러면 이번에는 만들었넌 변수를 가지고 전군을 이동시켜 보겠습니다.
현재 전군은 모두 1시로 이동하였고 모든 병력들이 1시로 이동되고 있는 내용이 출력될 것입니다.
이후 공격을 하기위해 시즈모드를 개발한후, 공격모드로 변환하는 입력문을 작성해보겠습니다.
전군 중에서 인스턴스중 마린 인스턴스는 스팀팩을 사용하고,
탱크 인스턴스는 시즈모드를 실시하고,
레이스 인스턴스는 클로킹모드를 실시하였습니다.
마지막으로, 전군을 공격시킨 후, 공격을 했으니 피해를 받고, 피해가 심해져 게임을 종료시키는 작업을 입력해보겠습니다.
아까는 move함수로 전군들을 이동시켰다면 이번에는 attack함수로 1시를 공격하고 있습니다. 출력문에서 1시를 이동했따면 이번에는 1시를 공격하는 내용이 출력될 것입니다.
그리고 전군의 피해를 받는 것을 설정했습니다. unit.damaged 함수를 사용해 받는 데미지는 5에서 20사이 랜덤으로 받도록 설정하였고, 이후 게임이 종료되는 것을 입력하였습니다.
마지막으로 앞서 작성했던 내용들을 출력해 보겠습니다.
※입력한 순서대로,
1.게임시작 알림 출력
2.마린3기, 탱크2기, 레이스1기 생성
3.전ㄷ군 1시 방향으로 이동
4.탱크 시즈 모드 개발 완료
5.전군 스팀팩,시즈모드,클로킹 모드 설정
6.전군 1시방향으로 공격
7.전군 피해 받음
8.게임 종료 후 퇴장
위와 같이 출력문이 올바르게 나오는 것을 알수 있으며 각 유닛들이 무엇을 상속받고 어떻게 다중상속을 받았는지 아래 그림으로 쉽게 요약해 보았습니다.
위와 같이 파이썬을 사용하여 가상으로 스타크래프트게임을 실행하는 코드를 작성해 보았습니다.
게임을 실행한후 유닛을 생성하고, 업그레이드를 실시하고, 공격하고, 피해를 받은 시물레이션을 실시해보았습니다.
항상 클래스를 생성할때, 상속받는 부분과 어떤부분을 어떻게 상속받을것인지 인지하는것이 매우 중요한 포인트라 생각합니다.
'Python' 카테고리의 다른 글
[Python]예외처리 (0) | 2021.01.09 |
---|---|
[Python]부동산 프로그램 Quiz (0) | 2021.01.08 |
[Python]상속, 다중상속 (0) | 2021.01.07 |
[Python]파일 입,출력을 활용한 quiz (0) | 2021.01.06 |
[Python]클래스 (0) | 2021.01.06 |