명품 자바 프로그래밍

명품 자바 프로그래밍 4장 오픈챌린지 끝말잇기 게임 만들기

렛쓰기릿 2023. 10. 21. 17:05
import java.util.*;

public class WordGameApp {
	public static Scanner s = new Scanner(System.in);
	// 생성자 WordGameApp()
	public WordGameApp() {}
	
	public static void run() {
		System.out.print("게임에 참가하는 인원은 몇명입니까 >> ");
		int players = s.nextInt();
		
		// players수만큼 객체배열 생성 및 객체마다 이름 입력해서 할당해줌.
		Player p [] = new Player[players];
		for (int i = 0; i<players; i++) {
			System.out.print("참가자의 이름을 입력하세요 >> ");
			String name = s.next();
			p[i]= new Player(name);
		}
		// 끝말잇기 시작
		System.out.println("시작하는 단어는 아버지입니다.");
		String pre_input = "아버지";
		int i = 0;
		while (true) {
			p[i].getWordFromUser(s);
			if (p[i].checkSuccess(pre_input) == false) {
				System.out.println(p[i].name + "의 패배입니다.");
				break;
			}
			pre_input = p[i].word; // 이번에 입력한 단어를  pre_input으로 바꿈
			i++; // 다음순서로 넘어감
			
			if (i==players) // i가 플레이어 순서를 넘어가면 다시 첫번째 순서로 돌아감
				i =0;
		}
	}
	
	public static void main(String[] args) {
		System.out.println("끝말잇기 게임을 시작합니다. . .");
		while (true) {
			run(); // 일단 게임 한번 실행
			System.out.print("게임을 다시 시작하시겠습니까? ( YES=1 / NO=0 ) : ");
			int choose = s.nextInt();
			if (choose == 0) {
				System.out.println("끝말잇기 게임을 완전 종료합니다. . .");
				break;
			}
			else
				System.out.println("게임을 다시 시작합니다. . .");
		}
	}
}

// 게임 참가자 이름 필드, 단어 입력받는 getWordFromUser() 메소드, 
// 끝말잇기 성공여부 및 게임 계속할건지 판별하는 checkSuccess() 메소드
class Player {
	String name;
	String word;
	
	public Player(String name) {
		this.name = name;
	}
	// 단어를 입력받는 메소드
	void getWordFromUser(Scanner s) {
		System.out.print(name + " >> ");
		String word = s.next();
		this.word = word;
	}
	
	// 끝말잇기 성공여부 및 게임 계속 여부 판별하는 메소드
	public boolean checkSuccess(String pre_word) {
		int lastIndex = pre_word.length() - 1;		// 이전 단어의 마지막 문자에 대한 인덱스
		char lastChar = pre_word.charAt(lastIndex);	// 이전 단어의 마지막 문자
		
		char firstChar = word.charAt(0);		// 이번 입력한 단어의 첫번째 문자
		
		// 이전 단어의 마지막 문자와 이번 단어의 첫번째 문자가 일치하면 => true를 리턴, 아니라면 => false 리턴
		if (lastChar == firstChar)
			return true;
		else
			return false;
	}
}