본문 바로가기

개발/AI

가위바위보 게임AI

데하! 안녕하세요 DevStone입니다!

오늘은 되게 재밌는 주제를 들고 왔습니다.

 

최근 친구 가위바위보 과제들을 도와주다 보니까 문득 의문이 들었습니다.

컴퓨터가 내는 가위, 바위, 보를 랜덤이 아니라 컴퓨터가 학습을 하고 내면 어떨까?

 

바로 간단하게 제작해보자 해서 시작했습니다.

 

우선 가위바위보 같은 경우는 독립 사건이기 때문에 딥러닝 등 정상적으로는 학습이 불가능합니다.

여기서 고민을 하다가 떠오른 방법이 결국 사람이 가위, 바위, 보중 내는 거기 때문에 뭔가 특정한 패턴이 있지 않을까?

라는 생각이 들었습니다. 따라서 학습 방향을 패턴을 학습하고 확률에 기반하여 예측해보고자 시작했습니다.

 

여기서 저는 마르코프 행렬을 떠올렸습니다.

 

※마르코프 행렬은 러시아의 수학자 안드레이 마르코프에 의하여 처음 언급된 개념으로

마르코프 행렬은 마르코프 체인을 기술하기 위한 수학적 도구이며,

확률적 방법을 기반으로 하기 때문에 확률 행렬로 불리기도 합니다.

 

간단하게 생각하면 단순히 내가 가위를 낸 다음에 가위, 바위, 보 중에 어떤 걸 낼 확률이

높을지 기록하고 그것으로 예측하는 방식입니다! 마르코프의 성질은 특정 상태의

확률은 오직 과거의 상태에 의존한다기 때문에 과거 사용자가 낸 거를 확률적으로 계산하기

상당히 좋은 이론이죠!

 

쉽게 표로 보여드리자면

  가위 바위
가위      
바위      
     

 

이런 식으로 구성을 생각했습니다.

자 이제 이 생각을 코드에 녹이기만 하면 되기에 바로 작성했습니다

 

사용언어 : Python

 

간단하게 만든 거라 변수명이나 안에 구조가 깔끔하지는 않습니다!

단순히 참고용으로 봐주시길 부탁드립니다!

 

우선 2차원 배열부터 선언해 주었습니다. 마르코프 행렬 모양을 만들기 위해서죠.

 

맨 처음에 제가 낸 값은 없기 때문에 None로 선언, 컴퓨터는 1~3중 숫자를 하나 받습니다.

그 후 win, Lose변수 선언과 count 변수를 선언해 주었습니다.

 

count 변수는 초기 버전에서 친구가 무작위로 하다가 하나씩 쭉 내면 이기기 쉽다 라고 하기에

해당 부분을 막아 주기 위해 연속해서 같은걸 2번 이상 내면 그거에 맞춰 컴퓨터가 내도록 변경하였습니다.

 

그 후 무한반복 시작!

우선 Sciss, Rock, paper 리스트를 만들어 가위, 바위, 보 순서로 열에 맞춰 넣어 주었습니다.

표로 간단하게 보자면 아래와 같습니다!

  가위 바위
가위 0,0 0,1 0,2
바위 1,0 1,1 1,2
2,0 2,1 2,2

 

이제 여기서 df에 이전에 입력했던 값을 저장해 줍니다.

첫 번째 진입 시에는 None가 들어 가지만 그 뒤로는 df에 me내용이 담기게 됩니다.

내용을 담은 후 새로 me를 받기 때문에 df변수는 다시 변하지 않고 사용할 수 있습니다.

 

소스가 중복되는 부분이 많으니 뜯어서 한 부분씩만 설명드리겠습니다!

우선 가위 바위 보 중 이전에 가위를 냈다면

우선 가위 리스트에서 최댓값 즉 가위 낸 후 가장 많이 낸 게 무엇인지 가져옵니다.

 

가져와서 그게 무엇인지 비교하고 컴퓨터가 뭐를 낼지 결정합니다.

만약 가져온 값이 0이라면 컴퓨터는 그냥 1~3중 랜덤으로 내게 합니다.

 

그 후 array 리스트에 1을 추가해줘 꾸준히 데이터를 누적시킵니다.

같은걸 반복해서 내게 되면 카운트가 증가하며 반복 횟수가 3이 넘어가면 그에 맞춰 대응합니다.

 

그 아래 가위바위보 로직은 모두 아실 거라 생각하고! 바로 본론인 결론부터 표로 그려 드리겠습니다.

 

같은 거만 계속 냈을 경우

1 2 3 4 5 6 7 8 9 10
가위 가위 가위 가위 가위 가위 가위 가위 가위 가위
무승부 무승부 패배 패배 패배 패배 패배 패배 패배 패배
11 12 13 14 15 16 17 18 19 20
가위 가위 가위 가위 가위 가위 가위 가위 가위 가위
패배 패배 패배 패배 패배 패배 패배 패배 패배 패배

0승 2무 18패

너무나도 당연한 결과죠?

가위, 바위, 보 순서로 냈을 경우

1 2 3 4 5 6 7 8 9 10
가위 바위 가위 바위 가위 바위 가위
패배 승리 무승부 승리 패배 패배 패배 패배 패배 패배
11 12 13 14 15 16 17 18 19 20
바위 가위 바위 가위 바위 가위 바위
패배 패배 패배 패배 패배 패배 패배 패배 패배 패배

2승 1무 17패

이번에는 2승은 했지만 금방 패턴을 익히고 단 한판도 이길 수 없게 되었습니다.

여기서 우리는 컴퓨터가 정상적으로 학습하고 있음을 알 수 있습니다.

무작위 하게 냈을 경우

우선 무작위 하게 냈을 경우에는 제가 내부 로직을 알고 있다 보니 의식하게 돼서

컴퓨터 랜덤함수로 총 1000게임을 총 5번 진행하였습니다.

 

1번 게임

2번 게임

3번 게임

4번 게임

5번 게임

생각보다 괜찮은 결과가 나왔습니다. 1000판씩 총 5세트를 하여

5세트 모두 학습하는 컴퓨터가 승리하였습니다. 갑자기 궁금하여 작정하고 100만 판도 진행하였습니다.

 

이 또한 학습하는 컴퓨터가 승리하였습니다!

여기서 우리는 데이터가 좀 누적되면 학습한 컴퓨터가 이길 확률이 높다는 걸 알 수 있습니다.

 

물론 가위바위보 같은 경우 완벽한 예측은 불가능합니다.

하지만 상대방의 패턴을 인식하고 그거에 맞춰 승리 확률을 조금이라도 올린다면

그거로도 충분하지 않을까요?? 오늘은 상당히 재밌는 실험을 해본 거 같습니다.

 

모두 참고하셔서 가위바위보 게임을 만드실 때 단순히 랜덤 값이 아닌

학습 기반 ai로 만들어 보시는 것도 괜찮다는 생각이 듭니다!

 

해당 소스는 git에서 확인하실 수 있습니다.

https://github.com/Maker-Kim/Study/blob/master/python/Rock%20Paper%20Scissors_AI.py

 

Maker-Kim/Study

Contribute to Maker-Kim/Study development by creating an account on GitHub.

github.com