✿∘˚˳°∘°

7일차 : Random, 배열 본문

국비수업/JAVA

7일차 : Random, 배열

_HYE_ 2022. 12. 7. 22:57

2022/12/06

 

[ 1. Random ]  =====================================================================

어제 공부한 랜덤에 이어서 몇가지 프로그램을 더 작성하였다.

1 - 1 ) Baskin Robbins31 Game

   사용자와 컴퓨터가 번갈아 1~3갯수의 수를 순차적으로 출력하고 먼저 31에 도달하는쪽이 패배하는 게임 프로그램

	//배스킨라빈스31게임
	public void br() {
		Scanner sc = new Scanner(System.in);
		Random r = new Random();
		boolean bool = true;
		int win = 0; //승리체크용 - while외부에선언(내부에 선언하면 계속 초기화되므로)
		int lose = 0; //패배체크용
		
		while (bool) {
			System.out.println("===== Baskin Robbins31 Game =====");
			System.out.println("1. Game Start");
			System.out.println("2. Game Score");
			System.out.println("3. End Game");
			System.out.print("선택 > ");
			int sel = sc.nextInt();


			switch (sel) {
			case 1:
				System.out.println("<< Game Start >>");

				int count = 0;

				while (true) {
					System.out.println("<< Your Turn >>");
					int userNum = 0;

					while (true) {
						System.out.print("Input Number : ");
						userNum = sc.nextInt();
						if (userNum < 1 || userNum > 3) {
							System.out.println("1~3사이값을 입력해주세요");
						} else {
							break;
						}
					}//유저입력값을 1~3사이의 값만 받기위한 반복문
					 //1~3사이가 아니면 계속 반복하게되고, 조건을 충족하면 break를 통해 반복문을 나오게된다.
					for (int i = 0; i < userNum; i++) {
						count++;
						System.out.println(count + "!");
						if (count == 31) {
							System.out.println("패배!");
							lose++;
							break;// 번호출력을 나가는 break;
						}
					}
					if (count == 31) {// while(게임반복)을 나가는 break;
						System.out.println("패배 후 while나가는 if");
						break;
					}
					int comNum = r.nextInt(3) + 1;// 계속 값을 바꿔주기위해 반복문내부에 선언
					System.out.println("<< Computer Turn >>");
					for (int i = 0; i < comNum; i++) {
						count++;
						System.out.println(count + "!");
						if (count == 31) {// 31이되면 무조건 나가게된다.
							System.out.println("승리!");
							win++;
							break;// 번호출력을 나가는 break;

						}
					} // 컴퓨터턴 for문
					if (count == 31) {
						System.out.println("승리 후 while나가는 if");
						break;// 게임반복을 나가는 break;
					}

				}//게임반복 종료지점
				break;//switch나가는 break;
			case 2:
				System.out.println("<<당신의 전적>>");
				System.out.println("WIN : " + win);
				System.out.println("LOSE : " + lose);
				break;
			case 3:
				bool = false;
				break;
			default:
				System.out.println("잘못입력하셨습니다.");
				break;

			}//switch 종료지점
		}//전체메뉴반복 while종료지점
	}//메소드 종료지점

 

1-2) 주사위 게임

