PGR21.com
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다.
통합 규정을 준수해 주십시오. (2015.12.25.)
Date 2015/11/01 14:52:06
Name 용유진
File #1 ball.docx (12.6 KB), Download : 49
Subject [질문] C 언어 프로그래밍 질문입니다..
이제 막 학교에서 C언어를 배우기 시작하고 있는데 너무 어렵네요
첨부파일의 내용이 무작위 숫자 4개를 입력하여 볼인지 스트라이크
인지를 판단하는 간단한 숫자야구 프로그램이라고 하는데 왕초보라서
그런지 개념이 잘 이해가 안가네요..

일반적으로 코딩을 할때는 처음과 끝을 표현하던데 여기엔 끝을 표현하는
게 없이 무한반복이 가능하다고 설명들었는데  첨부 내용이 그 자체로 문제가
없는건지 설명을 좀 듣고 싶습니다.
C언어 고수님들의 도움 부탁드려요...

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
15/11/01 14:55
수정 아이콘
첨부파일의 내용이 깨져서 확인이 불가능한데 다른 포맷으로 올려주실 수 있나요
용유진
15/11/01 14:57
수정 아이콘
네.. 다시 올릴께요
15/11/01 15:18
수정 아이콘
야구 게임은 중복되지 않는 숫자 4개를 맞추는 게임인데
정답을 제시할 때마다 제시한 답에 맞는 힌트를 줍니다
숫자가 4개 중에 속해있으면 볼, 위치까지 맞으면 스트라이크로 계산하죠
정답과 정답을 제시하기 위한 정수형(int) 변수로 4자리의 숫자가 2개가 필요해 총 8개의 int 변수가 만들어집니다
또 볼과 스트라이크를 표현하기 위해 두개의 정수형 변수를 추가로 선언하고요.

그 다음 srand와 time을 통해 난수 테이블을 설정합니다.
srand는 난수표를 선택하는 함수고 난수표를 고르는 기준을 현재 시간으로 했기 때문에 실행할때마다 다른 값이 만들어집니다
그 후 야구게임 전체를 반복시키기 위한 while문이 만들어지고 그 안에서 게임이 가동됩니다

정답을 설정하기 위해 난수표에서 값을 가져오는 rand함수를 사용하고요
이를 10으로 나눈 나머지를 구하는 %연산을 통해 1자리 수를 설정합니다
이때 4자리의 숫자는 서로 겹치지 않기 위해 while문으로 다를 때까지 반복해서 수를 비교하고 생성합니다
이걸 4자리의 수가 생성될때까지 반복하고 게임을 시작합니다

게임이 시작된 후 scanf 함수로 수를 입력받습니다 "%d %d %d %d"이므로 1 2 3 4 와 같이 한칸씩 띄워쓴 상태로 입력받습니다.
입력받은 4개의 수로 countBall함수와 countStrike함수를 작동시킵니다.
countBall은 8개의 인수를 가지고 정답과 같은 수가 존재하는지 확인하고 확인된 갯수를 반환합니다.
countStrike는 8개의 인수를 가지고 정답과 같은 자리에 같은수가 몇개 존재하는지 반환합니다.
그리고 본래 게임으로 돌아와 스크라이크가 4개가 되면 플레이어가 정답을 맞춘 것이므로 게임을 종료하고 새 게임을 시작합니다
용유진
15/11/01 15:23
수정 아이콘
자세한 설명 정말 감사드립니다..
AirQuick
15/11/01 14:56
수정 아이콘
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int countBall(int ans1, int ans2, int ans3, int ans4, int gss1, int gss2, int gss3, int gss4);
int countStrike(int ans1, int ans2, int ans3, int ans4, int gss1, int gss2, int gss3, int gss4);

