8월 14일~19일, WIL (항해 1주차)

코코·2023년 8월 20일
0

WIL(Weekly I Learned)

목록 보기
2/3
post-thumbnail

1. 숫자야구를 만들어보자!

  • 항해를 시작한 첫 주차의 목표는 두가지였다. 첫 번째는 강의를 듣고 개인과제를 풀어보는 것이었고, 두 번째는 팀원들과 함께 숫자야구를 구현해보는 것이었다.

  • 숫자야구를 통해 간단한 프로그램을 구현해았는데 여러가지로 기억이 많이 남는 한 주였다. 그 동안 배웠던 조건문과 반복문을 마음껏 써보고, 주어진 조건을 다 만족할 수 있게 프로그램을 짜면서 몰입하며 고민해보기도 했다. 에러나 예기치 못한 문제가 발생했을 때 트러블 슈팅을 해 본 것도 기억에 많이 남았다.

2. 숫자야구(코코's version)

  • 컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑습니다.
    (ex) 123, 759
  • 사용자는 컴퓨터가 뽑은 숫자를 맞추기 위해 시도합니다.
  • 컴퓨터는 사용자가 입력한 세자리 숫자에 대해서, 아래의 규칙대로 스트라이크(S)와 볼(B)를 알려줍니다.
    • 숫자의 값과 위치가 모두 일치하면 S
    • 숫자의 값은 일치하지만 위치가 틀렸으면 B
  • 기회는 무제한이며, 몇번의 시도 후에 맞췄는지 기록됩니다.
  • 숫자 3개를 모두 맞춘 경우, 게임을 종료합니다.
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        ArrayList<Integer> intList = new ArrayList<Integer>();

        Scanner sc = new Scanner(System.in);
        Random rd = new Random();

        System.out.println("컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!");

        int count = 0;

        // 랜덤한 수 3개를 만들어 각각 변수에 넣는다.
        int num1 = rd.nextInt(10);
        int num2 = rd.nextInt(10);
        int num3 = rd.nextInt(10);

        while (true) { // 중복제거
            if ((num1 == num2) || (num2 == num3) || (num1 == num3) ) {
                num1 = rd.nextInt(10);
                num2 = rd.nextInt(10);
                num3 = rd.nextInt(10);
            } else {
                break;
            }
        }

        // ArrayList에 각각 추가한다.
        intList.add(num1);
        intList.add(num2);
        intList.add(num3);

        // ArrayList에 넣은 각각의 값에 접근하여 Integer 변수에 할당한다.
        Integer result1 = intList.get(0);
        Integer result2 = intList.get(1);
        Integer result3 = intList.get(2);

        // System.out.println(result1 + "" + result2 + "" + result3); 
        // 컴퓨터가 설정한 랜덤 값 보여주기


        while (true) {
            int ball = 0;
            int strike = 0;
            count++;
            System.out.print(count + "번째 시도 : ");

            int i = sc.nextInt(); // 숫자를 입력받음


            int throw1 = i / 100; // 백의 자리수
            int throw2 = (i % 100)/10; // 십의 자리수
            int throw3 = (i % 100)%10; // 일의 자리수

            // ball 판정 조건
            if((result1 == throw2) || (result1 == throw3)) {
                ball++;
            }
            if ((result2 == throw1) || (result2 == throw3)) {
                ball++;
            }
            if ((result3 == throw1) || (result3 == throw2)) {
                ball++;
            }

            // strike 판정 조건
            if(result1 == throw1) {
                strike++;
            }
            if (result2 == throw2) {
                strike++;
            }
            if (result3 == throw3) {
                strike++;
            }


            // 종료 조건
            if((result1 == throw1) 
            && (result2 == throw2) 
            && (result3 == throw3)) {
                System.out.println(strike + "S");
                System.out.println(count + "번만에 맞히셨습니다.");
                System.out.println("게임을 종료합니다.");
                break;
            }

            // 판정
            System.out.println(ball + "B" + strike + "S");
        }
    }
}

(1) 결과

(2) 트러블 슈팅

  • 사용자가 입력한 값을 받기위해 Scanner()를 사용했다. 그래서 입력받으려는 세 자리 수를 세 개의 변수에 각각 담아서 컴퓨터가 생성한 세 자리수와 비교해주려고 했는데...
	int throw1 = sc.nextInt();		// 백의 자리
    int throw2 = sc.nextInt();		// 십의 자리
    int throw3 = sc.nextInt();		// 일의 자리
        
    // 이런식으로 단순하게 입력받으려고 생각했는데, 오판이었다.
	// 예를 들어, 576이라는 수를 입력하려고 하면
    5 7 6	// 이렇게 입력해야 하거나
    5
    7
    6
    // 이렇게 입력해야 하는 상황이 발생했다.
  • Scanner next()는 '한 단어'씩 읽어들이기 때문에 '공백' 을 기준으로 입력받는다. 그렇기에 세 자리수는 각각 따로 입력받으면 안됐고, 한 단어로 입력받은 후 별도의 처리를 통해 백의 자리, 십의 자리, 일의 자리를 각각 변수에 넣어줘야 했다.
	int i = sc.nextInt(); 		// 숫자를 입력받음

	int throw1 = i / 100; 		// 백의 자리수
	int throw2 = (i % 100)/10; 	// 십의 자리수
	int throw3 = (i % 100)%10; 	// 일의 자리수
  • 변수 i에 숫자를 입력받아 할당한 후, 각각의 자리수를 구해서 throw라는 변수에 각각 할당해주었다.
profile
Just Do It

0개의 댓글