반응형
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 |