본문 바로가기

PROJECT/포켓몬

[토이/자바] 포켓몬 게임 만들기(5) : 로그인/회원가입

 

일단 게임을 즐기기 위해서는 선행적으로 로그인/회원가입을 할 수 있어야 한다. 로그인/회원가입을 하기 위해서는 먼저 이 모든 유저들을 정의하는 User 클래스가 필요하다.

 

User 클래스

User 클래스의 객체인 user(사용자)는 id, pw, 회원번호, 보유 포켓몬, 나의 코인, 나의 뱃지, 배틀 칭호 현황으로 이루어져있다.

public class User{
	String id;
	String pw;
	int unum;
	String my_name;
	String my_mon = null;
	int my_coin = 100;
	String my_badge = null;
	String my_title = null;
	User(){}
	User(String id, String pw, int unum, String my_name){
		this.id = id;
		this.pw = pw;
		this.unum = unum;
		this.my_name = my_name;
	}
	User(String my_name, String my_mon, int my_coin, String my_badge, String my_title){
		super();
		this.my_name = my_name;
		this.my_mon = my_mon;
		this.my_coin = my_coin;
		this.my_badge = my_badge;
		this.my_title = my_title;
	}
	public String getId(){
		return id;
	}
	public String getPw() {
		return pw;
	}
	public String getMyName() {
		return my_name;
	}
	public int getMyCoin() {
		return my_coin;
	}
	public String getMyBadge() {
		return my_badge;
	}
	public String getMyTitle() {
		return my_title;
	}
	public String toString() {
		return "ID:"+id+" PW:"+pw+" 회원번호:"+unum+", 닉네임:"+my_name;
	}
}

 

로그인

자바로 로그인을 구현할 방식 : (접근하는 user의 아이디와 비밀번호).equals(ArrayList<User>users 리스트에 저장된 users.get(i)가 참조하는 아이디와 비밀번호)

 

user가 입력한 ID와 PW의 문자열이 users 리스트에 저장된 객체 중 하나가 참조하는 ID, PW 값이 동일하다면 로그인 된 것으로 확인한다.

class Login{
	String id;
	String pw;
	String add_name;
	Login(){}
	Login(ArrayList<User>user){}
	Login(String id, String pw){
		this.id = id;
		this.pw = pw;
	}
	public User loginSuccess(ArrayList<User>users) {
		Scanner sc = new Scanner(System.in);
		System.out.println("아이디를 입력해주세요");
		System.out.println("ID : ");
		String id = sc.next();
		
		System.out.println("비밀번호를 입력해주세요");
		System.out.println("PW : ");
		String pw = sc.next();
		
		User user = null;
		for(int i=0;i<users.size();i++) {
			if(users.get(i).getId().equals(id)) {
				if(users.get(i).getPw().equals(pw)) {
					user = users.get(i);
				}
			}
		}
		return user;
	}

 

회원 가입

회원 가입 구현할 방식 : 사용자에게 Scanner를 통해 id, pw를 입력받아서 users 리스트에 저장한다. 회원 id, pw를 입력받아야 하고, 회원 번호를 가장 마지막 번호로 자동으로 지급한다. id, pw를 입력받은 후에는 닉네임을 정할 수 있는데, 마음에 들지 않으면 이전 단계로 돌아가 다시 입력을 받는다.

 

닉네임까지 모두 입력한 후에는 계정 생성이 완료되고 다시 로그인 화면으로 돌아간다. 조금 전 가입한 아이디와 비밀번호로 로그인이 가능하다.

 

public User addAccount(ArrayList<User>users) {
		Scanner sc = new Scanner(System.in);
		System.out.println("사용하실 아이디를 입력하세요");
		String id = sc.next();
		System.out.println("사용하실 비밀번호를 입력하세요");
		String pw = sc.next();
		System.out.println("사용하실 닉네임을 입력해주세요");
		String my_name = "";
		int unum = 0;
		while(true) {
			my_name = sc.next();
			System.out.println("닉네임:"+my_name+"
            정말로 이 닉네임을 사용하시겠습니까? (1:예/2:아니오)");
			int rsp = sc.nextInt();
			if(rsp==1) {
				System.out.println("생성완료");
				break;
			}else if(rsp==2) {
				System.out.println("사용하실 닉네임을 입력해주세요");
			}else {
				System.out.println("입력오류");
			}
		}
		unum = users.size()+1;
		User user = new User(id, pw, unum, my_name);
		users.add(user);
		return users.get(users.size()-1);
	}
}

 

 

테스트 케이스

