Up Down Game (23.05.10)

·2023년 5월 11일
0

Coding Test

목록 보기
14/39
post-thumbnail

(1) 내 풀이

기본 기능은 모두 완성하였고 프로그램이 정상 작동하나, 예외 처리 부분이 미흡함

  • Member 클래스
package kh.edu.updown.model.vo;

public class Member {
	private String memberId; // 아이디
	private String memberPw; // 비밀번호
	private String memberName; // 이름
	private int highScore; // 최고 점수
	
	// 생성자
	public Member() { }

	
	public Member(String memberId, String memberPw, String memberName) {
		super();
		this.memberId = memberId;
		this.memberPw = memberPw;
		this.memberName = memberName;
	}

	public Member(String memberId, String memberPw, String memberName, int highScore) {
		super();
		this.memberId = memberId;
		this.memberPw = memberPw;
		this.memberName = memberName;
		this.highScore = highScore;
	}
	
	// getter / setter
	public String getMemberId() {
		return memberId;
	}

	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}

	public String getMemberPw() {
		return memberPw;
	}

	public void setMemberPw(String memberPw) {
		this.memberPw = memberPw;
	}

	public String getMemberName() {
		return memberName;
	}

	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}

	public int getHighScore() {
		return highScore;
	}

	public void setHighScore(int highScore) {
		this.highScore = highScore;
	}

	@Override
	public String toString() {
		return "Member [memberId=" + memberId + ", memberPw=" + memberPw + ", memberName=" + memberName + ", highScore=" + highScore
				+ "]";
	}

}
  • MainService 클래스
package kh.edu.updown.model.service;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

import kh.edu.updown.model.vo.Member;

public class MainService {

	private Scanner sc = new Scanner(System.in);
	
	// 회원 가입된 회원의 정보를 저장할 배열 선언 및 할당
	private Member[] members = new Member[3];  
	
	private int memberCount = 0; // 현재 가입한 회원 수 (회원 가입 시 members 인덱스 지정에 사용 가능)
	
	// 현재 로그인한 회원의 정보를 참조할 변수 선언.
	private Member loginMember = null; // 로그인 X == null,  로그인 O != null
	
	// LoginService 생성
	// -> 로그인 시 이용할 수 있는 기능만을 모아둔 객체
	private LoginService loginService = new LoginService();
	
	
	
	// 메뉴 출력 메소드
	// * 메뉴 출력 메소드를 분석해보세요!
	public void displayMenu() {

		int sel = 0; // 메뉴 선택용 변수
		
		do { // 무조건 한 번은 수행
			try {
				
				System.out.println();
				System.out.println("=== UP/DOWN 게임 ===");
				
				
				if(loginMember == null) { // 로그인이 되어있지 않은 경우
				
					System.out.println("[메인 메뉴]");
					System.out.println("1. 회원가입");
					System.out.println("2. 로그인");
					System.out.println("0. 종료");
					System.out.print("메뉴 선택 >> ");
					
					sel = sc.nextInt();
					sc.nextLine(); // 입력 버퍼 개행문자 제거
					System.out.println(); // 줄바꿈
					
					switch(sel) {
					case 1 : signUp(); break;
					case 2 : login(); break;
					case 0 : System.out.println("[프로그램 종료]"); break;
					default : System.out.println("잘못 입력하셨습니다. 메뉴를 다시 선택해주세요.");
					}
					
				
				}else { // 로그인이 되어있는 경우
					
					System.out.println("[로그인 메뉴]");
					System.out.println("1. 업/다운 게임 start");
					System.out.println("2. 내 정보 조회");
					System.out.println("3. 전체 회원 조회");
					System.out.println("4. 비밀번호 변경");
					System.out.println("9. 로그아웃");
					System.out.println("메뉴 선택 >> ");
					
					sel = sc.nextInt();
					sc.nextLine();
					System.out.println();
					
					
					// 선택된 메뉴 번호에 따라 LoginService에서 알맞은 기능을 호출
					switch (sel) {
					case 1: loginService.startGame(loginMember); break;
					case 2: loginService.selectMyInfo(loginMember); break;
					case 3: loginService.selectAllMember(members); break;
					case 4: loginService.updatePassword(loginMember); break;
					
					case 9 : System.out.println("[로그아웃 되었습니다.]"); 
							 loginMember = null; // loginMember 필드에 아무것도 참조하고 있지 않음을 의미하는 null을 대입
							 break;
					
					default: System.out.println("잘못 입력하셨습니다. 메뉴를 다시 선택해주세요.");
					}
					
				}
				
			}catch (InputMismatchException e) {
				System.out.println("정수만 입력해주세요.");
				sc.nextLine(); // 버퍼에 남아있는 문자열 제거
			}
		}while(sel != 0);
		
	}
	
