(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언어 함수 공부 교재 보면서 다시하기 (교재에 있는 문제 풀기)
시간 남으면 배열 공부하기.
'개발공부 > C언어' 카테고리의 다른 글
C언어_붕어빵 심리테스트 만들기 (0) | 2023.03.30 |
---|---|
C언어_로또뽑기 만들기 (0) | 2023.03.30 |
C언어_난수함수로 가위바위보 게임 만들기 (0) | 2023.03.27 |
C언어_다양한 모양 별찍기 (1) | 2023.03.26 |
C언어_다양한 구구단 출력 프로그램 만들기 (0) | 2023.03.25 |