heatz123/Reinforcement-Learning-Gomoku

렌주 룰 구현

Closed this issue · 2 comments

#2 에 따라 구현한다.

is_win - 주어진 수로 게임이 끝나는지 검사하는 함수 (이미 validation했다는 가정 하)

  1. 각각의 방향에 대해, 주어진 수를 포함한 연속된 돌의 개수를 구한다.
    • count_succession
  2. 해당 수가 인 경우, 5개 이상이면 true 아니면 false
  3. 해당 수가 인 경우, 딱 5개면 true 아니면 false

is_valid_move - 수를 놓을 수 있는지 없는지 검사하는 함수

  1. 해당 수가 이면 → true
  2. 아니면, 해당 위치에 수를 놓았다고 가정
  3. 육목이 생기면 → false
    • is_overline
  4. 아니면, 의 개수와 열린 삼의 개수를 계산
    • count_four, count_open_three
  5. 가 1개, 열린 삼이 1개이면 → true
  6. 열린 삼 개수의 합이 2개 이상이면, → false
  7. 아니면, → true

count_four - 주어진 수가 포함된 의 개수를 반환하는 함수 (에게만 유효)

  • 방향이 같더라도 를 구성하는 돌의 셋이 다르면 각각 하나의 로 계산한다.
    • ex) ... O OOO O ... 는 2개의 로 계산한다.
  1. 파라미터로 주어진 수를 포함하여 같은 방향의 돌 4개를 선택한다.
    1. 이때, 연속된 돌들은 모두 선택하거나, 모두 선택하지 않아야 한다.
  2. 각각의 셋에 대해, 수 하나를 더해 오목이 될 수 있는 경우의 수를 반환한다.
    • is_valid_movetrue인 경우에 대해 is_five_in_a_row를 호출

count_open_three - 주어진 수가 포함된 열린 삼의 개수를 반환하는 함수 (에게만 유효)

  • 와는 다르게 같은 방향에서 두개 이상의 열린 삼이 생기는 경우는 존재하지 않는다.
  1. 파라미터로 주어진 수를 포함하여 같은 방향의 돌 3개를 선택한다.
    1. 이때, 연속된 돌들은 모두 선택하거나, 모두 선택하지 않아야 한다.
  2. 각각의 셋에 대해, 수 하나를 더해 열린 사가 될 수 있는 경우의 수를 반환한다.
    • is_valid_movetrue인 경우에 대해 is_open_four를 호출

count_succession - 주어진 방향에 대해, 주어진 수를 포함하여 연속된 돌의 개수를 반환하는 함수

  1. 주어진 수로부터 주어진 방향의 양쪽 끝으로 한칸씩 움직이며 같은 색깔의 수를 센다.

is_five_in_a_row - 주어진 방향에 대해, 주어진 수를 포함하여 오목이 되는지 검사하는 함수

  1. 주어진 방향에 대해, 연속된 돌의 개수가 5개면 true 아니면 false
    • count_succession == 5

is_overline - 주어진 방향에 대해, 주어진 수를 포함하여 육목인지 검사하는 함수

  1. 주어진 방향에 대해, 연속된 돌의 개수가 6개 이상이면 true 아니면 false
    • count_succession >= 6

is_open_four - 주어진 방향에 대해, 주어진 수를 포함하여 열린 사가 되는지 검사하는 함수

  1. 주어진 방향에 대하여, 수 하나를 더해 오목이 될 수 있으면 true 아니면 false
    • is_valid_movetrue인 경우에 대해 is_five_in_a_row를 호출

이대로만 하면 굉장히 깔끔할 것 같습니다!
수 하나를 더하는 것을 시뮬레이션 할 때 케이스를 나눠 계산량을 줄일 수도 있겠는데, 일단 exhaustive하게 하고 나중에 수정해도좋을 듯합니다.

재귀적 구현이 너무 오래걸립니다...
최적화를 해야합니다...
DFS로 구현했는데 BFS로 해야할 것 같습니다...