끝말잇기 게임
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 |