java 공부 - 명품 JAVA 프로그래밍 4장 Open Challenge

2022. 3. 17. 11:08JAVA

728x90

문제 : n명이 참가하는 끝말잇기 게임을 프로그램을 만들어보기. 처음 단어는 '오징어'이고, n명의 참가자들이 수서대로 자신의 단어를 입력하면 된다. 끝말잇기에서 틀린 경우 게임을 끝내고 틀린 참가자를 화면에 출력한다.

class Player {
	String name;
	public String getWordfromUser() {
		Scanner scan = new Scanner(System.in);
		String word = scan.nextLine();
		return word;
	}
	
	public boolean checkSuccess(String w1,String w2) { // 처음,다음거
		String word1 = w1;
		String word2 = w2;
		int lastIndex = word1.length()-1;
		char lastChar = word1.charAt(lastIndex);
		char fistChar = word2.charAt(0);
		if(lastChar == fistChar) {
			return true;
		}else {
			return false;
		}
	}
}
public class WordGameApp {
	static Scanner scan = new Scanner(System.in);
	
	public static void run(int playersu) {
		System.out.println("참가자의 이름을 입력하세요: ");
		Player[] player = new Player[playersu];
		for(int i=0;i<player.length;i++) {
			player[i] = new Player();
			player[i].name = scan.nextLine(); // 참가자들 이름 입력
		}
		System.out.println("시작하는 단어는 오징어 입니다.");
		
		System.out.println(player[0].name + ">>");
		String word = player[0].getWordfromUser();
		if(player[0].checkSuccess("오징어",word)) {
			int j=0;
			while(true) {
				int i;
				j++;
				i = j % playersu;
				System.out.println(player[i].name + ">>");
				String word2 = player[i].getWordfromUser();
				if(player[i].checkSuccess(word,word2)) {
					word = word2;
				}else {
					System.out.println(player[i].name + "님 탈락");
					return;
				}	
			}
		}else {
			System.out.println(player[0].name + "님 탈락");
		}
		
	}
	
	public static void main (String[] args) {
		
		System.out.println("끝말잇기 게임을 시작합니다.");
		System.out.println("게임에 참가하는 인원이 몇 명입니까?");
		Scanner scan = new Scanner(System.in);
		int playersu = scan.nextInt();
		run(playersu);
	}

}

일단 main메소드의 Scanner scan = new Scanner(System.in)는 없어도 된다.

WordGameApp class의 필드에 Scanner scan = new Scanner(System.in)가 있기 때문이다.

여기서 main함수의 Scanner scan = new Scanner(System.in)만 지우면 안 된다.

player[i].name = scan.nextLine()을 scan.next()로 바꿔야한다.

왜냐하면 main 메소드에서 playersu를 scan.nextInt() 로 받을 때 enter키가 scan 값에 남아있다.

따라서, scan에 있는 enter 값을 없애주던가 아니면 scan.nextInt()함수를 사용해야한다.

 

 

내 코드를 보고 내가 한 피드백 : 일단 코드가 너무 지저분하고, 무작정 코딩하려하지말고 구상을 하고 코드를 작성하는 게 좋을 것 같다. 

가장 문제가 되는 부분은 run() 메소드부분(시작 단어는 오징어 입니다. 이후부터)인데 이 부분을 수정해야한다.

 

package game;

import java.util.Scanner;

class Player {
	String name;
	
	public String getWordfromUser() {
		Scanner scan = new Scanner(System.in);
		String word = scan.nextLine();
		return word;
	}
	
	public boolean checkSuccess(String w1,String w2) {// 오징어(처음) -> 어묵(다음)
		String word1 = w1;
		String word2 = w2;
		int lastIndex = word1.length()-1;
		char lastChar = word1.charAt(lastIndex);
		char fistChar = word2.charAt(0);
		if(lastChar == fistChar) {
			return true;
		}else {
			return false;
		}
	}
}

public class WordGameApp {
	static Scanner scan = new Scanner(System.in);
	
	public static void run(int playersu) {
		String lastWord;
		String inputWord;
		System.out.println("참가자의 이름을 입력하세요: ");
		Player[] player = new Player[playersu];
		for(int i=0;i<player.length;i++) {
			player[i] = new Player();
			player[i].name = scan.next(); // 참가자들 이름 입력
		}
		System.out.println("시작하는 단어는 오징어 입니다.");
		
		lastWord = "오징어";
		while(true){
			for(int i=0; i<playersu ; i++) {
				System.out.println(player[i].name + ">>");
				inputWord = player[i].getWordfromUser();
				if(player[i].checkSuccess(lastWord,inputWord)) {
					lastWord = inputWord;
				}else {
					System.out.println(player[i].name + "님 탈락");
					System.exit(0);
				}
				
			}
		}
		
	}
	
	public static void main (String[] args) {
		
		System.out.println("끝말잇기 게임을 시작합니다.");
		System.out.println("게임에 참가하는 인원이 몇 명입니까?");
		int playersu = scan.nextInt();
		run(playersu);
	}

}

lastWord라는 변수와 while - for - if 순으로 구조를 만드니 더 간단하게 코드가 완성됬다.

 

얻었던 점: 구조를 그리고 코드를 작성하자!

 

이상입니다.

 

나중에 제대로된 끝말잇기 게임 만들어보기! 일단 명품 자바 끝내고..

추가해야할 것: 

시간제한 + 실제로 존재하는 단어인 지 확인 + 'ㄹ' -> 'ㅇ'로 바꾸기 !

728x90