본문 바로가기
JAVA

클래스와 객체 활용 예제

by KWONE 2024. 8. 16.

끝말잇기 게임

N명이 참가하는 끝말잇기 게임을 만들어보자. 처음 단어는 "아버지"이다. N명의 참가자들은 순서대로 자신의 단어를 입력하면 된다. 끝말잇기에서 끝말이 틀린 경우 게임을 끝내고 게임에서 진 참가자를 화면에 출력한다. 프로그램에서는 시간 지연을 구현하지 않아도 된다. 그렇지만 참가자들이 스스로 시간을 재어 보는것도 좋겠다. 이 문제의 핵심은 여러 개의 객체와 배열 사용을 연습하기 위한 것으로, main()을 포함하는 WordGameApp 클래스와 각 선수를 나타내는 Player 클래스를 작성하고, 실행 중에는 WordGameApp 객체 하나와 선수 숫자만큼의 Player 객체를 생성하는데 있다.


class Player {
	Player(int num){
		
	}
	public void getWordFromUser() {
		
	}
}




public class WordGameApp {
	public void run(int num) {
		Player player=new Player(num);
	}
	
	public void checkSuccess() {
		
	}
	
	public static void main(String[] args) {
		
	}
}

1. 필요한 기능들 메소드 만들기

import java.util.Scanner;


class Player {
	String name;
	
	Player(){
		
	}
	public String getNameFromUser() {
		Scanner scanner=new Scanner(System.in);
		this.name=scanner.nextLine();
		return this.name;
	}
	public void getWordFromUser() {
		Scanner scanner=new Scanner(System.in);
		@SuppressWarnings("unused")
		String word=scanner.nextLine();
	}
}


public class WordGameApp {
	public static void run(int num) {
		Player player[]=new Player[num];
		for(int i=0;i<num;i++) {
			player[i]=new Player();
		}
		for(int i=0;i<num;i++) {
			System.out.print("참가자의 이름을 입력하세요>>");
			player[i].name=player[i].getNameFromUser();
		}
	}
	public static void startGame() {
		System.out.println("끝말잇기 게임을 시작합니다...");
	}

	public static boolean checkSuccess() {
		
		
		return true;
	}
	
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int num;
		startGame();
		System.out.print("게임에 참가하는 인원은 몇명입니까>>");
		num=scanner.nextInt();
		run(num);
		System.out.println("시작하는 단어는 아버지 입니다.");
		while(true) {
			
			
			if(!checkSuccess()) {
				break;
			}
		}
		
		
	}
}

2.객체 배열 생성 및 메소드 작성

import java.util.Scanner;
class Player {
	String name;
	public String getNameFromUser() {
		Scanner scanner=new Scanner(System.in);
		this.name=scanner.nextLine();
		return this.name;
	}
	public String getWordFromUser() {
		Scanner scanner=new Scanner(System.in);
		String Word=scanner.nextLine();
		return Word;
	}
}

public class WordGameApp {
	public static void run(int num) {
		Player player[]=new Player[num];
		for(int i=0;i<num;i++) {
			player[i]=new Player();
		}
		for(int i=0;i<num;i++) {
			System.out.print("참가자의 이름을 입력하세요>>");
			player[i].name=player[i].getNameFromUser();
		}
		System.out.println("시작하는 단어는 아버지 입니다.");
		String userInput1="아버지";
		while(true) {
			for(int i=0;i<num;i++) {
				System.out.printf("%s>>",player[i].name);
				String userInput2=player[i].getWordFromUser();
				if(!checkSuccess(userInput1,userInput2)) {
					System.out.printf("%s이 졌습니다.",player[i].name);
					return ;
				}
				userInput1=userInput2;
			}
		}
	}
	public static void startGame() {
		System.out.println("끝말잇기 게임을 시작합니다...");
	}

