c언어로 야구게임 만들어오라길래
밑에처럼 해봤는데 진심 핵노답급임
문제가 되는게
스트라이크랑 볼의 카운트가 올라가질 않음 암만봐도 난수가 안잡히는거 같다.
그리고 0을 넣어도 종료가 안됨 if문 넣었는데 왜 종료가 안되냐
아 제발 좀알려줘라 힘들어
이거 한다고 두뇌 과부하 걸려서 쓸수도없는 똥머리가 멈춰버림
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void main()
{
char input[10]; // 입력받을 배열
int randNum[3]; // 난수를 저장할 배열
int i, j; // 반복문에 사용할 변수
int size; // 배열의 크기를 구하여 저장할 변수
int randOne; // 하나의 난수값 저장할 임시 변수
int strikeCnt=0; // 스트라이크 개수 저장할 변수
int ballCnt=0; // 볼 개수 저장할 변수
srand((unsigned)time(NULL)); // 난수 발생기 초기화 한번만 사용
(rand() % (8))+1;
//rand() : 0부터 무한대의 정수 형태의 난수 발생 함수
// 1~9까지의 난수 발생
//1. 반복문을 이용하여 3개의 난수를 구하여 randNum 배열에 저장. 중복값 없도록 체크
// 2. 세 자리의 숫자 형태의 문자열을 입력받아 randNum 배열의 값과 비교.
// 위치와 숫자가 같으면 스트라이크, 위치가 다르지만 숫자가 같으면 볼.
// 0을 입력하거나 3스트라이크가 되면 프로그램 종료.
printf("게임을 시작합니다.n");
for(i=0; i<3; i++)
{
randNum[i]=rand() % 8+1;
for(j=0; j<i; j++)
{
if(randNum[i]==randNum[j])
{
i--;
break;
}
}
}
while(1)
{
printf("숫자를 입력하세요(종료는 0) : ");
scanf("%s",input);
if(input == 0)
{
break;
}
if(input[0]==input[1]||input[0]==input[2]||input[1]==input[2])
{
printf("중복된 숫자는 입력할 수 없습니다.n");
continue;
}
if(input[3] != NULL)
{
printf("세자리 수를 입력하세요n");
continue;
}
for(i=0; i<3;i++)
{
for(j=0;j<3;j++)
{
if(randNum[i]==input[j]&&i==j)
strikeCnt++;
if(randNum[i]==input[j]&&i!=j)
ballCnt++;
}
}
if(strikeCnt==3)
{
printf("정답입니다.n");
break;
}
printf("%d 스트라이크 %d 볼입니다.n",strikeCnt,ballCnt);
strikeCnt=ballCnt=0;
fflush(stdin);
}
}
그래 무엇이 궁금한것인가?
소스 분석중이다
1. 스트라이크랑 볼의 카운트가 올라가질 않아. 이거는 내 생각에 난수가 지정이 안되는거 같음
2.if문에 input == 0으로 해서 break를 걸었는데 0을 넣어도 종료가 되지 않아
3.게임을 3자리를 입력받아서 진행을 해야되서 input[3] == NULL 이 오면 세자리 숫자를 입력하라는 메세지가 뜨게했는데 2개이하로 입력을했을대도 똑같은 메세지가 출력되게 하고싶어
진짜 머가리 터질꺼같에 이 똥대가리좀 도와줘 ㅠㅠ
반정도 분석결과 , 1번문제는 문제없음. 2번의 경우 문자열을 정수로 비교하고있음.. Input을 문자열이 아닌 정수입력으로 변경해야 앞으로 처리하는데 효율적임.
3자리 숫자를 입력받았다면 100의자리 10의자리 1의 자리로 나누는 일은 쉬울꺼라고 생각됨. 자료형을 통일하도록.. 문자열을 쓸꺼면 난수부터 모든 비교문을 문자열로.. 정수를 할꺼면 정수로.. 지금 문제는 정수와 문자열이 서로 복합적으로 사용되고 있음에도 서로간 자료형 변경없이 비교하고 있기때문에 정상적으로 처리되지않음.
아.... 근대 이게 내가 처음부터 만든게 아니라 학원 선생님이 내가 잘몰라해서 질문했더니 토대를 어느정도 짜주셨거든? 주석달려있는거는 선생님이 짜준건데 char형으로 썻길래 최대한 맞춰본건데...
그럼 일단 2번은 if(input=='0') 이렇게 하라는거야?
input[0] == '0'으로 하던가 strcmp함수를 이요해야됨.
음... 그렇구나.. 그럼 1번은 문제없다는건 무슨소리야? 볼이랑 스트라이크 카운트가 올라가?
난수가 지정아 안된다는것 같길래.. 난수 지정에는 문제없다고 한소리임.
이제 나머지 부분 분석해봄.. 냉장고를 부탁해 보느라 정신없음.
아니야 도와주는거로도 충분히 고마운데 천천히라도 알려줘... 사랑한다 진심
그리고 3번은 내가 if(input[3] != NULL)이걸 써서 배열의 마지막에 NULL문자가 아닌게 들어오면 "세자리 정수를 입력하세요"라고 해놨는데
2자리 이하의 숫자를 입력했을때 저게 출력하게 하려면 if(input[3] != NULL || sizeof(input) == 2)이렇게 해봤었는데 왜 안되는거야?
randNum[i]==input[j] 이부분이 문제인대 randNum은 정수형 변수 배열이고 input은 문자열 즉 char형 배열임.. 너가 input에 입력한 숫자들은 숫자 그자체가 들어가는게아니라 아스키코드가 저장되기때문에 숫자 정수와 아스키 숫자를 비교하면 당연히 좋은 결과를 얻을수 없을것임..
sizeof는 해당 변수의 크기를 반환하는 함수로 문자열 즉 Input의 길이를 알기위해서는 strlen이라는 함수를 이용해야됨.
와...ㅇㅇ형 고마워 이해가 잘되네.. 그럼 input앞에 (int)를 붙여서 int형으로 바꿔주면 되는건가?
(int)는 강제 형변환으로 만약 문자'0'은 아스키로 10진수 48임. (int)해봐야 너는 48과 0~9를 비교하는 꼴이기 때문에 틀림.. 문자'0'을 숫자 0으로 바꾸기 위해서는 atoi라는 함수를 이용하던가 문자'0'의 아스키 코드값인 48을 빼줌으로 숫자 0을 만들수있음 Input[ i] - 48을 하면 정수로 변환할수있음.
근대 학원 선생님이 저 틀에 맞게 만들어 오라해서ㅠㅠ 인터넷 뒤져봤는데 다들 %d로 받길래 왜그런가했는데 ㅠㅠ
그럼 저상태에서는 아예 야구게임 만드는게 안되는거야?
학원 선생님이 기본틀을 짜줄때 input을 char형으로 써서 배열을 받은다음에 만들라 하셔서 난 되는건지 알았지
학원 선생님이 뭔가 생각한게 있지 않을까
정수로 입력받는게 가장좋은방법이긴한데.. 굳이 문자열을 써야한다면 상황에 맞게 변환을 해주어야됨.
뭐 서로 다른 자료형의 비교를 학습하길 원해서 그럴수도있지.
115143형 나 진짜 저거 까지만 도와주면 안될까 ㅠㅠ 아무리 머리를 굴려도 잘 모르겠어 형이말한 atoi함수는 배운적도 없어
기다려봐 바꿔줄께
115143형 진짜 고마워 ㅠㅠㅠㅠ
글 올림.