int main(void)
{
int ans1=0, ans2=0, ans3=0, ans4=0;
int gss1=0, gss2=0, gss3=0, gss4=0;
int ball=0, strike=0;
srand (time(NULL));
while(1)
{
ans1=rand()%10;
ans2=rand()%10;
while(1)
{
if(ans1==ans2)
ans2=rand()%10;
else
break;
}
ans3=rand()%10;
while(1)
{
if((ans1==ans3) || (ans2==ans3))
ans3=rand()%10;
else
break;
}
ans4=rand()%10;
while(1)
{
if((ans1==ans4) || (ans2==ans4)|| (ans3==ans4))
ans4=rand()%10;
else
break;
}

printf("게임을 시작해봅시다n");
while(1)
{
printf(">>");
scanf("%d %d %d %d", &gss1, &gss2, &gss3, &gss4);

ball=countBall(ans1, ans2, ans3, ans4, gss1, gss2, gss3, gss4);
strike=countStrike(ans1, ans2, ans3, ans4, gss1, gss2, gss3, gss4);

printf(" : %d ball, %d striken", ball, strike);
if(strike==4)
{
printf("You Win!!nn");
break;
}
}
}
}
int countBall(int ans1, int ans2, int ans3, int ans4, int gss1, int gss2, int gss3, int gss4)
{
int count=0;

if((gss1==ans2)||(gss1==ans3)||(gss1==ans4))
count++;
if((gss2==ans1)||(gss2==ans3)||(gss2==ans4))
count++;
if((gss3==ans1)||(gss3==ans2)||(gss3==ans4))
count++;
if((gss4==ans1)||(gss4==ans2)||(gss4==ans3))
count++;

return count;
}
int countStrike(int ans1, int ans2, int ans3, int ans4, int gss1, int gss2, int gss3, int gss4)
{
int count=0;

if(ans1==gss1)
count++;
if(ans2==gss2)
count++;
if(ans3==gss3)
count++;
if(ans4==gss4)
count++;

return count;
}
프즈히
15/11/01 15:42
수정 아이콘
// 야구 게임의 룰에 대해서는 이해하고 있다는 가정 하에 설명드립니다.

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

int countBall(int ans1, int ans2, int ans3, int ans4, int gss1, int gss2, int gss3, int gss4);
int countStrike(int ans1, int ans2, int ans3, int ans4, int gss1, int gss2, int gss3, int gss4);

// C언어는 시간의 흐름에 따라 위에서부터 한 줄 씩 실행되는 언어입니다. 소설 읽듯이 논리의 흐름을 위에서부터 쭉 보시면 됩니다.