	// [회원 가입]
	/**
	 * 회원 가입
	 */
	public void signUp() { 

		System.out.println("[회원 가입]");

		// 아이디, 비밀번호, 이름을 입력 받고
		System.out.print("아이디 입력 : ");
		String inputId = sc.nextLine();
		
		System.out.print("비밀번호 입력 : ");
		String inputPw = sc.nextLine();
		
		System.out.print("이름 입력 : ");
		String inputName = sc.nextLine();		
		
		boolean flag = true;
		
		for(Member member : members) {
			// 단, 이미 중복되는 아이디가 존재하는 경우 가입 불가
			if(member != null && member.getMemberId().equals(inputId)) {
				System.out.println("[회원 가입 불가] 이미 존재하는 아이디입니다.");
				flag = false;
			}
		}
			
		if(flag) {
			System.out.println("회원 가입이 완료되었습니다.");

			// Member객체를 생성하여 members 리스트에 추가
			members[memberCount] = new Member(inputId, inputPw, inputName);
			memberCount++;
		}
	} 
	
	
	// [로그인]
	/**
	 * 로그인
	 */
	public void login() {
		
		System.out.println("[로그인]");
		
		// 아이디, 비밀번호를 입력 받아
		System.out.print("아이디 : ");
		String inputId = sc.nextLine();

		System.out.print("비밀번호 : ");
		String inputPw = sc.nextLine();
		
		boolean flag = true;
		
		// 일치하는 회원이 members에 있을 경우 로그인
		for(Member member : members) {
			if(member.getMemberId().equals(inputId) && member.getMemberPw().equals(inputPw)) {
				System.out.println(member.getMemberName() + "님 환영합니다.");
				loginMember = member;
				flag = false;
				break;
			}
			
			if(flag) {
				// 없으면 "아이디 또는 비밀번호가 일치하지 않습니다." 출력
				System.out.println("아이디 또는 비밀번호가 일치하지 않습니다.");
			}
		}
		
	}

}
  • LoginService 클래스
package kh.edu.updown.model.service;

import java.util.List;
import java.util.Scanner;

import kh.edu.updown.model.vo.Member;

public class LoginService {
	
	private Scanner sc = new Scanner(System.in);

	public void startGame(Member loginMember) {
		
		// 업다운 게임 시작
		System.out.println("[Game Start...]");
		
		int count = 0;
		
		// 1 ~ 100 사이 숫자 중 랜덤하게 한 숫자를 지정하고 업/다운 게임을 진행
		int random = (int)(Math.random()*100 + 1);
		
		while(true) {

			System.out.print((count+1) + "번째 입력 : ");
			int input = sc.nextInt();
			sc.nextLine();
			
			count++;
			
			if(input > random) {
				System.out.println("-- DOWN --");
				continue;
				
			} else if(input < random) {
				System.out.println("-- UP --");
				continue;
				
			} else if(input == random) {
				System.out.println("정답!!");
				System.out.println("입력 시도 횟수 : " + count);
				
				// 맞춘 횟수가 현재 로그인한 회원의 최초 또는 최고 기록인 경우 회원의 highScore 필드 값을 변경
				if(count < loginMember.getHighScore()) {
					System.out.println("*** 최고 기록 달성 ***");
					loginMember.setHighScore(count);
				}
				
				break;
			}
			
		}
		
	}

	
	// 내 정보 조회
	// 로그인한 멤버의 정보 중 비밀번호를 제외한 나머지 정보만 화면에 출력
	public void selectMyInfo(Member loginMember) {
		
		System.out.println("[내 정보 조회]");
		
		System.out.println("아이디 : " + loginMember.getMemberId());
		System.out.println("이름 : " + loginMember.getMemberName());
		System.out.println("최고 점수 : " + loginMember.getHighScore());
	}

