안녕하세요. 호랑인 입니다.
오늘부터 한동은 야찌 게임을 실제로 구현하는 과정을 거칠 예정입니다. 이 과정이 왜 중요할까요?
앞선 포스팅에서 야찌 게임의 AI를 만들겠다고 설명드린 바 있습니다. 그러려면, AI가 플레이를 해보고, 다양한 전략?을 세울 기회를 주어야겠죠? 그렇기 때문에 구현하는 과정을 만드는 것이 우선적으로 이루어져야 합니다.
그래서 저희는 AI 경쟁을 위한 규칙을 마련했습니다. (저흰 원래 이런 거 하며 놉니다.)
1. 정통 Yatzy 가 아닌, Yahtzee의 룰을 기본으로 삼는다. 바로가기
2. 이때, Yahtzee 가 두번 이상 나올 때엔 원래 100점의 보너스와 함께 추가 주사위 횟수를 준다던가, 하나의 0점이 아닌 점수를 50점으로 체워준다던가 하는, 다양한 보너스 룰이 있습니다. 이것은 무시하기로 했습니다. 이외의 보너스는 취급합니다.
즉, 1, 2, 3, 4, 5, 6 칸의 합이 63 이상이어서 생기는 보너스 35점은 계산에 넣되, 더블 야찌 보너스는 생각하지 않습니다.
3. 플레이는 번갈아가며 한 스테이지를 진행하여 최종 총합에 따라 승패가 정해집니다.
... 그리하여, 오늘부터는 야찌 프로그램을 만들어 보겠습니다. 어떻게 만들까에 대해서 많은 생각을 해봤습니다. 제가 output 결과를 볼 수 있는 방법이 별로 없더군요.
그래서 생각한 것이 GUI 를 만들고 winapi를 사용해서 이를 조작하는 것인데.... 솔직히 말씀드리자면 너무 귀찮아서 그냥 콘솔에 printout 하겠습니다. 이를 어떻게 하나, 하시는 분들이 계신다면 나중에 시간이 남을 경우 포스팅을 하나 하겠습니다.
---------------------- 무엇을 print 할 것인가? ---------------------------
어차피 training 을 한창 하고 있을 때에는 print를 하지 않을 것입니다. 제가 그 과정을 다 따라갈 수도 없고, 따라갈 생각도 없기 때문에, 불필요한 프로세스의 낭비를 하고 싶진 않기 때문입니다. 즉, print 할 내용은 게임이 잘 돌아가는지를 확인하는 용도 정도로만 생각해 주세요.
1. 무작위의 주사위 5개
(이 사이에 우선 랜덤으로 뽑아서 바꿀 여부를 결정해 놓을 것입니다.)
2. 골라진 주사위 번호들, 다시 굴려진 결과
(이 사이에 우선 랜덤으로 뽑아서 바꿀 여부를 결정해 놓을 것입니다.)
3. 골라진 주사위 번호들, 다시 굴려진 결과
4. 어떤 점수판을 선택하였는가
5. 결과로 나온 점수판 전체 출력
정도로 할 것입니다.
---------------------- 내부 구조 (점수판) ---------------------------
우선, 점수판을 어떻게 해놓을까요? 이것이 중요한 이유는 이미 고른 점수판을 다시 고르면 안되기 때문입니다.
가능한 방법은 많습니다. 저는 파이썬 사용자이기 때문에, dictionary 라는 것을 사용하여 그 dictionary의 key를 주사위의 번호로, value를 값과 골라진 여부 boolean의 list 혹은 tuple을 넣는 것도 방법입니다. 가장 깔끔한 방법입니다. 개인적으로 다른 사람들과 공동 작업을 한다면, 이 방법을 썼을 것 같습니다.
매우 간단한 방법도 있습니다. 모든 점수를 -1로 초기화 해 놓는 것입니다. 그래서 해당 값이 양수인 경우에만 이후 점수반영에 포함시키고, 음수일 때에만 새로운 값을 넣을 수 있게 하는 것입니다.
당연하지만, 이미 선택되었는가 여부의 list를 별도로 갖고 있는 것도 방법입니다.
저는 제 귀찮이즘 세포에게 패배하였기에 마지막 방법으로 가겠습니다. (제일 구현에 드는 코드 줄 수가 적을 것 같습니다...)
---------------------- 내부 구조 (classes) ---------------------------
우선, 야찌 class 를 만들어봅시다.
YahtzeeGame class 를 만들었습니다. 이 클라스 내에는 어떤 값들이 있어야 할까요??
---------------------- 초기화 (__init__) ---------------------------
우선, 앞에서 말했듯이, 점수판이 필요합니다. 당장 만들어보죠.
만들려고 하다 보니, 마음이 바꿨습니다. 깔끔한 첫번째 방법으로 가보죠.
실행해보면 잘 나온다는 것을 알 수 있습니다. 물론, dictionary를 사용했기 때문에 점수판 내의 순서는 더 이상 보장되지 않습니다. 그리고 위의 이미지에서 하나 정정하자면, bonus1과 bonus2의 경우는 선택되어서는 안되기 때문에 초기값을 True로 설정했습니다.
이외에도 init 함수 안에는 몇 가지가 더 들어가야 할 것 같습니다.
각각 주사위를 다시 굴릴 수 있는 횟수(최대 2)와 실제 주사위의 눈금 5개, 그리고 주사위를 고정할지 여부를 결정하는 boolean 5개입니다.
두 번때 Dice_int 는 디버깅을 하기 위해 만들어놓은 것입니다. 예를 들어, 풀 하우스 인식 함수가 제대로 작동하는지 알아보려면, 그것이 나올 때까지 기다리는 것보단 만드는 것이 쉽기 때문이죠. 실제 게임이 돌아갈 때에는 지워야 합니다.
---------------------- 주사위 굴리기 (NewRoll) ---------------------------
이제 주사위를 굴리는 부분을 만들어보죠. hold 변수에 있었던 항들을 제외하고 나머지를 다시 굴립니다. 그리고 Dice_Roll 변수에서 1을 뻅니다.
---------------------- 역을 넣기 (Add to Scoreboard) ---------------------------
넣고 싶은 역의 순위를 정해서 넣으면, 그 순위 중에서 넣을 수 있는 가장 높은 애를 넣습니다.
---------------------- 실제 플레이 (Play Stage) ---------------------------
가장 핵심이 되는 부분이라 할 수 있습니다. Dice_Roll 이 0 이 아니라면, 새로 굴립니다. 만약 0 이라면, choice를 받고, 이 choice에 점수를 추가합니다. 그리고 새로운 Stage를 엽니다.
위의 방법들을 사용해서 야찌 게임을 우선 구현했습니다. 물론, 어떤 역이 성립하는지 여부를 확인하는 코드도 있고, 전체 점수 합계를 구해주는 코드도 있지만, 이는 간단한 내용이기도 하고, class 내부 구조 파악과는 관계가 없어 따로 올리진 않습니다.
결과적으로 보니 총 120 줄 정도의 코드가 나왔습니다. 역시 파이썬의 위대함에 다시끔 놀랍니다.
다음 포스팅에서는 본격적으로 AI 를 만들어 보겠습니다. 감사합니다.
'프로젝트 > 프로젝트 [야찌(Yahtzee)]' 카테고리의 다른 글
[야찌(Yahtzee)] AI의 문제 (2) | 2018.02.04 |
---|---|
[야찌(Yahtzee)] AI 만들기 (0) | 2018.02.03 |
[야찌(Yahtzee)] 기본 아이디어 (0) | 2018.01.31 |
[야찌(Yahtzee)] 야찌에 대한 소개 (2) | 2018.01.30 |