본문 바로가기
Study

오목 구현해보기

by Jiwon_Loopy 2025. 4. 20.
반응형

Player.java


package omok;

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class Player {
    String name;
    String stone;
}

Board.java


package omok;

public class Board {
	int size;
	String[][] map;

	// 보드 초기화
	Board(int size) {
		this.size = size;
		map = new String[size][size];
		for (int row = 0; row < size; row++) {
			for (int col = 0; col < size; col++) {
				map[row][col] = ".";
			}
		}
	}

	// 보드 현황 출력
	public void print() {
		for (int row = 0; row < size; row++) {
			printPosNum(row);
			for (int col = 0; col < size; col++) {
				System.out.print(" " + map[row][col]);
			}
			System.out.println();
		}
		printPosStr(size);
		System.out.println();
	}

	// 숫자 행 열 맞추기
	public void printPosNum(int i) {
		String v = " ";
		if (i < 10) {
			v = "  ";
		}
		System.out.print(v + i);
	}
	
	// 문자 행 열 맞추기
	public void printPosStr(int size) {
		System.out.print("    ");
		for (int i = 1; i <= size; i++) {
			System.out.print((char) (64 + i) + " ");
		}
	}

	// 오목 세팅 (데이터 업데이트)
	public boolean setOmok(Player owner, String col, String row) {
		int colIdx = col.charAt(0) - 97;
		int rowIdx = Integer.parseInt(row);
		return isOmok(colIdx, rowIdx, owner);
	}

	// 오목 달성 여부 검증
	private boolean isOmok(int colIdx, int rowIdx, Player owner) {
		map[rowIdx][colIdx] = owner.stone;
		if (confirmVerticalLine(colIdx, rowIdx, owner)
				|| confirmHorizontalLine(colIdx, rowIdx, owner)
				|| confirmCrossLine1(colIdx, rowIdx, owner)
				|| confirmCrossLine2(colIdx, rowIdx, owner)) {
			return true;
		}
		return false;
	}

	// 오른쪽 대각선 검증
	private boolean confirmCrossLine1(int col, int row, Player owner) {
		int count = 0;
		boolean isOmok = false;
		for (int i = -5; i <= 5; i++) {
			int di = row + i;
			int dj = col + i;
			if (di < 19 && di >= 0 && dj < 19 && dj >= 0 && map[di][dj] == owner.stone) {
				count++;
			}
		}
		
		if (count == 5) {
			isOmok = true;
		}
		return isOmok;
	}
	
	// 왼쪽 대각선 검증
	private boolean confirmCrossLine2(int col, int row, Player owner) {
		int count = 0;
		boolean isOmok = false;
		for (int i = -5; i <= 5; i++) {
			int di = row + i;
			int dj = col - i;
			if (di < 19 && di >= 0 && dj < 19 && dj >= 0 && map[di][dj] == owner.stone) {
				count++;
			}
		}
		if (count == 5) {
			isOmok = true;
		}
		return isOmok;
	}

	// 가로 검증
	private boolean confirmHorizontalLine(int col, int row, Player owner) {
		int count = 0;
		boolean isOmok = false;
		for (int i = -5; i <= 5; i++) {
			int dj = row + i;
			if (dj < 19 && dj >= 0 && map[dj][col] == owner.stone) {
				count++;
			}
		}
		if (count == 5) {
			isOmok = true;
		}
		return isOmok;
	}

	// 세로 검증
	private boolean confirmVerticalLine(int col, int row, Player owner) {
		int count = 0;
		boolean isOmok = false;
		for (int i = -5; i <= 5; i++) {
			int di = col + i;
			if (di < 19 && di >= 0 && map[row][di] == owner.stone) {
				count++;
			}
		}
		if (count == 5) {
			isOmok = true;
		}
		return isOmok;
	}
}

Omok.java


package omok;

import java.util.Random;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Omok {
	public static void main(String[] args) {
		Player user = new Player("사용자", "O");
		Player computer = new Player("컴퓨터", "X");
		Board board = new Board(19);
		play(board, user, computer);
	}

	// 플레이
	private static void play(Board board, Player user, Player computer) {
		boolean isOmok = false;
		Player owner = user;
		while (!isOmok) {
			if (owner == user) {
				isOmok = userTurn(board, user);
				owner = computer;
			} else {
				isOmok = computerTurn(board, computer);
				owner = user;
			}
			board.print();
		}
	}

	// 사용자 턴
	static boolean userTurn(Board board, Player user) {
		StringTokenizer st;
		try (Scanner sc = new Scanner(System.in)) {
			System.out.print("\\n" + user.name + "> ");
			String input = sc.nextLine();
			st = new StringTokenizer(input, " ");
		}
		String col = st.nextToken(); // k
		String row = st.nextToken(); // 5
		if (board.setOmok(user, col, row)) {
			System.out.println("사용자가 이겼습니다.");
			return true;
		}
		return false;
	}

	// 컴퓨터 턴
	static boolean computerTurn(Board board, Player computer) {
		Random rd = new Random();
		String col = String.valueOf((char) (rd.nextInt(19) + 97)); // k
		String row = String.valueOf(rd.nextInt(19)); // 5
		System.out.println("\\n" + computer.name + "> " +  col + " " + row);
		if (board.setOmok(computer, col, row)) {
			System.out.println("종료");
			return true;
		}
		return false;
	}

}

 

이미 뒀던 곳에는 둘 수 없는 조건을 잊어버렸다 ㅠ

728x90
반응형

'Study' 카테고리의 다른 글

정보 처리 기사 실기 용어 정리  (0) 2025.04.16
3월 4째주 기록  (0) 2025.03.28
3월 3째주 기록  (0) 2025.03.17
React + SpringBoot 첫 연동  (2) 2025.03.15
3월 1째주 ~ 3월 2째주 기록  (2) 2025.03.10