안녕하세요..__)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int you(int);
//int pp(int (*)(int), int user);
int temp();
int main(int){
int value;
int com, user;
int (*pp)();
pp=&temp;
srand((unsigned int) time(NULL));
while(value<2){
com=rand()%3+1;
user=(*pp)();
//user=temp();
you(com);
if(user > 4){
printf("잘못입력하셨습니다.n");
goto U;
}
int pro;
pro = user - com;
switch(pro){
case 2: printf("졌습니다.n"); break;
case 1: printf("이기셨습니다.n"); break;
case -1: printf("졌습니다.n"); break;
case 0: printf("비겼습니다.n"); break;
case -2:printf("이겼습니다.n"); break;
}
printf("계속 하시겠습니까? [1]예. [2]아니오.n");
scanf("%d",&value);
}
U:
printf("프로그램을 종료합니다.n");
return value;
}
int temp(){
int q;
int user;
printf("우리들의 국민게임 가위 바위 보~ 게임!!n");
printf("가위[1] 바위[2] 보[3]n");
scanf("%d",&user);
switch(user){
case 1:
printf("가위를 내셨습니다.n");
break;
case 2:
printf("바위를 내셨습니다.n");
break;
case 3:
printf("보를 내셨습니다.n");
break;
}
q=user;
return q;
}
int you(int com){
switch(com){
case 1: printf("가위n"); break;
case 2: printf("바위n"); break;
case 3: printf("보n"); break;
}
return com;
}
이 소스가 가위바위보 프로그램 소스입니다.
문제는
가위바위보 프로그램을 만들되 함수와 포인터를 사용하라는 것이 었고요.
제가 이 소스를 짠게 아니라..
모르는 부분이 많습니다..
먼저 srand 부분 전혀 이해 안가고요 .
srand((unsigned int) time(NULL));
이부분에 왜 unsigned int를 쓰는지 그리고 time뒤에 NULL은 왜 쓰는지
만약 실수 부분이면 unsigned int 를 float로 바꿔 써야되는지
그리고 srand가 왜 rand 함수랑 같이 쓰이는지
srand 함수에서 값이 나오면 어디에 저장되는지 그리고 저장된 값이 어디에서 사용되는지
함수 포인터 사용 부분이 이해가 안갑니다.
함수 포인터 부분은 하나도 이해가 안가기때문에 차근 차근 설명 부탁드릴께요..__)
부탁드립니다..__) 이해하기 쉽도록 설명해 주세요 아직 C언어 초보라..^ ^
부탁드리겠습니다..__)
rand()는 그냥 쓰게 되면 얼핏보면 랜덤한 값이 나오는 것처럼 보이지만, 실제로는 어떠한 랜덤 테이블에 의해 지정되어 있는 숫자가 나오는것 뿐입니다.
즉, 아무런 조치없이 rand()값을 계속 출력하다 보면 프로그램을 실행할때마다 같은 값들이 순서대로 나오게 되죠. 그래서 진정한 의미의 랜덤값이 의미가 없게 되어버립니다.
그것을 srand()로 순서를 섞는 것입니다.
그 안에는 time(NULL)은 time.h에 정의되어 있는, 현재의 시간을 밀리 세컨드단위로 가져오는 함수입니다.(맞던가 --)
이 리턴값은 time_t라는 형으로 리턴되는데요, 말이좋아 time_t 형이지 실제로는 DWORD, 즉 4바이트 unsigned int값이기도 합니다. 실제로는 별반 다를게 없는 데이터 형태이지만, 일단 데이터 타입은 다르기 때문에 srand()에서 인자로 요구하는 unsinged int 형으로 형변환을 시켜주는 겁니다.(이렇게 해도 실제 변동되는 값에는 변함이 없습니다. 하지만 float형으로 형변환은 하면 데이터가 유실될 뿐더러, 다시 unsigned int 형으로 강제로 형변환이 일어날 것이므로 제대로된 효과를 보지 못합니다.)
이렇게 되면 밀리세컨드 단위로 얻어오는 시간으로 인해 rand()의 테이블이 어떻게 초기화 될지 모르게 되므로(저는 이러한 것을 rand()값을 뒤흔들어 버린다라고 표현하긴 합니다만 --) 불규칙한 rand()값을 얻어낼수 있게 되는 것입니다.