	public static boolean checkSuccess(String Word,String Word2) {
		
		int lastIndex=Word.length()-1;
		char lastChar=Word.charAt(lastIndex);
		char firstChar=Word2.charAt(0);
		if(lastChar==firstChar) {
			return true;
		}
		else {
			return false;
		}
	}
	
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int num;
		startGame();
		System.out.print("게임에 참가하는 인원은 몇명입니까>>");
		num=scanner.nextInt();
		run(num);
		scanner.close();
	}
}

3.구현

 


일단 출력 예시와 같도록 코드를 만들어보았지만, 나중에 객체지향언어에 더 익숙해지고 난 뒤에 다시한번 이 코드가 엉망인지를 살펴봐야겠음. 우선적으로 scanner 여러개 만든것이랑 난잡하게 엮인 구조와 캡슐화와 메인함수가 포함되어있던 클래스의 메소드 작성에 대해서도 수정해보고, 마지막으로 기능적으로 한사람당 제한시간을 두어 그 시간안에 입력할 수 있도록 하고 입력하지 못한다면 게임에서 패배하는 조건을 추가해보고싶다. 우선은 여기서 마친다. 후에 공부를 더하고 확인해 볼것.

 

import java.util.Scanner;

class Player {
    String name;  // 이름을 저장하는 변수
    private Scanner scanner = new Scanner(System.in);  // Scanner 객체를 필드로 재사용

    // 사용자로부터 이름을 입력받는 메서드
    public String getNameFromUser() {
        System.out.print("참가자의 이름을 입력하세요>>");  // 사용자 입력 프롬프트
        this.name = scanner.nextLine();  // 이름 입력받기
        return this.name;
    }

    // 사용자로부터 단어를 입력받는 메서드
    public String getWordFromUser() {
        return scanner.nextLine();  // 단어 입력받기
    }
    
    // 이름을 반환하는 메서드 (캡슐화를 위해 추가)
    public String getName() {
        return name;
    }
}

public class WordGameApp {
    public static void run(int num) {
        Player[] player = new Player[num];
        
        // Player 객체 배열 생성 및 이름 입력 받기
        for (int i = 0; i < num; i++) {
            player[i] = new Player();
            player[i].getNameFromUser();  // 이름 입력받기
        }

        System.out.println("시작하는 단어는 '아버지'입니다.");
        String userInput1 = "아버지";  // 시작 단어

        while (true) {
            for (Player p : player) {  // 향상된 for 루프 사용
                System.out.printf("%s>>", p.getName());  // 현재 플레이어의 이름 출력
                String userInput2 = p.getWordFromUser();  // 단어 입력받기

                // 단어가 유효한지 확인
                if (!checkSuccess(userInput1, userInput2)) {
                    System.out.printf("%s이 졌습니다.\n", p.getName());  // 단어 실패 메시지
                    return;
                }

                userInput1 = userInput2;  // 이전 단어를 현재 단어로 업데이트
            }
        }
    }

    // 게임 시작 메시지 출력
    public static void startGame() {
        System.out.println("끝말잇기 게임을 시작합니다...");
    }

    // 단어가 끝말잇기 규칙을 충족하는지 확인
    public static boolean checkSuccess(String Word, String Word2) {
        if (Word2.isEmpty()) {  // 빈 문자열 입력 처리
            return false;
        }

        char lastChar = Word.charAt(Word.length() - 1);  // 이전 단어의 마지막 문자
        char firstChar = Word2.charAt(0);  // 현재 단어의 첫 문자

        return lastChar == firstChar;  // 마지막 문자와 첫 문자가 같은지 확인
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num;

        startGame();  // 게임 시작 메시지 출력

        // 참가자 수 입력받기
        System.out.print("게임에 참가하는 인원은 몇명입니까>>");
        num = scanner.nextInt();
        scanner.nextLine();  // nextInt() 호출 후 남은 개행 문자 처리

        run(num);  // 게임 실행
        scanner.close();  // Scanner 닫기
    }
}

'JAVA' 카테고리의 다른 글

상속 활용 예제  (0) 2024.08.18
Chapter 04 실습 문제  (0) 2024.08.16
@Override  (0) 2024.08.15
상속  (0) 2024.08.14
Chapter 03 실습문제  (0) 2024.08.13