개인/개인공부

[java/eclipse] 로그인 가위바위보

Dev.chandel 2024. 3. 12. 14:12
package LoginSystem;

import java.util.ArrayList;
import java.util.Scanner;

public class LoginSystem
{
	public class UserData
	{
		String name;
		String id;
		String pw;
		int winCount;
		int loseCount;
		int drawCount;
		int allCount;
		
		//생성자
		public UserData()
		{
			this.name="";
			this.id="";
			this.pw="";
			this.winCount=0;
			this.loseCount=0;
			this.drawCount=0;
			this.allCount=0;
		}
		
		public UserData(String _name,String _id,String _pw)
		{
			this.name=_name;
			this.id=_id;
			this.pw=_pw;
		}
		
		public UserData(String _name,String _id,String _pw,int _wc,int _lc,int _dc)
		{
			this.name=_name;
			this.id=_id;
			this.pw=_pw;
			this.winCount=_wc;
			this.loseCount=_lc;
			this.drawCount=_lc;
		}
		
		public void LoseGame()
		{
			this.loseCount+=1;
			this.allCount+=1;
		}
		
		public void WinGame()
		{
			this.winCount+=1;
			this.allCount+=1;
		}
		
		public void DrawGame()
		{
			this.drawCount+=1;
			this.allCount+=1;
		}
		
		public String GetName()
		{
			return this.name;
		}
		
		public String GetID()
		{
			return this.id;
		}
		
		public String GetPW()
		{
			return this.pw;
		}
		
		public int GetWinCount()
		{
			return this.winCount; 
		}
		
		public int GetLoseCount()
		{
			return this.loseCount;
		}
		
		public int GetDrawCount()
		{
			return this.drawCount;
		}
		
		public int GetAllCount()
		{
			return this.allCount;
		}
	}
	
	//리스트 생성
	static public ArrayList<UserData> userList=new ArrayList();
	//접속중인 사용자 고유넘버
	static public int nowUserNum=0;
	
	public boolean Start()
	{
		while(true)
		{
			//시작화면 출력
			PrintStartWin();
			
			Scanner scner=new Scanner(System.in);	//사용자에게 입력받을 때 쓰일 스캐너
			String main_select=scner.next();
			
			switch(main_select)
			{
			case "1" :
				PrintJoinWin();
				break;
			case "2" :
				if(PrintLoginWin())
					return true;
				break;
			default:
				System.out.println("==================");
				System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
				break;
			}
		}
	}
	
	//로그인 시작 화면
	public static void PrintStartWin()
	{
		System.out.println("==================");
		System.out.println("=======시작화면======");
		System.out.println("1. 회원가입");
		System.out.println("2. 로그인");
		System.out.println("==================");
		System.out.print("선택> ");
	}
	
	//회원가입 화면
	public void PrintJoinWin()
	{
		Scanner sc=new Scanner(System.in);	//사용자에게 입력받을 때 쓰일 스캐너
		String id="";
		String pw="";
		String name="";
		boolean useId=true;
		
		System.out.println("==================");
		System.out.println("======회원가입======");
		System.out.print("ID :");
		id=sc.next();
		
		for(int i=0;i<userList.size();i++)
		{
			if(userList.get(i).GetID().equals(id))
			{
				useId=false;
			}
		}
		
		while(!useId)
		{
			System.out.println("중복된 아이디입니다.");
			System.out.println("사용할 아이디를 다시 입력해주세요.");
			System.out.println("==================");
			System.out.print("ID :");
			id=sc.next();
			useId=true;
			
			for(int i=0;i<userList.size();i++)
			{
				if(userList.get(i).GetID().equals(id))
				{
					useId=false;
				}
			}
		}
		
		System.out.print("PW :");
		pw=sc.next();
		System.out.print("이름 :");
		name=sc.next();
		System.out.println("==================");
		
		UserData joinUser=new UserData(name,id,pw);	//정보 생성
		userList.add(joinUser);						//리스트에 추가
	}
	
	//로그인 화면
	private boolean PrintLoginWin()
	{
		Scanner sc=new Scanner(System.in);	//사용자에게 입력받을 때 쓰일 스캐너
		String id="";
		String pw="";
		boolean login=false;
		
		System.out.println("==================");
		System.out.println("=======로그인=======");
		System.out.print("ID :");
		id=sc.next();
		System.out.print("PW :");
		pw=sc.next();
		
		
		for(int i=0;i<userList.size();i++)
		{
			if(userList.get(i).GetID().equals(id))
			{
				if(userList.get(i).GetPW().equals(pw))
				{
					nowUserNum=i;						//현재 사용자 지정
					login=true;
				}
			}
		}

		if(login)
		{
			System.out.println("==================");
			System.out.println(userList.get(nowUserNum).GetName()+
					"님이(가) 성공적으로 로그인되었습니다.");
			return true;
		}
		else
		{
			System.out.println("==================");
			System.out.println("로그인에 실패하였습니다.");
			System.out.println("다시 시도해주세요.");
			return false;
		}
	}	
}​
package LoginSystem;

import java.util.Random;
import java.util.Scanner;

import LoginSystem.LoginSystem.UserData;


public class GameSystem
{
	//가위바위보 매핑 클래스
	enum RPS
	{
		ROCK("바위"),
		PAPER("보자기"),
		SCISSORS("가위"),
		NONE("실수");
		
		private String choice;
		
		private RPS(String choice)
		{
			this.choice=choice;
		}
		
		public String getchoice()
		{
			return choice;
		}
	}
	
