소연의_개발일지
article thumbnail

(3.29) 학습일지

 

 

 

1. 개발 진행 및 완료상황

 

오늘은 C언어 함수를 사용하여 스무고개로 컴퓨터가 생각한 숫자를 맞추는 게임을 만들었다.

게임은 다 만들긴 했는데 아직 C언어 함수 자체에 대한 이해가 부족하다.

네번의 패치 끝에 게임 성공 완료

 

ver.1(실패버전)

ver.2(실패버전 -> 성공!)

ver.3(다시 묻는 질문 추가)

ver.4(진짜 최종. 횟수 세고 몇번만에 성공했는지 알려주기)

 

 

처음 생각한 구조도

 

스무고개_ver1

(성공해도 숫자를 입력하라는 질문이 계속 나옴/반복X)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void game_start() //게임 시작 안내
{
    printf("===============================================\n");
    printf("스무고개 숫자맞추기 게임에 오신것을 환영합니다!\n");
    printf("  1부터 100까지 중 하나의 숫자를 선택하세요.   \n");
    printf("   당신에게 주어진 기회는 총 20번 입니다.      \n");
    printf("===============================================\n");
}

int random_choice() //컴퓨터가 랜덤으로 숫자 선택 함수
{
    int com_choice;
    srand((unsigned int)time(NULL)); //매번 시드를 변경해줌
    com_choice = rand()%100 + 1; // 1~100까지의 숫자 중 하나 랜덤 선택
    return com_choice;
}

int question() //사용자에게 숫자 질문
{
    int user_choice;
    printf("숫자를 입력하세요: ");
    scanf("%d", &user_choice);
    return user_choice;
}

void compare_number(int com_choice, int user_choice) //컴퓨터와 사용자 숫자 비교 함수
{
    if(com_choice > user_choice)
    {
        printf("더 낮은 숫자를 선택하셨습니다.\n");
    }
    else if(com_choice < user_choice)
    {
        printf("더 높은 숫자를 선택하셨습니다.\n");
    }
    else if(com_choice == user_choice)
    {
        printf("축하합니다! 성공했습니다.\n");
        return;
    }
}

int main()
{
    game_start();
    int computer_choice = random_choice();
    printf("%d", computer_choice);
    for(int i=0;i<=20;i++)
    {
        int user_choice = question();
        compare_number(computer_choice, user_choice);
        if(i == 20){
            printf("아쉽게도 당신은 실패하셨습니다. 정답은 %d입니다.\n", computer_choice);
        }
        
    }

    return 0;
}
 

이 코드에서 나온 문제점

.

숫자를 입력해서 성공해도 숫자를 입력하라는 문구가 뜬다.

아놔 왜이래

 

 

2. 업무, 개발 중 발생한 이슈/고민 또는 이를 해결한 내용

성공하면 1반환, 실패하면 0반환 결과를 추가한 후

아래 main()함수에 if문을 추가해 준다.

 

스무고개_ver2

(ver.1버전의 문제점이 해결된 버전)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void game_start() //게임 시작 안내
{
    printf("===============================================\n");
    printf("스무고개 숫자맞추기 게임에 오신것을 환영합니다!\n");
    printf("  1부터 100까지 중 하나의 숫자를 선택하세요.   \n");
    printf("   당신에게 주어진 기회는 총 20번 입니다.      \n");
    printf("===============================================\n");
}

int random_choice() //컴퓨터가 랜덤으로 숫자 선택 함수
{
    int com_choice;
    srand((unsigned int)time(NULL)); //매번 시드를 변경해줌
    com_choice = rand()%100 + 1; // 1~100까지의 숫자 중 하나 랜덤 선택
    return com_choice;
}

int question() //사용자에게 숫자 질문
{
    int user_choice;
    printf("숫자를 입력하세요: ");
    scanf("%d", &user_choice);
    return user_choice; 
}

int compare_number(int com_choice, int user_choice) //컴퓨터와 사용자 숫자 비교 함수
{
    if(com_choice > user_choice)
    {
        printf("더 낮은 숫자를 선택하셨습니다.\n");
    }
    else if(com_choice < user_choice)
    {
        printf("더 높은 숫자를 선택하셨습니다.\n");
    }
    else if(com_choice == user_choice)
    {
        printf("축하합니다! 성공했습니다.\n");
        return 1; //성공하면 1반환
    }
    return 0; //실패하면 0반환
}

int main()
{
    game_start(); //게임 시작
    int computer_choice = random_choice(); //컴퓨터가 랜덤으로 숫자를 고름
    for(int i=0;i<=20;i++) //20번 반복함
    {  
        int user_choice = question(); //사용자에게 질문
        if(compare_number(computer_choice, user_choice)==1) //만약 컴퓨터와 사용자가 고른 숫자가 일치시(1반환이면)
        {
            break; //성공하면 for문 빠져나오기 위해 break
        }
        if(i == 20){ //20번 모두 실행한 경우
            printf("아쉽게도 당신은 실패하셨습니다. 정답은 %d입니다.\n", computer_choice); //실패문구 반환
        }
    }
    return 0;
}
 