게임시작 시 주사위를 3번던진 총합을 계산후 보여줌 > 사용자 배팅여부결정
배팅-현재소지금범위내에서 배팅, 배팅금 입력 후 컴퓨터 주사위3회 총합을 통해 결과처리
승리:현재소지금+배팅금액 / 패배:현재소지금-배팅금액 / 무승부 : 현재소지금
결과 처리후 다시 배팅여부 확인 / 배팅을 그만하거나 패배로 소지금이 0원이 되는경우 게임종료

	public void dice() {
		Scanner sc = new Scanner(System.in);
		Random r = new Random();
		boolean bool = true;
		int uPay = 10000;
		int uBt = 0; //유저 배팅값
		int win = 0; //승리
		int draw = 0; //무승부
		int lose = 0; //패배
		
		while(bool) {
		System.out.println("===== Dice Game =====");
		System.out.println("1. Game Start");
		System.out.println("2. Game Score");
		System.out.println("3. End Game");
		System.out.print("선택 : ");
		int sel = sc.nextInt();
		switch(sel) {
		case 1:
			//1.GameStart
			while(true) {		
				if(uPay == 0) {
					System.out.println("거지 bye~");
					break;
				}
				System.out.println("<< Game Start >>");
				//유저 주사위 for문
				int uSum = 0;
				int cSum = 0;
				char yesNo = ' ';
				for(int i=0; i<3; i++) {
					int uDice = 0;
					uDice = r.nextInt(6)+1;
					System.out.println((i+1)+"번째 주사위 값 : "+uDice);
					uSum += uDice;
				}
				System.out.println("내 주사위 총 합 : "+uSum);
				System.out.print("배팅 하시겠습니까?[y/n] : ");
				yesNo = sc.next().charAt(0);
				if(yesNo == 'y') {
					//컴퓨터 주사위 for문
					while(true) {
						System.out.printf("얼마를 배팅하시겠습니까(현재 내 소지금 %d) : ",uPay);
						uBt = sc.nextInt();
						if(uBt > uPay) {
							System.out.println("금액이 부족합니다. 다시입력해주세요.");
						}else {
							break;
						}
					}
					for(int i=0; i<3; i++) {
						int cDice = 0;
						cDice = r.nextInt(6)+1;
						System.out.println("컴퓨터 "+(i+1)+"번재 주사위 값 : "+cDice);
						cSum += cDice;
					}
					System.out.println("컴퓨터 주사위 총 합 : "+cSum);
					if(uSum > cSum) {
						uPay += uBt;
						System.out.println("승리!");
						win++;
						System.out.println("+"+uBt+"원!");			
					} else if(uSum < cSum) {
						uPay -= uBt;
						System.out.println("패배!");
						lose++;
						System.out.println("-"+uBt+"원!");
						if(uPay == 0) {
							System.out.println("거지 Bye~");
							break;
						}
					} else {
						System.out.println("무승부!");
						draw++;
					}
					System.out.print("한번 더 하시겠습니까?[y/n]");
					char oneMore = sc.next().charAt(0);
					if(oneMore == 'n') {
						break;
					}
				} else {
					System.out.println("메뉴로 돌아갑니다.");
					break;
				} 
			}
			break;
		case 2:
			System.out.println("WIN : "+win);
			System.out.println("LOSE : "+lose);
			System.out.println("DRAW : "+draw);
			break;
		case 3: 
			System.out.println("종료");
			bool = false;
			break;
		default:
			System.out.println("잘못입력하셨습니다.");
			break;
		}
		
		}//전체반복 while
		
	}

 

[ 2. 배열 ] ========================================================================

 

2 - 1 ) 변수와 배열의 차이(배열의 기본)

	//변수와 배열의 차이
	public void test1() {
		//정수형 변수 5개 선언해서 1,2,3,4,5를 각각 대입하는 코드
		int num0 = 1;
		int num1 = 2;
		int num2 = 3;
		int num3 = 4;
		int num4 = 5;		
		System.out.println("변수로 출력");
		System.out.println(num0);
		System.out.println(num1);
		System.out.println(num2);
		System.out.println(num3);
		System.out.println(num4);
	 /*	
	    for(int i=0; i<5; i++) {
			System.out.println(numi); numi라는 변수를 찾고있음 i가 숫자로 인식X - for문 출력X
		} 
	 */
		
		//배열을 이용해서 1,2,3,4,5를 대입하고 출력하는 코드
		//길이가 5인 정수형 배열 선언
		int[] arr = new int[5]; //arr이라는 변수에 5칸짜리 배열의 주소값이 들어가있음
		//자료형[]변수명 = new 자료형[저장할 데이터개수];
		//일반변수의 경우 선언 후 초기화를 해주지 않으면 안에 쓰레기가 들어있지만, 
		//배열은 생성과 함께 자료형 별 기본값이 세팅되어있다.(int:0/boolean:false)
		//참조형 변수를 사용하는 경우 초기화를 꼭 해줘야한다.(null이 있기때문)
		//참조형(String 등)은 배열이어도 주소를 가지고있음. 
		//String[] arr = {"hi", "hello"} : 
		//arr에는 String[2]에대한 주소값을 / 배열의 각각인덱스에는 hi에 대한 주소값을
		arr[0] = 1; //배열중에 0번인덱스에 1을 넣어라
		arr[1] = 2;
		arr[2] = 3;
		arr[3] = 4;
		arr[4] = 5;		
		System.out.println("배열로 출력");
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		System.out.println(arr[3]);
		System.out.println(arr[4]);
		
		//배열을 사용하는 이유 : 배열은 제어문 사용이가능하다(규칙을 만들수있음)
		System.out.println("제어문(배열)로 출력");
		for(int i=0; i<5; i++) {			
			System.out.println(arr[i]);//[]덕분에 제어문에서 사용가능
		}
	}

 

  2 - 2 ) 입력받은 값을 배열에 대입하기