	// 전체 회원 조회
	// 전체 회원의 아이디, 이름, 최고점수를 출럭
	public void selectAllMember(Member[] members) {
		
		System.out.println("[전체 회원 조회]");
		
		int index = 0;
		
		if(members[0] == null) {
			System.out.println("회원 정보가 없습니다.");
			return;
		}
		
		for(Member member : members) {
			if(member != null) {
				System.out.println("[" + (index++) + "번]");
				System.out.println("아이디 : " + member.getMemberId());
				System.out.println("이름 : " + member.getMemberName());
				System.out.println("최고 점수 : " + member.getHighScore());
			}
		}
		
	}

	// 비밀번호 변경
	// 현재 비밀번호를 입력 받아 
	// 같은 경우에만 새 비밀번호를 입력 받아 비밀번호 변경
	public void updatePassword(Member loginMember) {
		
		System.out.println("[비밀번호 변경]");
		
		System.out.print("비밀번호 입력 : ");
		String inputPw = sc.nextLine();
		
		if(loginMember.getMemberPw().equals(inputPw)) {
			System.out.print("새로운 비밀번호 입력 : ");
			String newPw = sc.nextLine();
			
			loginMember.setMemberPw(newPw);
			
			System.out.println("비밀번호 변경이 완료되었습니다.");
		}
		
	}
	
}
  • UpDownRun 클래스
package kh.edu.updown.run;

import kh.edu.updown.model.service.MainService;

public class UpDownRun {
	public static void main(String[] args) {
		
		MainService service = new MainService();
		service.displayMenu();
	}
}

(2) 다른 풀이

  • MainService 클래스
package kh.edu.updown.model.service;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

import kh.edu.updown.model.vo.Member;

public class MainService {

	private Scanner sc = new Scanner(System.in);
	
	// 회원 가입된 회원의 정보를 저장할 배열 선언 및 할당
	private Member[] members = new Member[3];  
	
	private int memberCount = 0; // 현재 가입한 회원 수 (회원 가입 시 members 인덱스 지정에 사용 가능)
	
	// 현재 로그인한 회원의 정보를 참조할 변수 선언.
	private Member loginMember = null; // 로그인 X == null,  로그인 O != null
	
	// LoginService 생성
	// -> 로그인 시 이용할 수 있는 기능만을 모아둔 객체
	private LoginService loginService = new LoginService();
	
	
	
	// 메뉴 출력 메소드
	// * 메뉴 출력 메소드를 분석해보세요!
	public void displayMenu() {

		int sel = 0; // 메뉴 선택용 변수
		
		do {
			try {
				
				System.out.println();
				System.out.println("=== UP/DOWN 게임 ===");
				
				
				if(loginMember == null) { // 로그인이 되어있지 않은 경우
				
					System.out.println("[메인 메뉴]");
					System.out.println("1. 회원가입");
					System.out.println("2. 로그인");
					System.out.println("0. 종료");
					System.out.print("메뉴 선택 >> ");
					
					sel = sc.nextInt();
					sc.nextLine(); // 입력 버퍼 개행문자 제거
					System.out.println(); // 줄바꿈
					
					switch(sel) {
					case 1 : signUp(); break;
					case 2 : login(); break;
					case 0 : System.out.println("[프로그램 종료]"); break;
					default : System.out.println("잘못 입력하셨습니다. 메뉴를 다시 선택해주세요.");
					}
					
				
				}else { // 로그인이 되어있는 경우
					
					System.out.println("[로그인 메뉴]");
					System.out.println("1. 업/다운 게임 start");
					System.out.println("2. 내 정보 조회");
					System.out.println("3. 전체 회원 조회");
					System.out.println("4. 비밀번호 변경");
					System.out.println("9. 로그아웃");
					System.out.println("메뉴 선택 >> ");
					
					sel = sc.nextInt();
					sc.nextLine();
					System.out.println();
					
					
					// 선택된 메뉴 번호에 따라 LoginService에서 알맞은 기능을 호출
					switch (sel) {
					case 1: loginService.startGame(loginMember); break;
					case 2: loginService.selectMyInfo(loginMember); break;
					case 3: loginService.selectAllMember(members); break;
					case 4: loginService.updatePassword(loginMember); break;
					
					case 9 : System.out.println("[로그아웃 되었습니다.]"); 
							 loginMember = null; // loginMember 필드에 아무것도 참조하고 있지 않음을 의미하는 null을 대입
							 break;
					
					default: System.out.println("잘못 입력하셨습니다. 메뉴를 다시 선택해주세요.");
					}
					
				}
				
			}catch (InputMismatchException e) {
				System.out.println("정수만 입력해주세요.");
				sc.nextLine(); // 버퍼에 남아있는 문자열 제거
			}
		}while(sel != 0);
		
	}
	
