✿∘˚˳°∘°
7일차 : Random, 배열 본문
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 |