파이썬관련 369 게임 만들기 질문입니다.

조회수 1341회

파이썬으로 제가 먼저 숫자 1을 입력으로 시작하여 3 6 9 가 들어가는수마다 짝 으로 출력되게 하여 제 다음차례에 컴퓨터가 숫자나 짝을 출력하게끔 3 6 9 게임을 만들고 싶습니다. 또한 33, 36등은 짝짝으로 출력되게 만들고 싶습니다. 고수분들 도와주세요.

1 답변

  • 컴퓨터는 항상 옳은 답을 입력한다는 전제 하에 작성한 C++ 기반 369 게임입니다.

    의식의 흐름대로 쉽게 작성한 코드라서 비효율적일 수 있습니다.

    그러나, 프로그램은 목적에 맞게 정상 작동합니다.

    아래 코드를 적절히 참고하여 파이썬 문법에 맞게 바꾸시면 됩니다.

    /* 
        < 게임오버 조건 >
           (1) 숫자를 잘못 입력할 경우
           (2) '짝'을 입력해야 하는데 숫자를 입력할 경우
           (3) 숫자를 입력해야 하는데 '짝'을 입력할 경우
           (4) '짝'의 입력 개수가 정답과 일치하지 않는 경우
    
        < 입력 예외 조건 >
            - 숫자가 아닌 '짝'을 제외한 모든 문자 또는 문자열을 입력할 경우 (생략) 
    */
    ---
    /*
     * author: 익명
     * date: 06/01/2021 (m/d/y)
     * purpose: QA answer
     */
    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void comInput(int n);  //컴퓨터 입력 값을 출력하는 함수(사용자의 입력 값에 1을 더한 값을 인자로 전달 받음)
    
    void printResult(const string &reason, int answer); //결과를 출력하는 함수(게임 종료 사유와 맞춘 횟수를 출력한다)
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int user, answer;
        string s_user, s_answer, s_tmp;
    
        user = answer = 1;
        while (true)
        {
            cout << "-------------------" << '\n';
    
            s_answer = "";
            s_tmp = to_string(answer);  //정답 값을 형 변환을 통해 자릿수마다 split 하여 문자열 변수에 저장
            for (char c : s_tmp)    //문자열 임시 변수에 저장된 정답의 각 자릿값을 단일문자 변수 c에 반복하며 저장
            {
                int x = c - '0';    //단일문자 c를 형 변환하여 한 자리 정수로 변환하고 정수형 변수인 x에 저장
                if (x != 0 && x % 3 == 0)   //x가 3의 배수라면 s_answer에 '짝'을 저장 (for-each 문으로 반복하며 누적)
                {
                    s_answer += "짝";
                }
            }
    
            if (s_answer.empty())   //s_answer가 비어있다는 것은 각각의 자릿수마다 3의 배수인 수가 하나도 존재하지 않는다는 것 (=정답은 정수형)
            {
                cout << "유저 입력: ";
                cin >> user;
                if (cin.fail())  //입력에 실패했을 경우(문자 또는 문자열을 입력했다면) 게임 종료
                {
                    printResult("잘못 입력했습니다.", answer);
                    break;
                }
    
                if (user == answer) //정답인 경우, 컴퓨터 입력 함수 호출
                {
                    comInput(answer + 1);
                }
                else    //오답인 경우, 오답 출력 후 게임 종료
                {
                    printResult("틀렸습니다.", answer);
                    break;
                }
            }
            else    //s_answer의 각 자릿수에 하나 이상의 3의 배수가 존재할 경우 (=정답은 문자 또는 문자열)
            {
                cout << "유저 입력: ";
                cin >> s_user;
                if (cin.fail())  //입력에 실패했을 경우(숫자를 입력했다면) 게임 종료
                {
                    printResult("잘못 입력했습니다.", answer);
                    break;
                }
                if (s_user == s_answer) //정답인 경우, 컴퓨터 입력 함수 호출
                {
                    comInput(answer + 1);
                }
                else    //오답인 경우, 오답 출력 후 게임 종료
                {
                    printResult("틀렸습니다.", answer);
                    break;
                }
            }
            answer += 2;    //사용자가 입력할 다음 문자(정수형 or 문자열)는 컴퓨터 입력을 건너 뛰므로 2를 더함
        }
        return 0;
    }
    
    void comInput(int n) {  //컴퓨터가 입력할 값을 출력하는 함수(유저가 입력한 정답 수의 다음 숫자를 인자로 받음)
        cout << "컴퓨터 입력: ";
        string s_tmp = to_string(n); //전달받은 인자값을 형 변환을 통해 자릿수마다 split 하여 문자열 변수에 저장
        string s_answer;    //'짝'을 누적할 문자열 변수 선언
        for (char c : s_tmp)    //split하여 저장된 수들을 하나씩 단일 문자 c에 순서대로 반복하여 저장함
        {
            int x = c - '0';    //단일문자 c를 형 변환하여 한 자리 정수로 변환하고 정수형 변수인 x에 저장
            if (x != 0 && x % 3 == 0)   //x가 3의 배수라면 s_answer에 '짝'을 저장 (for-each 문으로 반복하며 누적)
            {
                s_answer += "짝";
            }
        }
        if (s_answer.empty())   //s_answer가 비어있다는 것은 전달 받은 인자값에 3 or 6 or 9가 포함돼 있지 않다는 것이므로 해당 인자를 숫자로 출력
        {
            cout << n;
        }
        else    //아닌 경우, '짝'이 누적돼 있는 s_answer를 출력
        {
            cout << s_answer;
        }
        cout << '\n';
    }
    
    void printResult(const string &reason, int answer) {
        cout << '\n';
        cout << "게임 오버 : " << reason << '\n';
        cout << "맞춘 횟수: " << answer / 2 << '\n';
        cout << "-------------------" << '\n';
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)