성공 버전!

결과값이 반환되면 int함수를 써줘야 하는 법을 구글링 후 알게되었다

마시면서 배우는 술게임 같은 오류찾기~

 

그리고 추가로 횟수 반환 + 다시 게임을 진행할지에 대한 질문을 추가하면 좋을듯함

이런 오류가 다시 발생했다..... 왜요

 

스무고개 ver_3(세미 최종)

(다시 시작 질문 함수 추가, 추가적 오류 해결)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void game_start() //게임 시작 안내 함수
{
    printf("===============================================\n");
    printf("스무고개 숫자맞추기 게임에 오신것을 환영합니다!\n");
    printf("  1부터 100까지 중 하나의 숫자를 선택하세요.   \n");
    printf("   당신에게 주어진 기회는 총 20번 입니다.      \n");
    printf("===============================================\n");
}

int random_choice() //컴퓨터가 랜덤으로 숫자 선택 함수
{
    int com_choice;
    srand((unsigned int)time(NULL)); //매번 시드를 변경해줌
    com_choice = rand()%100 + 1; // 1~100까지의 숫자 중 하나 랜덤 선택
    return com_choice;
}

int question() //사용자에게 숫자 질문 함수
{
    int user_choice;
    printf("숫자를 입력하세요: "); 
    scanf("%d", &user_choice); //사용자가 입력한 값이 user_choice에 저장됨
    getchar(); //엔터 지워주기
    return user_choice; 
}

int compare_number(int com_choice, int user_choice) //컴퓨터와 사용자 숫자 비교 함수
{
    if(com_choice > user_choice)
    {
        printf("더 낮은 숫자를 선택하셨습니다.\n");
    }
    else if(com_choice < user_choice)
    {
        printf("더 높은 숫자를 선택하셨습니다.\n");
    }
    else if(com_choice == user_choice)
    {
        printf("축하합니다! 성공하셨습니다. 정답은 '%d' 이었습니다.\n", com_choice);
        return 1; //성공하면 1반환
    }
    return 0; //실패하면 0반환
}

int restart_game() //게임 다시 시작 질문 함수
{
    char user_wants_replay; //사용자 게임 재시작 선택 함수
    printf("게임을 다시 시작하시겠습니까? (y/n): "); 
    scanf("%c", &user_wants_replay); //사용자의 대답이 user_wants_reply에 저장됨
    getchar(); //엔터 지워주기 겟차~
    if(user_wants_replay == 'N' || user_wants_replay == 'n'){ //사용자가 n을 입력하면 
        return 0; // 0반환
    }
    else if(user_wants_replay == 'Y' || user_wants_replay == 'y'){ //사용자가 y를 입력하면
        return 1; // 1 반환
    }
    return 0;
}

int main() 
{
    while(1){
        game_start(); //게임 시작
        int computer_choice = random_choice(); //컴퓨터가 랜덤으로 숫자를 고름
        //printf("%d\n", computer_choice); //겜제작자 위한 출력부분~
        for(int i=0;i<=20;i++) //20번 반복함
        {  
            int user_choice = question(); //사용자에게 질문
            if(compare_number(computer_choice, user_choice)==1) //만약 컴퓨터와 사용자가 고른 숫자가 일치시(1반환이면)
            {
                break; //성공하면 for문 빠져나오기 위해 break
            }
            if(i == 20){ //20번 모두 실행한 경우
                printf("아쉽게도 당신은 실패하셨습니다. 정답은 %d입니다.\n", computer_choice); //실패문구 반환
            }
        }
        if(restart_game()==0){ //사용자가 재시작하기 원하면 while문 반복
           break; } //아니면 while문 빠져나오기
    }
    return 0;
}
 

게임 재시작 함수를 추가해주었다.


 

플레이 화면

 

 

첫 플레이 화면. 숫자 입력을 묻는다.

.

플레이 진행 화면. 선택한 숫자가 높은지 낮은지 답해주고

숫자를 맞추면 정답을 알려준다.

그리고 게임 재시작을 묻는다.

재시작하면 게임을 다시 시작한다. n을 입력하면 게임이 끝난다.

 

 

++cnt함수를 추가해서 최종 + 최종 버전을 만들었다.

 

⭐스무고개 ver_4(진짜 진짜 최종) ⭐

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void game_start() //게임 시작 안내 함수
{
    printf("===============================================\n");
    printf("스무고개 숫자맞추기 게임에 오신것을 환영합니다!\n");
    printf("  1부터 100까지 중 하나의 숫자를 선택하세요.   \n");
    printf("   당신에게 주어진 기회는 총 20번 입니다.      \n");
    printf("===============================================\n");
}