	// [회원 가입]
	// 아이디, 비밀번호, 이름을 입력 받고
	// Member객체를 생성하여 members 리스트에 추가
	// 단, 이미 중복되는 아이디가 존재하는 경우 가입 불가
	public void signUp() { 
		
		System.out.println("[회원 가입]");
		
		// memberCount가 members 배열 길이 이상인 경우 == 회원 가입 정원이 다 찬 상태
		if(memberCount >= members.length) {
			System.out.println("회원 정원이 가득 차서 더 이상 가입을 할 수 없습니다.");
		
		} else { // 회원 가입이 가능한 경우
			
			String memberId = null; // 아이디를 입력 받아 저장할 변수
			
			while(true) {
				System.out.print("아이디 : ");
				memberId = sc.next();
				
				boolean flag = true; // 중복 아이디 체크용 변수

				for(int i=0; i<members.length; i++) {
					if(members[i] != null) { // members 배열 요소가 null이 아닌 경우 == 회원 정보가 있는 경우
						
						// 입력 받은 아이디와 같은 아이디가 members에 존재하는 경우
						if(memberId.equals(members[i].getMemberId())) {
							System.out.println("중복되는 아이디입니다. 다시 입력해 주세요.");
							
							flag = false;
							break; // 중복 검사 for문 종료
						}
						
					} else { // members 배열 요소가 null인 경우 == 회원 정보가 없는 경우
						break; // 중복 검사 for문 종료
						
					}
				} // end for
				
				if(flag) { // 중복 아이디가 아닌 경우
					break; // 아이디를 반복적으로 입력 받은 while문 종료
				
				}
			} // end while
			
			System.out.print("비밀번호 : ");
			String memberPw = sc.next();
			
			System.out.print("이름 : ");
			String memberName = sc.next();
			
			// 입력 받은 값을 이용해 새로운 Member 객체를 생성하고 members 배열의 요소 중
			// memberCount번째 요소가 참조할 수 있도록 주소를 저장
			members[memberCount] = new Member(memberId, memberPw, memberName);
			
			// 새로운 회원이 가입되었으므로 memberCount를 1 증가
			memberCount++;
			
			System.out.println("***** 회원 가입이 완료되었습니다. *****");
			
		} // end else (회원 가입이 가능한 경우)
		
	} // end signUp()
	
	
	// [로그인]
	// 아이디, 비밀번호를 입력 받아 일치하는 회원이 members에 있을 경우 로그인
	// 없으면 "아이디 또는 비밀번호가 일치하지 않습니다." 출력
	public void login() {
		
		System.out.println("[로그인]");
		
		System.out.print("아이디 : ");
		String inputId = sc.next();
		
		System.out.print("비밀번호 : ");
		String inputPw = sc.next();
		
		for(int i=0; i<members.length; i++) {
			
			if(members[i] != null) { // members 배열 요소가 null이 아닌 경우 == 회원 정보가 있는 경우
				
				// members 배열 요소 중 입력 받은 아이디, 비밀번호가 일치하는 회원이 있을 경우
				if(members[i].getMemberId().equals(inputId) && members[i].getMemberPw().equals(inputPw)) {
					
					System.out.println(members[i].getMemberName() + " 님 환영합니다.");
					
					loginMember = members[i]; // loginMember 필드에 일치하는 회원 객체의 주소를 얕은 복사
				}
				
			} else { // members 배열 요소가 null인 경우 == 회원 정보가 없는 경우
				break;
			}
		} // end for
		
		// 아이디, 비밀번호를 비교한 후에도 loginMember 필드가 null인 경우 == 로그인 실패
		if(loginMember == null) {
			System.out.println("아이디 또는 비밀번호가 일치하지 않습니다.");
		}
		
	} // end login()

}
  • LoginService 클래스
