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(); |
---------------------------------------------------
'Programming > Java' 카테고리의 다른 글
명품 java programming 실습문제 : 인터페이스(3번), 추상클래스(6번) (2) | 2018.11.20 |
---|---|
명품 java programming open challenging : 상속 관계의 클래스 작성(ProductInfo) (0) | 2018.11.18 |
명품 java programming 실습문제: 계산프로그램, 공연 예약 시스템 (1) | 2018.11.15 |
명품 java programming 실습문제 : 반복문과 배열 그리고 예외처리 (1) | 2018.09.27 |
명품 java programming open challenging : 카드 번호 맞추기 게임 (260) | 2018.09.27 |