int main(void)
{
int ans1=0, ans2=0, ans3=0, ans4=0; // 일단 정답을 적어둘 메모지 4장을 준비합니다. 플레이어가 입력한 숫자랑 맞춰볼 숫자들 입니다. 그냥 덜렁 빈칸 두기도 뭐하니 일단 0이라고 써 둡시다.
int gss1=0, gss2=0, gss3=0, gss4=0; // 플레이어가 숫자를 기입할 수 있는 메모지 4장을 준비합니다. 그냥 덜렁 빈칸 두기도 뭐하니 일단 0이라고 써 둡시다.
int ball=0, strike=0; // 볼과 스트라이크 갯수를 적어둘 메모지를 준비합니다. 그냥 덜렁 빈칸 두기도 뭐하니 일단 0이라고 써 둡시다.

srand (time(NULL));
while(1) //이 가장 큰 범위의 중괄호 내부의 내용을 break;가 나올때까지 계속 반복합니다. 이게 어디서 끝나는지 잘 보세요.
{

ans1=rand()%10; // 메모지 ans1에 0~9 사이의 랜덤한 숫자를 적습니다.
ans2=rand()%10; // 메모지 ans2에 0~9 사이의 랜덤한 숫자를 적습니다.
while(1) //이 약간 작은 범위의 중괄호 내부의 내용을 break;가 나올때까지 계속 반복합니다.
{
if(ans1==ans2) // 만일 메모지 ans1에 적힌 숫자와 ans2에 적힌 숫자가 같다면,
ans2=rand()%10; // ans2는 다른 랜덤한 숫자를 적습니다. 왜냐면 게임 규칙 상 ans1과 같으면 안되니까요.
else // 다르다면
break; // 약간 작은 중괄호를 빠져나옵니다. 반대로 말하면 ans1과 ans2가 달라질 때까지 계속 반복되겠죠. 즉 이 시점에서 ans1은 ans2와 무조건 다릅니다.
}
ans3=rand()%10; // 메모지 ans3에 0~9 사이의 랜덤한 숫자를 적습니다.
while(1) //이 약간 작은 범위의 중괄호 내부의 내용을 break;가 나올때까지 계속 반복합니다.
{
if((ans1==ans3) || (ans2==ans3)) //만일 메모지 ans3의 내용이 ans1이나 ans2랑 겹친다면
ans3=rand()%10; // 다른 숫자를 적어 봅니다.
else
break; // 아까랑 똑같이 ans1, ans2 양쪽 어디에도 안겹치는 순간에 반복문을 빠져나갈 것입니다.
}
ans4=rand()%10; // 메모지 ans4에 0~9 사이의 랜덤한 숫자를 적습니다.
while(1) //이 약간 작은 범위의 중괄호 내부의 내용을 break;가 나올때까지 계속 반복합니다.
{
if((ans1==ans4) || (ans2==ans4)|| (ans3==ans4)) //만일 메모지 ans4의 내용이 ans1이나 ans2이나 ans3과 겹친다면
ans4=rand()%10; // 메모지 ans4에 0~9 사이의 랜덤한 숫자를 다시 적습니다.
else
break; // 아까랑 똑같이 ans4가 ans1, ans2, ans3 중 어디에도 안겹치는 순간에 반복문을 빠져나갈 것입니다.
}

// 자 여기까지 왔으면 메모지 ans1,2,3,4 에는 각자 다른 숫자가 랜덤하게 적혀있습니다.

printf("게임을 시작해봅시다n");
while(1)
{
printf(">>");
scanf("%d %d %d %d", &gss1, &gss2, &gss3, &gss4); // 플레이어의 키보드 입력을 통해 메모지 gss1,2,3,4에 사용자가 입력한 숫자 4개를 적어 둡시다.

ball=countBall(ans1, ans2, ans3, ans4, gss1, gss2, gss3, gss4); // 우리가 이미 알고있는 정답 4개와 사용자가 입력한 숫자 4개를 비교하여 볼 갯수를 구합니다. 구하는 과정은 countBall()이라는 함수 내부에서 이루어 집니다. 구한 볼 숫자는 ball이라는 메모지에 적습니다.
strike=countStrike(ans1, ans2, ans3, ans4, gss1, gss2, gss3, gss4); // 우리가 이미 알고있는 정답 4개와 사용자가 입력한 숫자 4개를 비교하여 스트라이크 갯수를 구합니다.구하는 과정은 countStrike()이라는 함수 내부에서 이루어 집니다. 구한 스트라이크 숫자는 strike라는 메모지에 적습니다.

printf(" : %d ball, %d striken", ball, strike); // 알아낸 볼과 스트라이크 수를 모니터에 보여줍니다.
if(strike==4) // 만일 스트라이크 수가 4개라면, 즉 정답을 맞췄다면
{
printf("You Win!!nn");
break; //게임을 끝냅니다. 가장 처음 나온 큰 범위의 while(1)이 여기서 끝나네요.
}
}
} // 아직 정답을 못 맞췄다면 다시 제일 위의 while(1)로 돌아가겠죠. 플레이어는 새롭게 게임에 도전합니다.
} // 더 실행할 게 없으므로 프로그램 종료


int countBall(int ans1, int ans2, int ans3, int ans4, int gss1, int gss2, int gss3, int gss4) // 볼 갯수를 구하는 과정이 적혀있는 함수입니다.
{
int count=0; // 볼이 총 몇개인지 갯수를 적어둘 메모지 count를 준비한 후 일단 0이라고 써 놓습니다.

if((gss1==ans2)||(gss1==ans3)||(gss1==ans4)) // 플레이어가 입력한 첫번째 숫자가 정답의 두,서,너번째 숫자랑 일치한다면
count++; // 볼을 하나 추가합니다. 만일 메모지 count에 0이 써있었다면 0을 지우고 1을 쓰겠죠.
if((gss2==ans1)||(gss2==ans3)||(gss2==ans4)) // 플레이어가 입력한 두번째 숫자가 정답의 첫,서,너번째 숫자랑 일치한다면
count++; // 볼을 하나 추가합니다.
if((gss3==ans1)||(gss3==ans2)||(gss3==ans4)) // 플레이어가 입력한 세번째 숫자가 정답의 첫,두,너번째 숫자랑 일치한다면
count++; // 볼을 하나 추가합니다.
if((gss4==ans1)||(gss4==ans2)||(gss4==ans3)) // 플레이어가 입력한 네번째 숫자가 정답의 첫,두,세번째 숫자랑 일치한다면
count++; // 볼을 하나 추가합니다.

return count; // 볼을 전부 계산해서 메모지 count에 적어놨습니다. 이 값을 메모지 ball에 옮겨 적습니다.
}


