private SpaceHolder[] CopyBoard(SpaceHolder[] board) { SpaceHolder[] boardCopy = new SpaceHolder[9]; for (int i = 0; i < 9; i++) { boardCopy[i] = board[i]; } return(boardCopy); }
private bool IsWin(SpaceHolder[] board, SpaceHolder mark) { return((board[0] == mark && board[1] == mark && board[2] == mark) || (board[3] == mark && board[4] == mark && board[5] == mark) || (board[6] == mark && board[7] == mark && board[8] == mark) || (board[0] == mark && board[3] == mark && board[6] == mark) || (board[1] == mark && board[4] == mark && board[7] == mark) || (board[2] == mark && board[5] == mark && board[8] == mark) || (board[0] == mark && board[4] == mark && board[8] == mark) || (board[2] == mark && board[4] == mark && board[6] == mark)); }
private int AiLogic(List <int> movableSpace) { SpaceHolder[] boardCopy = new SpaceHolder[9]; // 이길 수 있는 곳이 있다면 거기에 둡니다. foreach (int i in movableSpace) { boardCopy = CopyBoard(board); boardCopy[i] = SpaceHolder.X; if (IsWin(boardCopy, SpaceHolder.X)) { return(i); } } // 상대방이 다음에 이길 수 있는 곳이 있다면 거기에 두어서 막습니다. foreach (int i in movableSpace) { boardCopy = CopyBoard(board); boardCopy[i] = SpaceHolder.O; if (IsWin(boardCopy, SpaceHolder.O)) { return(i); } } // 우선순위에 따라서 둡니다. 중앙 -> 변 -> 코너 if (board[4] == SpaceHolder.None) { return(4); } int[] sides = new int[] { 1, 3, 5, 7 }; foreach (int i in sides) { if (board[i] == SpaceHolder.None) { return(i); } } int[] corners = new int[] { 0, 2, 6, 8 }; foreach (int i in corners) { if (board[i] == SpaceHolder.None) { return(i); } } // 그 외의 경우는 없습니다. throw new ArgumentException("예상치못한 경로에 들어갔습니다."); }