 - 콘솔창에 입력/출력된 테스트 케이스

 

 

텍스트만 추출

포켓몬 세계에 오신 것을 환영합니다
계정을 보유하고 계신가요? (1:예/2:아니오) 
1
아이디를 입력해주세요
ID : A
비밀번호를 입력해주세요
PW : A
입력하신 정보가 존재하지 않습니다
계정을 보유하고 계신가요? (1:예/2:아니오) 
2
회원가입을 시작합니다
사용하실 아이디를 입력하세요
ID : A
사용하실 비밀번호를 입력하세요
PW : A
사용하실 닉네임을 입력해주세요
닉네임 : A
닉네임:A 정말로 이 닉네임을 사용하시겠습니까? (1:예/2:아니오)
2
사용하실 닉네임을 입력해주세요
A
닉네임:A 정말로 이 닉네임을 사용하시겠습니까? (1:예/2:아니오)
1
생성완료
[ID:A PW:A 회원번호:1, 닉네임:A]
계정을 보유하고 계신가요? (1:예/2:아니오) 
1
아이디를 입력해주세요
ID : A
비밀번호를 입력해주세요
PW : A
A! 반갑네.
내 이름은 오박사. 포켓몬 트레이너들의 모험을 도와주고 있지.

 

 

아이디가 잘 등록되는 걸 확인할 수 있다. 그런데 한가지 오류가 있는데... 이 부분은 아직 어떻게 고쳐야할지 좀 생각해봐야 할 것 같다. 계정을 새로 생성하게 되면 리턴 값으로 유저의 [아이디, 패스워드, 회원번호, 닉네임]을 출력해준다. 그런데 이 기능은 유저가 2명 이상이 될때 전체 유저의 정보값을 같이 돌려준다는 오류가 있다.

 

포켓몬 세계에 오신 것을 환영합니다
계정을 보유하고 계신가요? (1:예/2:아니오) 
2
회원가입을 시작합니다
사용하실 아이디를 입력하세요
ID : A
사용하실 비밀번호를 입력하세요
PW : A
사용하실 닉네임을 입력해주세요
닉네임 : A
닉네임:A 정말로 이 닉네임을 사용하시겠습니까? (1:예/2:아니오)
1
생성완료
[ID:A PW:A 회원번호:1, 닉네임:A]
계정을 보유하고 계신가요? (1:예/2:아니오) 
2
회원가입을 시작합니다
사용하실 아이디를 입력하세요
ID : B
사용하실 비밀번호를 입력하세요
PW : B
사용하실 닉네임을 입력해주세요
닉네임 : B
닉네임:B 정말로 이 닉네임을 사용하시겠습니까? (1:예/2:아니오)
1
생성완료
[ID:A PW:A 회원번호:1, 닉네임:A, ID:B PW:B 회원번호:2, 닉네임:B]

 

이렇게... 회원 B를 등록했음에도 회원 A의 정보까지 같이 되돌아온다. 

		User user = new User(id, pw, unum, my_name);
		users.add(user);
		return users.get(users.size()-1);

 

users 리스트에서 users.size()-1 인덱스값을 가져오면 마지막에 추가된 계정만 보일거라고 생각했는데... 왜 이렇게 다같이 출력이 되는지 생각을 해봐야겠다.