public void test2() {
		Scanner sc = new Scanner(System.in);
		//길이 3짜리 배열을 만들어서 순서대로 1, 2, 3 데이터를 대입하는 방법
		//방법1. 길이 3인 배열 생성 후 각 index에 값 직접대입
		int[] arr1 = new int[3]; //길이 3인 배열 생성후 0 0 0초기화
		arr1[0] = 1;
		arr1[1] = 2;
		arr1[2] = 3;
		//방법2. 길이 3인 배열 생숭 후 각 index에 값 for문 이용한 대입
		int[] arr2 = new int[3]; //길이 3인 배열 생성후 0 0 0 초기화
		for(int i=0; i<3; i++) {
			arr2[i] = i+1;
		}
		//방법3. 중괄호를 이용하는 방법
		int[] arr3 = {1, 2, 3}; //,를 기준으로 3칸짜리 배열을 생성 후 값대입_특정경우를 제외하곤 잘안씀
		
		
		//변수를 5개 선언해서 스캐너로 값을 5번 입력받아 저장하는 코드
		int num0 = 0;
		int num1 = 0;
		int num2 = 0;
		int num3 = 0;
		int num4 = 0;
		System.out.print("첫번째 정수 입력 : ");
		num0 = sc.nextInt();
		System.out.print("두번째 정수 입력 : ");
		num1 = sc.nextInt();
		System.out.print("세번째 정수 입력 : ");
		num2 = sc.nextInt();
		System.out.print("네번째 정수 입력 : ");
		num3 = sc.nextInt();
		System.out.print("다섯번째 정수 입력 : ");
		num4 = sc.nextInt();
		//이경우 반복문을 사용하면 좋지만, 변수를 선언한 경우 반복문 사용X -> 이걸 배열은 가능하다!
		
		int[] arr = new int[5];
		for(int i=0; i<5; i++) {
			System.out.print((i+1)+"번째 정수 입력 : ");
			arr[i] = sc.nextInt();
		}
		for(int i=0; i<5; i++) {
			System.out.println(arr[i]);
		}
	}

  

  2 - 3 ) 배열의 기본

   실습( 인덱스지정출력 / 직접전체출력 / for문을 이용한 전체출력 )

	//배열 실습문제1
	public void exam1() {
		//길이가 5인 배열을 선언하고 초기화 한 후
		//배열 인덱스를 이용해서 바나나 출력 / for문을 쓰지않고 전체출력 / for문을 이용하여 전체출력
		String[] arr = new String[5];
		//String[] arr = {"딸기", "복숭아", "키위", "사과", "바나나"};
		arr[0] = "딸기";
		arr[1] = "복숭아";
		arr[2] = "키위";
		arr[3] = "사과";
		arr[4] = "바나나";
		
		System.out.println("배열 인덱스를 이용하여 출력");
		System.out.println(arr[4]);
		
		System.out.println("for문을 쓰지 않고 전체출력");
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		System.out.println(arr[3]);
		System.out.println(arr[4]);
		
		System.out.println("for문을 이용하여 전체출력");
		for(int i=0; i<5; i++) {
			System.out.println(arr[i]);
		}
	}

 

  2 - 4 ) 길이가 100인 배열을 선언하고, 1~100까지의 값을 순서대로 배열 인덱스에 넣고, 값을 출력

	public void exam2() { 
		//길이가 100인 배열을 선언하고, 1~100까지의 값을 순서대로 배열 인덱스에 넣고, 값을 출력하는 코드작성
		int[] arr = new int[100];
		for(int i=0; i<100; i++) {
			arr[i] = i+1;
			System.out.println(arr[i]); 
			//배열에 값을 다넣고 출력을 해야하는 경우 for문을 따로만들어서 출력
		}
	}

 

  2 - 5 ) 점수를 입력받아 각과목의 점수 / 합계 / 평균(소수2자리) 출력하는 프로그램 - 직접 입출력

	public void exam3() {
		//길이가 4인 정수형 배열을 선언하고, 0:국어점수 1:영어점수 2:수학점수를 입력받고 마지막에는 합계입력
		//국어, 영어, 수학, 합계, 평균(소수2자리)까지 출력
		Scanner sc = new Scanner(System.in);
		int[] arr = new int[4];
		
		System.out.print("국어 점수 입력 : ");
		arr[0] = sc.nextInt();
		System.out.print("영어 점수 입력 : ");
		arr[1] = sc.nextInt();
		System.out.print("수학 점수 입력 : ");
		arr[2] = sc.nextInt();
		
		arr[3] = arr[0]+arr[1]+arr[2];
		double avg = arr[3]/3.0;

		System.out.printf("국어 : %d 영어 : %d 수학 : %d 총합 : %d 평균 : %.2f ", 
				arr[0], arr[1], arr[2], arr[3], avg);
		
	}

      점수를 입력받아 각과목의 점수 / 합계 / 평균(소수2자리) 출력하는 프로그램 - for문 버전

	public void exam33() {
		Scanner sc = new Scanner(System.in);
		String[] subject = {"국어", "영어", "수학", "과학"};
		//배열이름.length : 배열의 길이
		//length를 사용하면 과목을 추가하거나 삭제할 때 subject에서만 수정해주면 된다. 
		int[] arr = new int[subject.length+1];//합계누적을 위해 +1
		
		for(int i=0; i<subject.length; i++) {
			System.out.print(subject[i]+"점수 입력 : ");
			arr[i] = sc.nextInt();
			arr[arr.length-1] += arr[i];//합계가 들어가는 부분은 배열의 마지막이므로 길이-1
		}
		
		double avg = (double)arr[arr.length-1]/subject.length;
		for(int i=0; i<subject.length; i++) {
			System.out.print(subject[i]+" : "+arr[i]+"\t");
		}
		System.out.printf("합계 : %d 평균 : %.2f",arr[arr.length-1], avg);

	}

     

  2 - 6 ) 방관리 프로그램( 입실 / 퇴실 / 방보기 )

            입실 : 입력받은 방에 입실(이미 입실된 방은 손님이 있다는 메세지)
            퇴실 : 입력받은 방 퇴실(퇴실 시 빈방은 빈방이라는 메세지)
            방보기 - 10개의 방을 관리(배열)

 

            int형 배열 버전

	//배열을 int형으로
	public void motel1() {
		//1.입실 : 입력받은 방에 입실(이미 입실된 방은 손님이 있다는 메세지)
		//2.퇴실 : 입력받은 방 퇴실(퇴실 시 빈방은 빈방이라는 메세지)
		//3.방보기 - 10개의 방을 관리(배열)
		//int[] rooms = new int[10]; > 1:사람있는방 0:빈방
		//boolean[] rooms = new boolean[10] > t:사람있는방 f:빈방		
		Scanner sc = new Scanner(System.in);
		boolean bool = true;
		int[] rooms = new int[10]; 
		//모두 초기값(0)으로 세팅된 상태 
		//0 : 빈방 / 1 : 손님 있는 방		
		while(bool) {
			System.out.println("모텔관리프로그램 v1.0");
			System.out.println("1.입실\t2.퇴실\t3.방보기\t4.종료");
			System.out.print("선택 > "); 
			int sel = sc.nextInt();
			switch(sel) {				
			case 1 : //1.입실
				System.out.print("몇번방에 입실하시겠습니까?");
				int inR = sc.nextInt();
				if(rooms[inR-1] == 0) {
					rooms[inR-1] = 1;//10칸짜리 배열인데 배열의 인덱스번호는 0으로 시작하므로 -1
					//1번방에 입실한다 => rooms[0]에 입실
				}else {
					System.out.println(inR+"번 방에는 손님이 있습니다.");
				}
				break;
			case 2: //2.퇴실
				System.out.print("몇번방에서 퇴실하시겠습니까?");
				int outR = sc.nextInt();
				if(rooms[outR-1] == 1) {
					rooms[outR-1] = 0;
					System.out.println(outR+"번 방에서 퇴실하였습니다.");
				} else {
					System.out.println(outR+"방은 현재 빈 방입니다.");
				}			
				break;
			case 3:	//3.방보기
				for(int i=0; i<rooms.length; i++) {
					if(rooms[i] == 0) {
						System.out.println((i+1)+"번방이 현재 비어있습니다.");
					} else {
						System.out.println((i+1)+"번방에는 현재 손님이 있습니다.");
					}
				}
				break;
			case 4 :  //4.종료
				System.out.println("종료");
				bool = false;
				break;
			default: break;
			}
		}			
	}

           

     boolean형 배열 버전

