Everything has an expiration date
102 - Java 클래스와 인스턴스의 활용 : 가위바위보 프로그램 구상 Logic 노트 정리본 재작성 본문
102 - Java 클래스와 인스턴스의 활용 : 가위바위보 프로그램 구상 Logic 노트 정리본 재작성
Jelly-fish 2023. 9. 9. 00:00◎ 가위바위보에서 사용자가 내는 것 : 가위(0), 바위(1), 보(2)
전체 경우의 수를 표로 정리해 보면 다음과 같다.
사용자가 이겼다 (j = 0) | 사용자가 졌다 (j = 1) | 비겼다 (j = 2) | |
사용자 1 입력 : 가위 (i = 0) | 컴퓨터 3 입력 : 보 | 컴퓨터 2 입력 : 주먹 | 컴퓨터 1 입력 : 가위 |
사용자 2 입력 : 바위 (i = 1) | 컴퓨터 1 입력 : 가위 | 컴퓨터 3 입력 : 보 | 컴퓨터 2 입력 : 바위 |
사용자 3 입력 : 보 (i = 2) | 컴퓨터 2 입력 : 주먹 | 컴퓨터 1 입력 : 가위 | 컴퓨터 3 입력 : 보 |
▶ 이를 숫자만 남도록 표현해 보면...
열 값(j) → |
0 | 1 | 2 |
입력값 ↓ | Win | Lose | Draw |
1 (i=0) | 3 | 2 | 1 |
2 (i=1) | 1 | 3 | 2 |
3 (i=2) | 1 | 2 | 3 |
가위바위보의 배틀 결과 배열을, Java 배열의 배열(다차원 배열) 형식으로 생성해 보자!
/*[Logic]▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤
만약 if 문이 없다면,
j = 0 1 2 [3 4](Ⅹ)
───────────┐
3 2 1 │ => i = 0, j = 0, 1, 2 『n의 for 반복문(inner) 총 3번 반복하므로』
3 2 │ 1 => i = 1, j = 1, 2, [3](Ⅹ) 『j가 배열의 크기를 초과해 버린다!』
3 │ 2 1 => i = 2, j = 2, [3, 4](Ⅹ) 『j가 배열의 크기를 초과해 버린다!』
이때, j = 3이 됐을 때 Array index out of bounds(배열의 인덱스 값이 배열 크기를 초과)
오류가 발생하므로
j = 3이 되는 시점에 j = 0을 해 준다면...
j = 0 1 2 (OK~!!)
───────────┐
3 2 1 │
1 3 2 │ ← 원하는 모양으로 바뀌었음을 알 수 있다!
2 1 3 │ 【Test088.java 소스에서 알게 된 Logic을 사용했다!】
▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤
*/
for(int i = 0; i < 3 ; i++)
{
for(int n = 3, j = i; n >= 1 ; n--)
{
arr[i][j] = n;
j++;
if (j == 3)
{
j = 0; // j = 3이 되는 시점에서 배열의 index 범위 벗어나므로~!!!
}
}
}
배틀 결과 배열의 생성이 끝났다면, 가위바위보 승부 결과를 출력해 보자!
만약, 사용자가 1 값(=가위)을 입력한다면 (1)
→ ① arr[0][0] ~ arr[0][2]까지의 요소 중, 컴퓨터가 입력한 값이 있는지를 확인한다.
→ ② 이때, 컴퓨터가 입력한 값이 만약 3(=보자기)이라면 사용자의 승리인 Win이고
→ ★ 『 열 값인 j 값은 0이다! 』
만약, 사용자가 1 값(=가위)을 입력한다면 (2)
→ ① arr[0][0] ~ arr[0][2]까지의 요소 중, 컴퓨터가 입력한 값이 있는지를 확인한다.
→ ② 이때, 컴퓨터가 입력한 값이 만약 2(=바위)라면 컴퓨터의 승리인 Lose이고
→ ★ 『 열 값인 j 값은 1이다! 』
만약, 사용자가 1 값(=가위)을 입력한다면 (3)
→ ① arr[0][0] ~ arr[0][2]까지의 요소 중, 컴퓨터가 입력한 값이 있는지를 확인한다.
→ ② 이때, 컴퓨터가 입력한 값이 만약 1(=가위)라면 무승부인 Draw이고
→ ★ 『 열 값인 j 값은 2이다! 』
즉….
사용자가 이겼을 때의 열의 값 (j) | 0 |
컴퓨터가 이겼을 때의 열의 값 (j) | 1 |
사용자와 컴퓨터가 무승부일 때의 열의 값 (j) | 2 |
임을 알 수 있다!
그렇다면 …
0번 요소에는 사용자의 승리 를, 1번 요소에는 컴퓨터의 승리 를, 2번 요소에는 무승부 임을 알려주는
문자열 데이터를 배열 형태로 선언하여 결과 출력시 이용하도록 하자!!
// 【 j = 0 】: "당신이 이겼습니다~!!!"
// 【 j = 1 】: "컴퓨터가 이겼습니다~!!!"
// 【 j = 2 】: "무승부입니다!!!"
String[] battleResultArr = {"당신이 이겼습니다~!!!", "컴퓨터가 이겼습니다~!!!", "무승부입니다!!!"};
컴퓨터가 발생시킨 난수 값(comRps)과, 가위바위보의 가짓수를 정리한 배열(arr[inputNum][j])의 값을 비교한다.
승부 결과를 판단하는 Logic은 위에서 이미 완료했으므로, 이제 사용자의 가위바위보 입력 값(inputNum)과
실제 컴퓨터의 난수 값(comRps)으로 대결을 실제 실행하는 부분의 Logic을 생각해 봐야 한다.
우선, 사용자의 입력 값이 무엇인지에 따라 사용자의 승리, 패배, 무승부일 때의 컴퓨터의 입력 값이 달라지므로
가위바위보의 가짓수를 정리한 → int형 배열 arr[][]의 행을 고정 시켜야 한다.
arr[inputNum(사용자가 입력한 가위바위보 값) - 1][?]
만약 사용자가 가위를 냈다면 arr[i=0][]일 때, 즉 한 행의 부분 안에서 가위바위보의 승부 결과를 판단 해야 한다는 것이다.
입력값 ↓ | Win(j = 0) | Lose (j = 1) | Draw (j = 2) |
사용자가 가위 입력 1 (i=0) | 3 | 2 | 1 |
이때, 컴퓨터가 발생시킨 난수 값(comRps)이 위의 표들의 요소 값 3, 2, 1 중 어떤 것인지를 알아야
승부 결과를 알 수 있는 열의 값 j를 알아낼 수 있기 때문에
j = 0 ~ 2 까지 반복하는 for 문 을 사용하면서 【 컴퓨터의 난수 값(comRps) == 한 행의 가위바위보 가짓수 값(arr[ inputNum - 1 ][ j ]) 】인지를
알아내야 한다.
그것을 Java 언어로 구현해 보면 아래와 같다.
for(int j = 0; j < 3; j++)
{
if (arr[inputNum-1][j] == comRps) // 컴퓨터 난수 값과 가위바위보 가짓수 값이 동일하니?
{
resultIndex = j; // 동일하면, arr[inputNum - 1][j] 배열 값의
// 열 인덱스 값(Win, Lose, Draw) j를 resultIndex에 저장해!
}
}
지금까지의 Logic 내용 총정리
1. 사용자가 가위(1), 바위(2), 보(3)를 냈을 때, 컴퓨터의 난수 값이 0, 1, 2 중 몇일 때 사용자의 승리(Win)이고,
컴퓨터의 승리(Lose)인지, 무승부(Draw)인지를 표로 작성한 후 이를 Java의 4byte 정수 타입(int)의 2차원 배열(배열의 배열) 형태로 생성했다.
↓
2. 위에서 작성한 표에서 열의 값(j)이 0일 때 는 사용자의 승리(Win) 이고, 1일 때 는 사용자의 패배(Lose) , 2일 때 는 무승부(Draw) 임을 확인했다.
↓
3. arr[inputNum(사용자가 입력한 가위바위보 값)][j] 에서, j 값이 0인지, 1인지, 2인지 에 따라 결과 출력을 승리, 패배, 무승부로 나누어야 했기에
1 차원 문자열 배열을 생성했다. battleResultArr = {"당신이 이겼습니다~!!!", "컴퓨터가 이겼습니다~!!!", "무승부 입니다!!!"};
↓
4. 승부의 결과를 판가름 하는 부분은 완료했기 때문에, 실제 컴퓨터가 발생시킨 가위바위보 난수 값(comRps)과 arr[inputNum(사용자 입력값)][j] 의
값이 같은지를 비교하여 만약 컴퓨터의 난수 값(comRps) = arr[inputNum][j] 일 때, 승부 결과를 알 수 있는 열의 인덱스 j 를 반환하기로 했다.
↓
5. 반환받은 j (승부 결과를 알 수 있는 열의 인덱스 값) 를 resultIndex에 저장한 후, 배틀 결과를 알려주는 문자열 배열 battleResultArr[]의 인덱스로
사용하여 결과를 출력한다. battleResultArr[resultIndex] = {"당신이 이겼습니다~!!!"};