본문 바로가기

Programming/Java

명품 java programming open challenging : 끝말잇기 게임 만들기

반응형

n명이 참가하는 끝말잇기 게임 프로그램을 만들겠다. 


1) 프로그램에서 설정한 처음 단어는 '아버지' 이다. 

2) 참가자들은 순서대로 자신의 단어를 입력한다. 

3) 끝말잇기에서 끝말이 틀린 경우 게임을 끝내고 게임에서 진 참가자를 화면에 출력한다. 

4) main을 품은 WordGameApp 클래스와 Player 클래스로 구현한다. Player 클래스는 게임 참가자의 이름 필드와 사용자로부터 단어를 입력받는 메소드, 끝말잇기에 성공하였는지, 게임을 계속하는지를 판별하는 메소드를 담는다. 

5) main 메소드에서 Player [] 배열을 생성한다. 

6) 쉬운 코드를 지향한다. 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.util.Scanner;
 
class Player{
    Scanner inputword = new Scanner(System.in);
    public String name; // 게임 참가자 이름 필드
    public String wordin;
    
    
    public String sayWord() { // 사용자로부터 단어를 입력받는 메소드
        wordin = inputword.next(); 
        return wordin;
    }
    
    public boolean succeed(char lastChar) { 
        if (lastChar == wordin.charAt(0)) return true;
        else return false;
    }
}
 
 
public class WordGameApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String word = "아버지"; //프로그램에서 첫 단어 설정해주기
        
        System.out.println("게임에 참가하는 인원은 몇명입니까? >> ");
        int number = scanner.nextInt();
        
        Player[] play = new Player[number];
        
        for(int i=0; i<number; i++) {
            System.out.println("참가자의 이름을 입력하세요 >> ");
            play[i] = new Player(); // 이 코드 없으면 Nullpointexception
            play[i].name = scanner.next();
            //입력받은 이름을 Player 배열의 이름 필드에 각각 저장하는 코드
        }
        System.out.println("시작하는 단어는 아버지입니다.");
        
        int i = 0, j = 0;
        while(true) {
            j = i % number; //끝말잇기가 한 텀에 끝나지 않을 수도 있음
            int lastIndex = word.length()-1//마지막 문자에 대한 인덱스
            char lastChar = word.charAt(lastIndex); //마지막 문자
            
            System.out.println(play[j].name + " >> ");
            play[j].sayWord(); // 사용자의 단어 입력 받기
            boolean continuing = play[j].succeed(lastChar);
            if(continuing == false) {
                System.out.println(play[j].name + "이 졌습니다.");
                break;
            }
            word = play[j].wordin;
            i++;
        }
    }
 
}
cs


코드를 실행시키면 콘솔창에서 다음과 같은 출력과 입력을 실행할 수 있다. 





클래스 배열 선언에 관한 nullpointexception error

처음 빌드를 했을 때 nullpointexception 에러가 났다. 처음에는 Player[] play = new Player[number]; 로 배열 공간 할당만 해주고 play[i] = new Player(); 코드를 정의해주지 않았었다.  

Player[] play = new Player[number]; 만 선언 했을 때 play[0]의 필드를 출력하고자 하면, 이 배열 안에는 null값만 존재하기 때문에 nullpointexception 에러가 날 수 밖에 없다. 참고로, System.out.println( play[0] ) 은 null 값을 출력하지만, System.out.println( play ) 는 주소값을 출력한다. play 자체에는 올바르게 객체 할당이 된 것이다. 


play[i] = new Player(); 코드가 있어야만 배열 안에 Player 타입의 객체가 들어간다. 

이렇게 두 번에 걸쳐 선언을 해주어야만 System.out.println( play[0].name ) 과 같은 코드가 올바른 값을 출력해 줄 수 있다. 


---------------------------------------------------

< 클래스 배열 선언 >

Player[] play = new Player[number];

play[i] = new Player();


---------------------------------------------------

반응형