//배열을 boolean형으로
	public void motel2() {
		//boolean[] rooms = new boolean[10] > t:사람있는방 f:빈방		
		Scanner sc = new Scanner(System.in);
		boolean bool = true;
		boolean[] rooms = new boolean[10]; 
		//모두 초기값(false)으로 세팅된 상태 
		//false면 빈방 / true : 손님 있는 방
		
		while(bool) {
			System.out.println("모텔관리프로그램 v1.0");
			System.out.println("1.입실\t2.퇴실\t3.방보기\t4.종료");
			System.out.print("선택 > "); 
			int sel = sc.nextInt();
			switch(sel) {				
			case 1 : //1.입실
				System.out.print("몇번방에 입실하시겠습니까?");
				int inR = sc.nextInt();
				if(!rooms[inR-1]) {//rooms[]에서 확인해야하는 값이 2개밖에 없으니까 
					               //boolean형으로 사용가능한것
					rooms[inR-1] = true;
				}else {
					System.out.println(inR+"번 방에는 손님이 있습니다.");
				}
				break;
			case 2: //2.퇴실
				System.out.print("몇번방에서 퇴실하시겠습니까?");
				int outR = sc.nextInt();
				//if(rooms[outR-1] == true)와 같은 논리
				if(rooms[outR-1]) {
					rooms[outR-1] = false;
					System.out.println(outR+"번 방에서 퇴실하였습니다.");
				} else {
					System.out.println(outR+"방은 현재 빈 방입니다.");
				}			
				break;
			case 3:	//3.방보기
				for(int i=0; i<rooms.length; i++) {
					if(rooms[i]) {//값자체가 논리형이므로 rooms[i] == true형식이 아니어도된다.
						System.out.println((i+1)+"번방에는 현재 손님이 있습니다.");
					} else {
						System.out.println((i+1)+"번방이 현재 비어있습니다.");
					}
				}
				break;
			case 4 :  //4.종료
				System.out.println("종료");
				bool = false;
				break;
			default: break;
			}
		}			
	}

 

 

 

