✅ 구현된 오목게임 조건
1. 흰돌과 검은돌이 번갈아서 둔다. 한 세트는 10회
2. 게임을 저장하고 불러온 후 자료가 그대로 반영될 것.
3. 흰돌로 끝났다면 불러온 게임에선 검은돌로 시작하기

 

#️⃣ 수정사항1) 오목판 세팅과 프린트문 분리

오목판 세팅과 오목판 출력이 하나의 for문 안에 들어가있어서 불러오기로 게임 재실행시, 빈 판이 재출력되는 문제가 있었는데 빈 오목판 입력값을 메뉴 위로 올리고 출력은 원할 때 나올 수 있도록 원하는 위치로 이동시킨다

(*입출력 분리가 가능한 배열의 특징 이용)

// 오목판 세팅 -----
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        board[y][x] = '┼';
        board[y][0] = '├';
        board[0][x] = '┬';
        board[y][width - 1] = '┤';
        board[height - 1][x] = '┴';

        board[0][0] = '┌';
        board[0][width - 1] = '┐';
        board[height - 1][0] = '└';
        board[height - 1][width - 1] = '┘';
    }
}

// 오목판 출력 -----
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        System.out.printf("%s", board[y][x]);
    }
    System.out.println();
}

 

 

 

#️⃣ 수정사항2) if문을 삼항연산자로 정리

✔ if문에 포함되어있던것

- 인덱스가 짝수면 검은돌 / 홀수면 흰돌

- 인덱스에 따라서 오목 좌표에 표기하기

//기존코드
for (int y = 0; y < height; y++) { // 오목돌출력
    for (int x = 0; x < width; x++) {

        if (i % 2 == BLACK) {
            board[oy][ox] = (turn == BLACK ? '●' : '○'); //turn을 어떻게든 활용하려고 이렇게 해뒀는데 이렇게 쓰면 삼항연산자의 장점이 없다...
            omokMap[oy - 1][ox - 1] = 1; // 검은돌일때 좌표에 1
        } else if (i % 2 == WHITE) {
            board[oy][ox] = '○';
            omokMap[oy - 1][ox - 1] = 2; // 흰돌일 때 좌표에 2
        }
        System.out.printf("%s", board[y][x]);
    }
    System.out.println();
} // 오목돌출력 끝

▼ if문을 삼항연산자로 정리 (상수형 변수 활용)

- turn에 따라서 대응하는 색깔의 돌 놓기

- turn에 따라서 좌표에 해당값 입력하기

- 돌 놓고 turn바꾸기

// 개선코드
final int BLACK = 0; // 자바는 초기화 없이 상수형 변수를 쓸 수 있다. 대신 한번 대입하면 바꿀 수 없다.
final int WHITE = 1; // 대신 코드화되면서 값의 한계가 생긴다.
int turn = BLACK; // 검은돌과 흰돌이 돌아가는 턴

board[oy][ox] = (turn == BLACK ? '●' : '○'); // 조건에 따라 돌놓기 완
omokMap[oy - 1][ox - 1] = (turn == BLACK ? 1 : 2); // 검은돌일때 좌표에 1 // 좌표에 표기 완
turn = (turn == BLACK ? WHITE : BLACK); // 삼항연산자의 결과값에 따라 턴 바꾸기

 

 

 

#️⃣ boolean 값 활용하기

: 수정한 사항은 아니고, boolean을 버튼으로 활용하는게 익숙치 않았는데, 오목게임을 만들면서 조금씩 활용하는 연습을 하게 되었다. 이때 한번 인지하니까 나중에 다른 게임 만들때 boolean값을 써야겠단 연상이 쉽게 떠올랐음!

// 4. 게임 불러오기 --------------
case 4: {
    FileInputStream fis = new FileInputStream("res/omok/datasave.txt");
    Scanner fscan = new Scanner(fis);

        int tmp = 0;
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                tmp = fscan.nextInt();
                omokMap[i][j] = tmp;
                System.out.printf("%d ", omokMap[i][j]);
            }
            System.out.println();
        }
    restart = true; // 게임을 불러오면서 boolean restart를 true로 전환

    System.out.println("게임불러오기");

    fscan.close();
    fis.close();
    break;
} // case 4 ends

 

👉 게임을 불러온 후에는 switch를 break하고 ▶ 메뉴를 선택하는 while문에 갇혀있으므로 case1 게임시작하기를 통해 해당 좌표를 불러오게 된다.

 

👉 게임을 본격적으로 시작하기전에 if문과 boolean값을 통해 해당하는 조건일때만 불러온 정보가 작동하게 된다. 

 

// 메뉴화면 다음 switch case1 내의 코드들

{// 새 게임이 시작되면 map을 0으로 초기화
    if (!restart) // restart가 false일때만 작동
        for (int y = 0; y < omokMap.length; y++)
            for (int x = 0; x < omokMap.length; x++)
                omokMap[y][x] = 0;
}

{// 불러온 게임 로드해서 돌 올리기
    if (restart) { //restart가 true일때만 작동.
        for (int y = 0; y < omokMap.length; y++)
            for (int x = 0; x < omokMap.length; x++) {
                if (omokMap[y][x] == 1)
                    board[y + 1][x + 1] = '●';
                else if (omokMap[y][x] == 2)
                    board[y + 1][x + 1] = '○';
            }
    }
    restart = false; // 로드 후 restart를 false로 초기화
}

// 기본 빈오목판출력--------------
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        System.out.printf("%s", board[y][x]);
    }
    System.out.println();
}

gameover: for (int i = 0; i < 10; i++) { // 1set당 10번의 기회 제공

    do { //검증용 do-while
        System.out.println("그만두기: -1 -1");
        System.out.println("(x sp y)>");

        ox = scan.nextInt(); // 좌표 입력받기
        oy = scan.nextInt();

        if (ox == -1 && oy == -1) {
            System.out.println("끝났습니다.");
            break gameover;
        }

        if (!((1 <= ox && ox < width) && (0 <= oy && oy < height)))
            System.out.println("1~10 값을 입력해주세요");

        else if (board[oy][ox] != '┼')
            System.out.println("중복값입니다");

    } while (!((1 <= ox && ox < width) && (0 <= oy && oy < height)) || board[oy][ox] != '┼');

    board[oy][ox] = (turn == BLACK ? '●' : '○'); // 좌표에 따른 돌 놓기
    omokMap[oy - 1][ox - 1] = (turn == BLACK ? 1 : 2); // 좌표에 표기하기
    turn = (turn == BLACK ? WHITE : BLACK); // 검은돌-흰돌 순서 바꾸기

    // 돌 출력
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            System.out.printf("%s", board[y][x]);
        }
        System.out.println();
    } // 돌 출력 끝

} // 10회 for ends

break;
} // case 1 ends >> 스위치문을 나간다

 

 


 

 

✅ 추가로 필요한 수정사항

  • 1판이 10회이므로, 기존 게임을 3회 두고 끝난경우, 불러온 게임에서 7회로 승부내도록 하기

 

 

+ Recent posts