package kh.edu.updown.model.service;

import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

import kh.edu.updown.model.vo.Member;

public class LoginService {
	
	private Scanner sc = new Scanner(System.in);

	// 업다운 게임 시작
	// 1 ~ 100 사이 숫자 중 랜덤하게 한 숫자를 지정하고 업/다운 게임을 진행
	// 맞춘 횟수가 현재 로그인한 회원의 최초 또는 최고 기록인 경우 회원의 highScore 필드 값을 변경
	public void startGame(Member loginMember) {
		
		System.out.println("[Game Start...]");
		
		// 1 ~ 100 사이 난수 발생
		int random = (int)(Math.random()*100 + 1);
		
		int count = 0; // 입력 시도 횟수 카운트
		
		try {
			
			while(true) {
				
				count++; // while문이 반복될 때마다 count를 1씩 증가시킴
				
				System.out.print(count + "번째 입력 : ");
				int input = sc.nextInt();
				sc.nextLine();
				
				if(random == input) { // 입력된 값이 발생한 난수와 같다면
					System.out.println("정답!!");
					System.out.println("입력 시도 횟수 : " + count);
					
					// 입력 시도 횟수가 최초 또는 최고 기록인 경우
					if(loginMember.getHighScore() == 0 || loginMember.getHighScore() > count ) {
						System.out.println("***** 최고 기록 달성 *****");
						
						// 매개변수로 전달 받은 loginMember의 highScore 필드에 시도 횟수 저장
						loginMember.setHighScore(count);
					}
					break; // while문 종료
				
				} else { // 입력된 값이 발생한 난수와 같지 않다면
					if(random < input) {
						System.out.println("-- DOWN --");
					} else {
						System.out.println("-- UP --");
					}
				}
				
			}
			
		} catch(InputMismatchException e) {
			System.out.println("1~100 사이 정수만 입력해 주세요.");
			sc.nextLine();
		}
		
	}

	
	// 내 정보 조회
	// 로그인한 멤버의 정보 중 비밀번호를 제외한 나머지 정보만 화면에 출력
	public void selectMyInfo(Member loginMember) {
		
		System.out.println("[내 정보 조회]");
		
	    System.out.println("아이디 : " + loginMember.getMemberId());
	    System.out.println("이름 : " + loginMember.getMemberName());
	    System.out.println("최고점수 : " + loginMember.getHighScore() + "회");
	}

	// 전체 회원 조회
	// 전체 회원의 아이디, 이름, 최고점수를 출럭
	public void selectAllMember(Member[] members) {
		
		System.out.println("[전체 회원 조회]");
		
		System.out.printf("%6s %6s %7s\n", "[아이디]", "[이름]", "[최고 점수]");
		for(int i=0; i<members.length; i++) {
			
			if(members[i] != null) { // members 배열 요소에 저장된 회원 정보가 있는 경우
				System.out.printf("%7s %6s %6d\n", members[i].getMemberId(), members[i].getMemberName(),
									members[i].getHighScore());
			}
			
		}
		
	}

	// 비밀번호 변경
	// 현재 비밀번호를 입력 받아 
	// 같은 경우에만 새 비밀번호를 입력 받아 비밀번호 변경
	public void updatePassword(Member loginMember) {
		
		System.out.println("[비밀번호 변경]");
		
		System.out.print("현재 비밀번호 입력 : ");
		String currentPw = sc.next();
		
		if(currentPw.equals(loginMember.getMemberPw())) {
			System.out.print("새 비밀번호 : ");
			String newPw = sc.next();
			
			loginMember.setMemberPw(newPw);
			System.out.println("비밀번호가 변경되었습니다.");
	
		} else {
			System.out.println("현재 비밀번호가 일치하지 않습니다.");
		}
	}
}
profile
풀스택 개발자 기록집 📁

0개의 댓글