
μ΄λ² μ£Όμ°¨ λ΄μ©μ μνμ νλμ λλ€. κ΅μ¬μ μμ λ‘λ nλͺ©μ΄ μμ΅λλ€. μ¬μ€ μ λ²μ£Όμ°¨μ μ΄λ² μ£Όμ°¨ λ΄μ©μ λ¨μ λͺ λ§ λ΄€μ λ μ΄μ κ°ννμ΅μ 무μΈκ° λ°°μ°κ² ꡬλ λΌκ³ μκ°νμ§λ§ νμ΅νλ€λ³΄λ μ λ²μ£Όμ°¨ μ²λΌ μμ νλλ₯Ό κ°μ§κ³ μκ³ λ¦¬μ¦ κ³΅λΆλ₯Ό νλ λλμ΄κΈ΄ νμ΅λλ€. κ·Έλλ κ΅μ¬μμλλ‘ μ°¨κ·Όμ°¨κ·Ό νμ΅ν΄ λ³΄κ² μ΅λλ€.
μ¬μ€ λ¨μ΄ κ·Έλλ‘ μλ―Έλ₯Ό μ μΆνλ κ²μ΄ νΈνκΈ΄ νκ² μ΅λλ€. κ΅μ¬μ μ νμλ κ² κ·Έλλ‘(κ΅μ¬μλ μ€λͺ©μ μμλ‘ λ§νμ΅λλ€) λ§νμλ©΄ μλμ κ°μ΄ μ μ κ°λ₯ν©λλ€.
μν : λ°λν μμ νλ°±μ λλ€μ΄ λμΈ κ΅λ©΄
νλ : μ°Έμ¬μκ° λλ μ
μ°μ μ΄λ² μ£Όμ°¨ μ€ν°λμμλ λ€μκ³Ό κ°μ λͺ¨λ/ν¨ν€μ§λ₯Ό μ΄μ©νμ΅λλ€.
import numpy as np
import time
νκ²½μ λ€μκ³Ό κ°μ΄ μ€μ νμ΅λλ€.
λ°λΌμ μ΄κΈ° μνμ 보λλ
np.zeros(shape, dtype=int)μ΄κ³ shapeλ ν±νν λ (3,3), μ€λͺ©μ (9,9) λ±μ
λλ€.
μ μ μΈν°νμ΄μ€λ GUI, CUIκ° μμ§λ§ μ¬κΈ°μλ CUIλ₯Ό μ΄μ©νκ² μ΅λλ€.
λμ΄ λμ΄μ§μ§ μμ κ³³μ 0μΌλ‘ λνλ΄λ―λ‘ boardμμ 0μΈ μμλ€μ μΈλ±μ€λ₯Ό λ°ννλ©΄ λ©λλ€.
def get_legal_actions(board):
zero_idx = np.where(board == 0)
legal_actions = list(zip(zero_idx[0], zero_idx[1]))
return legal_actions
μ ν¨μλ 0μΈ μμλ€μ μΈλ±μ€λ₯Ό λ°ννλ ν¨μμ
λλ€.
np.whereλ‘ 0μΈ κ³³μ μΈλ±μ€λ₯Ό μ°Ύκ³ νκ³Ό μ΄μ΄ λ°λ‘ λ°νλ μ΄κ²μ zipμ μ΄μ©νμ¬ (ν, μ΄) ννμ ννλ‘ λ¬Άκ³ κ·Έκ²μ 리μ€νΈμ λ΄μ λ°νν©λλ€.
μΉλ¦¬λ nκ°μ λμ΄ κ°λ‘/μΈλ‘/λκ°μ λ°©ν₯μΌλ‘ μ°λ¬μ λμ€λ©΄ λ©λλ€. μ¦ -1/+1 μ΄ nκ°κ° μ°λ¬μ μλμ§ μ¬λΆλ‘ νλ¨νλ©΄ λ©λλ€.
κ°μ₯ κ°λ¨ν λ°©λ²μ κΈΈμ΄κ° nμΈ μ°½μ νμΉΈμ© μ΄λμν€λ©΄μ μ°½μμ 보μ΄λ λͺ¨λ μμλ€μ΄ +1μ΄λ -1 μΈμ§ νμΈνλ©΄ λ©λλ€. μ΄μ κ°μ κΈ°λ²μ νμ£Όμ°½κΈ°λ²μ΄λΌκ³ ν©λλ€.
λ€λ₯Έ λ°©λ²μΌλ‘λ μ°½μμ μμλ€μ ν©μ΄ +5μΈμ§ -5μΈμ§ νμΈνλ©΄ λ©λλ€.
μλμ μ½λμ κ°μ΄ μμ±κ°λ₯ν©λλ€.
n_connects = 5
board_1d = np.zeros(10000, dtype=int)
board_1d[-n_connects:] = 1
win_mark = np.ones(n_connects)
for i in range(len(board_1d) - (n_connects-1)):
window = board_1d[i:i+5]
if (window==win_mark).all():
print("WIN")
λκ°μ λ°©ν₯μ μ‘°κΈ κΉλ€λ‘μ΅λλ€.
λκ°μ μ λκ°μ§ λ°©ν₯μ΄ μλλ° νλλ μΌμͺ½μμμ μ€λ₯Έμͺ½ μλλ‘, λ€λ₯Έ νλλ μ€λ₯Έμͺ½ μμμ μΌμͺ½ μλλ‘ ν₯νλ λ°©ν₯μ΄ μμ΅λλ€.
μ£Όμ΄μ§ λ°°μ΄μ np.diagλ‘ μ»μ μ μλλ°, μ μ€μμ μ£Όλκ°μ μμ λͺμΉΈ λ¨μ΄μ Έ μλ λκ°μ μ λν΄μμΈμ§λ μΈμ k[+λ μμͺ½, -λ μλμͺ½]λ‘ μ§μ κ°λ₯ν©λλ€.
μλμ μ½λμ κ°μ΄ μμ±κ°λ₯ν©λλ€.
delta_row = n_rows - n_conn
delta_col = n_cols - n_conn
# diagonal forward (up left to down right)
for k in range(-delta_row, delta_col+1):
l = list(np.diag(board, k))
result = check_n_mok_in_list(l, player_type, n_conn)
if result == True:
break
# diagonal backward (up right to down left)
for k in range(-delta_col, delta_row+1):
l = list(np.diag(upside_down_board, k))
result - check_n_mok_in_list(l, player_type, n_conn)
if result == True:
break
λμ λ λ κ³³μ΄ μλμ§ νλ¨νλ©΄ λ©λλ€.
λμ΄ λμ΄μ§ μμ κ³³μ΄ 0μ΄λ―λ‘ boardμ λͺ¨λ μμλ€μ κ³±ν κ°μ΄ 0μΈμ§ νμΈνλ©΄ λ©λλ€.
def check_if_game_finishied(board):
if board.prod() == 0:
return False
else:
return True
μΈκ° λκ΅μμ μλ 보λμ νκ³Ό μ΄μ μΈλ±μ€λ₯Ό μμλ‘ νλ ννλ‘ μ λ ₯λ°μ΅λλ€.
def human(state):
legal_actions = state.get_legal_actions()
while True:
action = input("input player action (e.g., '0,0'): ")
if "," in action:
action = tuple(int(float(x)) for x in action.split(","))
if action in legal_actions:
break
else:
print('invalid format")
return action
μ€ν λλ μ°©μ λΆκ°λν μκ° μ λ ₯λλ κ²μ λ°©μ§νκΈ° μνμ¬, μ°©μκ° κ°λ₯ν μκ° μ λ ₯λκΈ° μ κΉμ§λ "invalid format"μ μΆλ ₯νκ³ while루νκ° λ°λ³΅λλλ‘ ν©λλ€.
μ°©μ κ°λ₯ν μ μ€μμ μ무 μλ 무μμμ μ μ ννμ¬ λκ΅νλ λκ΅μλ₯Ό ꡬνν ν¨μμ λλ€.
def AI-random(state):
legal_actions = state.get_legal_actions()
random_idx = np.random.randint(low=0, high=len(legal_actions))
action = legal_actions[random_idx]
return action
μ΄λ² μ£Όμ°¨ μ€ν°λλ μ΄λ κ² λ§λ¬΄λ¦¬λμμ΅λλ€. μ¬μ€ νλ€λ³΄λ μ λ² μ£Όμ°¨μ²λΌ μΈκ³΅μ§λ₯ 보λ€λ νμ΄μ¬κ³Ό numpyμ μ΅μν΄μ§κ³ μ΄κ²λ€μ μ΄μ©ν΄μ κ°λ¨ν(?) μκ³ λ¦¬μ¦μ μμ±ν΄ λ³Έ κ² κ°μ΅λλ€. νμ°ν np.randomλ§ μ¬μ©ν μ λ²μ£Όμ°¨ λ³΄λ€ numpyλ₯Ό λ λ€μνκ² μ΄μ©ν΄ λ³Έ κ² κ°κΈ΄ ν©λλ€.
μ½λλ€μ λ³΄κ³ μμ±ν΄λ³΄λ©΄μ λλ κ²μΈλ° μκ°λ³΄λ€ νμ΄μ¬λ 볡μ‘νκ² μ½λκ° μμ±ν μ μκ² κ΅¬λ μΆμμ΅λλ€. μλλ©΄ μ€μ λ‘ λ³΅μ‘ν κ²μ΄ μλλ° μ μ€λ ₯μ΄ λΆμ‘±ν΄μμΌ μλ μκ³ νΉμ μ λ§ μ΄ κ΅μ¬μ μ½λκ° μΈλ°μμ΄ λ³΅μ‘ν κ²μΌ μλ μμ κ²μ λλ€. μλ¬΄νΌ λ°©νλ νμ΄μ¬λ μ‘°κΈ λ 곡λΆν΄μΌ κ² λ€κ³ λκΌμ΅λλ€.
λ²μ¨ 6μ μ
λλ€. κ·Έλ¦¬κ³ μνμ΄ λ€κ°μ€λκ΅°μ..π±π±
κ·Έλ§νΌ μ’
κ°μ΄ λ³λ‘ μλ¨μλ€λ λ»μ΄λ μ λ νμ΄ν
νκ³ μ΄κΈμ 보λ λͺ¨λ λΆλ€λ νμ΄ν
μ
λλ€!!