방관리프로그램 결과화면

[ 후기 ] -------------------------------------------------------------------------------------------------------------------------------------------------------

처음에 빈방관리실습문제를 받았을때는 너무막막했는데 생각보다 간단해서 놀랐다.

해야할 일이 많아보이면 지레 겁먹는 습관좀 고쳐야하는데ㅎ 오늘 날이 굉장히추웠는데 코딩하는내내 손이 얼음장같아져서 달달떨면서 하느라 너무힘들었다~! 배열은 옛날에 공부할 때 굉장히 애먹었던 기억이있는데 아직까진 초반이라 그런지 기본적인 배열은 간단하고 재미있다.

 

오늘 실수한 부분

1. br31 게임에서 if( count == 31 ){ break; } 라는 승/패시 게임반복을 나가는 구문을 넣어주지 않아서 31이상 입력되는 문제가 발생.

1번부분 외에 실수한점은 없었다. 복습 열심히 하기!

'국비수업 > JAVA' 카테고리의 다른 글

9일차 : 메소드(Method)  (0) 2022.12.08
8일차 : 배열  (0) 2022.12.07
6일차 : Break, Continue, Random  (0) 2022.12.06
5일차 : 제어문  (0) 2022.12.06
4일차 : Operator  (0) 2022.12.06
Comments