	//승패 매핑 클래스
	enum OUTCOME
	{
		WIN("이겼다!!!"),
		LOSE("졌다..."),
		DRAW("비겼다!"),
		MISTACK("실수해버렸다..");
		
		private String outcome;
		
		private OUTCOME(String outcome)
		{
			this.outcome=outcome;
		}
		
		public String getOutcome()
		{
			return outcome;
		}
	}
	
	// 컴퓨터의 랜덤된 도출값을 가위바위보로 지정해주기
	private RPS GetRPS(int _com) 
	{
		switch (_com) {
		case 0:
			return RPS.ROCK;
		case 1:
			return RPS.PAPER;
		case 2:
			return RPS.SCISSORS;
		default:
			return RPS.NONE;
		}
	}
	
	//사용자의 도출값을 가위바위보로 지정해주기
	private RPS GetRPS(String _user) 
	{
		switch (_user) {
		case "바위":
		case "주먹":
		case "묵":
			return RPS.ROCK;
		case "보자기":
		case "보":
		case "빠":
			return RPS.PAPER;
		case "가위":
		case "찌":
			return RPS.SCISSORS;
		default:
			return RPS.NONE;
		}
	}
	
	//승패 검사
	private OUTCOME GetWinner(RPS _com,RPS _user,UserData _nUser)
	{
		int com=_com.ordinal();
		int user=_user.ordinal();
		
		if(user==2&&com==0)				// 사용자가 가위(2), 컴퓨터가 주먹(0)인 경우
		{
			_nUser.LoseGame();
			return OUTCOME.LOSE;
			
		}
		else if(user>=3)
		{
			return OUTCOME.MISTACK;
		}
		else
		{
			if(user>com||com==2&&user==0)//컴퓨터가 가위(2), 사용자가 주먹(0)인 경우
			{
				_nUser.WinGame();
				return OUTCOME.WIN;
			}
			else if(user<com)
			{
				_nUser.LoseGame();
				return OUTCOME.LOSE;
			}
			else
			{
				_nUser.DrawGame();
				return OUTCOME.DRAW;
			}
		}
	}
	
	//게임메인화면
	private void PrintGameMainWin()
	{
		System.out.println("1. 나의 정보");
		System.out.println("2. 게임 시작");
		System.out.println("3. 메인 화면");
	}
	
	//게임진행
	private void RunGame(UserData _nUser)
	{
		Scanner sc=new Scanner(System.in);	//사용자에게 입력받을 때 쓰일 스캐너
		boolean repeat=true;
		
		while(repeat)
		{
			System.out.println("======가위바위보!======");
			System.out.println(_nUser.GetName()+"님의 선택은..<-");
			String inputdata=sc.next();
			RPS userRps=GetRPS(inputdata);
			
			//난수 설정: 컴퓨터가 랜덤한 수를 내는 경우
			Random random = new Random();
			int com=random.nextInt(3); //0,1,2중 하나 랜덤하게 저장
			RPS comRps=GetRPS(com);
			
			//승패 확인
			OUTCOME result=GetWinner(comRps, userRps,_nUser);	
			
			
			//승패 결과 출력
			System.out.println("상대는..."+comRps.getchoice());
			System.out.println(_nUser.GetName()+"님의 선택은..."+userRps.getchoice());
			System.out.println(result.getOutcome());
			
			//재도전
			System.out.print("재도전 할까요? (Y/N) :");
			inputdata=sc.next();
			
			if(inputdata.equals("N")||inputdata.equals("n"))
			{
				repeat=false;
			}
		}
		
	}
	
	//사용자 정보 창
	private void PrintMyData(UserData _nUser)
	{
		System.out.println("==================");
		System.out.println(_nUser.GetName()+"님의 정보");
		System.out.println("==================");
		System.out.println("이름 :"+_nUser.GetName());
		System.out.println("ID :"+_nUser.GetID());
		System.out.println("PW :"+_nUser.GetPW());
		int gamecount=_nUser.GetAllCount();
		double wincount=(double)_nUser.GetWinCount();
		System.out.println("게임횟수 :"+gamecount);
		if(gamecount!=0)
		{
			if(wincount!=0)
			{
				double winrate=((wincount*100/gamecount));
				
				System.out.println("승률 :"+String.format("%.2f", winrate)+"%");
			}
			else
			{
				System.out.println("승률 : 아직 게임을 승리하지 않았습니다.");
			}
			
		}
		else
		{
			System.out.println("승률 : 아직 게임을 실행하지 않았습니다.");
		}
		System.out.println("==================");
	}
	
	public boolean Start(UserData _nowUser)
	{
		Scanner sc=new Scanner(System.in);	//사용자에게 입력받을 때 쓰일 스캐너
		boolean repeat=true;					//반복여부
		
		while(repeat)
		{
			
			System.out.println("=="+_nowUser.GetName()+"님의 게임화면==");
			PrintGameMainWin();
			String g_main_select=sc.next();
			
			switch(g_main_select)
			{
			case "1" :
				PrintMyData(_nowUser);
				break;
			case "2" :
				RunGame(_nowUser);
				break;
			case "3" :
				repeat=false;
				break;
			default:
				System.out.println("==================");
				System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
				break;
			}
		}
		
		return true;
	}
}
package LoginSystem;

public class Main {

	public static void main(String[] args)
	{
		boolean repeat=true;
		
		LoginSystem L_system=new LoginSystem();
		GameSystem G_system=new GameSystem();
		
		while(repeat)
		{
			if(L_system.Start())
			{
				if(!G_system.Start(L_system.userList.get(L_system.nowUserNum)))
					repeat=false;
			}
		}
		
	}

}