<끝말잇기 게임>
저는
1. Player 클래스
2. WordGameApp public클래스
이렇게 2개의 클래스를 만들어 줬습니다.
Player클래스는 게임을 진행하는 플레이어 개개인의 정보를 담고있습니다. ex. 이름, 입력한 단어, 단어에 대한 정보(첫 단어, 마지막 단어) |
WordGameApp클래스는 단어게임 한 판에 대한 정보를 담고 있습니다. ex. 게임진행을 조절하는 go변수, 게임에 참가하는 참가자들의 배열 players |
Player클래스의 멤버함수는 다음과 같습니다.
public Player(String name) | 생성자. 인자를 받아 플레이어의 이름을 초기화해줌. |
public void getWordFromUser() | 단어를 입력받아 해당 차례인 플레이어의 필드 word에 저장하고, 그 단어의 정보도 저장.(첫 글자, 마지막 글자) |
public int checkSuccess(char lastword) | 끝말잇기에서 졌는지 확인하고, 졌다면 게임을 다시 시작 유무를 확인하는 함수. 이전 턴 플레이어의 단어 마지막 글자와 현재 플레이어의 단어 첫 글자를 비교하여 승패를 판단한다. 플레이어가 게임을 멈추고 싶은 경우 0이 반환되고, 게임에서 졌지만 새로운 게임을 시작하고 싶은 경우 1, 그리고 게임에서 지지 않은 경우 2가 반환된다. |
WordGameApp클래스의 메소드는 다음과 같습니다.(main제외)
public WordGameApp(int count) | 게임진행여부를 판단해주는 go변수를 2로 초기화해준다. go변수에서 0은 게임 멈춤, 1은 새로운 게임 시작, 2는 게임이 진행중을 뜻한다. |
void run(int count) | 입력된 count수만큼의 Player클래스 인스턴스의 배열을 만들어준다. 이름을 입력받아서 Player의 생성자로 넣어준다. |
void playgame() | 게임을 진행하는 함수. while무한반복문으로 게임을 반복하고, 게임이 종료됐을 경우(go가 2가 아닌 경우) 새로운 게임을 시작할 것인지 확인한다. |
boolean gameStop() { | 게임 종료일 경우(go가 0일 경우) true를 반환한다. |
static int inputEntry() | 게임참가 인원을 입력받아 반환하는 함수. |
먼저 main함수의 코드를 보면,
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
int count;
System.out.println("====================================");
count = inputEntry(); // 참가자 수 입력
WordGameApp game = new WordGameApp();
game.run(count); // count 수만큼 플레이어 정보 입력받기
game.playgame(); // 게임 진행
if (game.gameStop()) // 게임 종료를 입력받을 시
break;
}
System.out.println("============게임을 종료합니다.============");
scanner.close();
}
count변수에 참가자 수를 입력받는 함수 inputEntry()를 호출해주고,
while문은 사용자가 종료를 입력할 때까지 게임을 반복수행 해줍니다. (gameStop()함수가 true가 될 때까지)
먼저 게임 한 판을 뜻하는 WordGameApp클래스의 인스턴스 game을 만들어줍니다.
그리고 game의 멤버함수인 run을 통해 플레이어의 정보를 입력받습니다.
그 다음엔 playgame 메소드로 게임을 진행시켜줍니다.
게임이 끝난 후에는 gameStop유무를 판단한 후 새로운 게임을 시작할 지 판단해줍니다.
사용자가 종료를 입력하면 종료를 출력하고 scanner를 닫아주고 프로그램이 끝이 납니다.
main함수는 비교적 간단합니다.
전체코드는 다음과 같습니다.
import java.util.InputMismatchException;
import java.util.Scanner;
class Player {
Scanner scanner = new Scanner(System.in);
private String name, word;
private char firstChar;
char lastChar;
public Player(String name) {
this.name = name;
}
public void getWordFromUser() {
System.out.print(name + ">>");
word = scanner.next();
int lastIndex = word.length() - 1;
firstChar = word.charAt(0);
lastChar = word.charAt(lastIndex);
}
public int checkSuccess(char lastword) {
int going = 2;
if (lastword == this.firstChar)
return going;
else {
System.out.println(this.name + "이 졌습니다.");
while (true) {
try {
System.out.print("게임을 계속 하시겠습니까?(0:아니오, 1:네)>>");
going = scanner.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("잘못된 값입니다. 다시 입력하세요!");
scanner.next();
}
}
return going; // 0 게임멈춤 1 게임계속 2 게임안끝남
}
}
}
public class WordGameApp {
int go;
Player[] players;
public WordGameApp() {
go = 2; // 0 게임멈춤 1 게임계속 2 게임안끝남
}
void run(int count) {
Scanner scanner = new Scanner(System.in);
Player[] players = new Player[count];
for (int i = 0; i < players.length; i++) {
System.out.print("참가자의 이름을 입력하세요 >>");
String name = scanner.next();
players[i] = new Player(name);
}
this.players = players;
}
void playgame() {
int go;
int count = players.length;
int turn = 0;
int prev_turn = -1;
char last_word;
System.out.println();
System.out.println("시작하는 단어는 아버지입니다.");
while (true) {
players[turn].getWordFromUser();
if (prev_turn == -1)
last_word = '지';
else
last_word = players[prev_turn].lastChar;
// 0 게임멈춤 1 게임계속 2 게임안끝남
go = players[turn].checkSuccess(last_word);
if (go != 2)
break;
prev_turn = turn;
turn = (turn + 1) % count;
}
this.go = go;
}
boolean gameStop() {
if (go == 0) // 게임 종료를 입력받을 시
return true;
else
return false;
}
static int inputEntry() {
Scanner scanner = new Scanner(System.in);
int count;
while (true) {
System.out.print("게임에 참가하는 인원은 몇 명 입니까>>");
try {
count = scanner.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("숫자가 아닙니다. 다시입력하세요!");
scanner.next();
continue;
}
}
return count;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
int count;
System.out.println("====================================");
count = inputEntry(); // 참가자 수 입력
WordGameApp game = new WordGameApp();
game.run(count); // count 수만큼 플레이어 정보 입력받기
game.playgame(); // 게임 진행
if (game.gameStop()) // 게임 종료를 입력받을 시
break;
}
System.out.println("============게임을 종료합니다.============");
scanner.close();
}
}
이번 프로그램은 상당히 시간이 많이 걸렸습니다. 그래도 클래스를 사용하는 법에 익숙해지는 데에는 많이 도움이 됐던 것 같습니다.
그리고 생각도 못한 Scanner쪽에서 발목이 잡혔는데요.
Scanner 객체를 만들어주고 닫아주는 걸 반복하면 NoSuchElementException이라는 예외가 계속 발생했습니다.ㅜㅜ
그래서 구글링을 해봤더니,
Scanner가 close되면 표준입력인 System.in도 같이 닫혀서 다시 Scanner객체를 만들어줘도 읽을 수 없다고 하더라고요.
해결방법은 객체를 만들고 close를 하지 않는 방법과 System.in을 감싸서 사용하는 방법이 있다고 합니다.
close를 안써도 자바의 가비지 컬렉터가 알아서 해준다고 하네요.
(scanner를 하나만 만들어 돌려쓰는 방법도 있다고 하는데, 자바 클래스에는 어떻게 적용하는지 잘 모르겠습니다.)
저는 감싸는 방법은 잘 모르겠어서 그냥 안닫고 객체 만들어주는 것만 반복하는 방법을 사용해봤습니다. 이러니까 코드가 잘 돌아갔습니다!! 감싸서 사용하는 방법도 다음에 기회가 되면 사용해봐야겠습니다.
아직 너무 부족한 것 같네요. 더 연습이 필요할 것 같습니다.
'프로그래밍 언어 > javastudy' 카테고리의 다른 글
명품 Java Essential 4단원 실습문제 #2 (0) | 2021.07.12 |
---|---|
명품 Java Essential 4단원 실습문제 #1 (0) | 2021.07.11 |
명품 Java Essential 3단원 실습문제 (3) | 2021.07.07 |
자바 공부 #5 up&down게임 (3) | 2021.07.05 |
자바 공부 #4 369게임, 커피 주문, 사칙 연산 (4) | 2021.07.05 |