int random_choice() //컴퓨터가 랜덤으로 숫자 선택 함수
{
    int com_choice;
    srand((unsigned int)time(NULL)); //매번 시드를 변경해줌
    com_choice = rand()%100 + 1; // 1~100까지의 숫자 중 하나 랜덤 선택
    return com_choice;
}

int question() //사용자에게 숫자 질문 함수
{
    int user_choice;
    printf("숫자를 입력하세요: "); 
    scanf("%d", &user_choice); //사용자가 입력한 값이 user_choice에 저장됨
    getchar(); //엔터 지워주기
    return user_choice; 
}

int compare_number(int com_choice, int user_choice, int cnt) //컴퓨터와 사용자 숫자 비교 함수
{
    if(com_choice > user_choice)
    {
        printf("더 낮은 숫자를 선택하셨습니다.");
        printf("(남은 횟수: %d번)\n", 20-cnt);
    }
    else if(com_choice < user_choice)
    {
        printf("더 높은 숫자를 선택하셨습니다.");
        printf("(남은 횟수: %d번)\n", 20-cnt);
    }
    else if(com_choice == user_choice)
    {
        printf("축하합니다! 성공하셨습니다. 정답은 '%d' 이었습니다.\n", com_choice);
        printf("'%d번' 만에 성공하셨습니다.\n", cnt);
        return 1; //성공하면 1반환
    }
    return 0; //실패하면 0반환
}

int restart_game() //게임 다시 시작 질문 함수
{
    char user_wants_replay; //사용자 게임 재시작 선택 함수
    printf("게임을 다시 시작하시겠습니까? (y/n): "); 
    scanf("%c", &user_wants_replay); //사용자의 대답이 user_wants_reply에 저장됨
    getchar(); //엔터 지워주기 겟차~
    if(user_wants_replay == 'N' || user_wants_replay == 'n'){ //사용자가 n을 입력하면 
        return 0; // 0반환
    }
    else if(user_wants_replay == 'Y' || user_wants_replay == 'y'){ //사용자가 y를 입력하면
        return 1; // 1 반환
    }
    return 0;
}

int main() 
{
    while(1){
        game_start(); //게임 시작
        int computer_choice = random_choice(); //컴퓨터가 랜덤으로 숫자를 고름
        //printf("%d\n", computer_choice); //겜제작자 위한 출력부분~
        int cnt=0; //게임 총 횟수
        for(int i=0;i<=20;i++) //20번 반복함
        {  
            int user_choice = question(); //사용자에게 질문
            cnt++;
            if(compare_number(computer_choice, user_choice, cnt)==1) //만약 컴퓨터와 사용자가 고른 숫자가 일치시(1반환이면)
            {
                break; //성공하면 for문 빠져나오기 위해 break
            }
            if(i == 20){ //20번 모두 실행한 경우
                printf("아쉽게도 당신은 실패하셨습니다. 정답은 %d입니다.\n", computer_choice); //실패문구 반환
            }
        }
        if(restart_game()==0){ //사용자가 재시작하기 원하면 while문 반복
           break; } //아니면 while문 빠져나오기
    }
    return 0;
}
 

count 함수를 넣어주고 몇번만에 성공했는지 추가해 줬다.

변수를 추가해줄 때 함수 이름 옆 ()에 꼭 넣어주기 !!! 기억하자

 

 


 

3. 오늘 새로 배운 내용

 

<segmentation fault 에러(error) 발생 이유>

- 읽기 전용 파일에 쓰기를 시도할 경우

- 운영체제 메모리 영역에 접근 시도한 경우

- 잘못된 메모리 영역접근( -1, NULL)

 

scanf함수 사용할 때 getchar(); 개행 삭제해주는 함수 쓰기

그리고 &빼먹지 말기 (제발)

 

 


4. 참고할 만한 레퍼런스 등

없음


 

5. 특이사항(아이디어 메모 등)

모든걸 다 함수를 만들어 때려박다 보니 count 함수 만들어서 횟수 넣는 방법을 모르겠다. -> 해결해결! 함수 옆에 하나 더 추가해줘서 3개로 만들어줘도 가능한 거였다!

그리고 첫번째 만든 코드가 더 깔끔해 보인다. 뭔가 기능을 넣다보니 어쩔 수 없는것인지도..모르겠다


 

6. 회고

앞으로 게임할 때 작은 오류같은것들은 무시해야겠다. 게임 제작자들 정말 대단해

 


7. 해야할 것

C언어 함수 공부 교재 보면서 다시하기 (교재에 있는 문제 풀기)

시간 남으면 배열 공부하기.

 

 

 

 

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!