int countStrike(int ans1, int ans2, int ans3, int ans4, int gss1, int gss2, int gss3, int gss4) // 스트라이크 갯수를 구하는 과정이 적혀있는 함수입니다.
{
int count=0; // 스트라이크가 총 몇개인지 갯수를 적어둘 메모지 count를 준비한 후 일단 0이라고 써 놓습니다.

if(ans1==gss1) // 플레이어가 입력한 첫번째 숫자가 첫번째 정답과 같다면
count++; // 스트라이크를 하나 늘립니다.
if(ans2==gss2) // 플레이어가 입력한 두번째 숫자가 두번째 정답과 같다면
count++; // 스트라이크를 하나 늘립니다.
if(ans3==gss3) // 플레이어가 입력한 세번째 숫자가 세번째 정답과 같다면
count++; // 스트라이크를 하나 늘립니다.
if(ans4==gss4) // 플레이어가 입력한 네번째 숫자가 네번째 정답과 같다면
count++; // 스트라이크를 하나 늘립니다.

return count; // 볼을 전부 계산해서 메모지 count에 적어놨습니다. 이 값을 메모지 strike에 옮겨 적습니다.
}
용유진
15/11/01 15:44
수정 아이콘
친절하고 상세한 답변 매우 감사드립니다..
아트스
15/11/01 16:04
수정 아이콘
와 ... 저도 학교에서 c 언어 배우기시작했는데 전 정말 아무것도아니였네요 .. 능력자분들에게 감탄하고갑니다
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
75983 [질문] 웹커뮤니티 제작에 관해서 질문드려봅니다. [18] 양주오1664 16/01/11 1664
75979 [질문] 안드로이드 개발 시작하는 초심자 도와주세요. [6] 신예terran2074 16/01/11 2074
75897 [질문] 웹 서버 구축에 관한 전반적인 질문드립니다. [7] 양주오1675 16/01/09 1675
75717 [질문] cpu만 바꾸고 싶습니다 [7] 마마무1694 16/01/07 1694
74937 [질문] 안드로이드 문법(?) 질문입니다. [5] 트루키3067 15/12/25 3067
73487 [질문] 대략 이런 논쟁이 있었습니다. [62] 대장님너무과민하시네요4885 15/12/03 4885
73316 [질문] C++ 결과값 저장 질문입니다. [20] 비상6045 15/11/30 6045
71806 [질문] 코딩용으로 청축 vs갈축 어떤게 좋나요, [4] 삭제됨3161 15/11/07 3161
71439 [질문] C 언어 프로그래밍 질문입니다.. [8] 용유진3030 15/11/01 3030
71064 [질문] 자바 스크립트 / genetic algorithm 관련 질문입니다. [8] OrBef2569 15/10/27 2569
70079 [질문] 코딩공부라는게 뭘까요? [8] 삭제됨1591 15/10/13 1591
69997 [질문] 프로그래밍에 지식이 있으신 분! 질문하나만 받아주세요 [9] 티타늄2368 15/10/11 2368
68589 [질문] 매트랩 무작위 변수 생성? 시뮬레이션 질문좀 드릴게요. [6] 하디1476 15/09/18 1476
68540 [질문] 안드로이드 / 안드로이드 웨어 독학할만한 서적 추천 부탁드립니다. 이걸어쩌면좋아1195 15/09/17 1195
67849 [질문] JAVA 간단한 질문입니다. [2] Riffrain1075 15/09/06 1075
63119 [질문] jquery 책 추천받습니다. [2] 포도사과2314 15/06/26 2314
62125 [질문] 게임 기획 지망생 노트북 구매 5개 모델 중 추천을 받고싶습니다. [2] 포도1797 15/06/12 1797
59967 [질문] 인상깊었던 영상을 찾습니다. 오큘러스754 15/05/14 754
59822 [질문] 오늘 팝업 광고 노출 문제 격으신분 계신가요? [2] homy2969 15/05/12 2969
58505 [질문] 코딩용 노트북 추천 부탁드립니다. [17] 클로로 루시루플18047 15/04/23 18047
57684 [질문] USB 에 있는 파일을 자동으로 메일로 보내는 프로그램 없을까요? [2] 화이트데이1295 15/04/11 1295
53808 [질문] 코딩 연습 및 실력 늘리는 방법 [4] iPhone62797 15/02/14 2797
53637 [질문] 코딩 배우기 [11] roastedbaby2401 15/02/11 2401
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로