✅ 구현된 오목게임 조건 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회로 승부내도록 하기
'😵 ~23.11.10 > ⏩ CodeReview' 카테고리의 다른 글
[ Java ] 코드 리뷰 :: DB를 가변배열에 읽어오기 (0) | 2023.08.13 |
---|---|
[ Java ] 코드 리뷰 :: 순환 지하철 승하차 콘솔프로그램 (0) | 2023.07.16 |
[ HTML ] 이전 구매 리스트 :: <input type="submit">과 <input type="hidden"> 함께 사용하기. 그리고 post로 전송! (0) | 2023.07.16 |