|
네부분으로 나누어 생각해보았음다.
1. 컴퓨터->난수발생 void CreateRandomValue()
- vector<int> secret; 난수 저장 변수 설정.
- randomize(), random() 으로 실행시 마다 다르게 변수를 생성하도록..
- 생성된 난수가 서로 겹치지 않도록...
2. 사용자 입력
- vector<int> answer;
3. 1),2) 비교 int CompareAnswer()
- 전 2,3을 한 함수에서 처리했어여.
- for문 두개로 secret 와 answer 를 비교해서 strike 수를 리턴 하도록...
4. 결과 출력
- strike 수가 3 과 같으면 종료.
* 숫자의 갯수가 3으로 고정된게 아니라 사용자로부터 개수를 얻어 할려다 보니.
1번 구현에서 애매하더 군요.. ㅡㅜ goto 문을 쓰고 말았는데...
randomize();
for(int i=0;i<LimitNumber;i++)
{
again : temp = random(10); // 일단 임시 변수에다 난수 발생으로 숫자를 얻고..
for(int j=0;j<secret.size();j++) // 같은 숫자가 secret 에 존재한다면
{ // 다시 again 으로 가 난수를 얻어온다.
if(secret.at(j) == temp)
goto again;
}
secret.push_back(temp); // 서로 겹치치 않는 숫자만 추가 한다.
}
이렇게 하고 숫자 개수를 10으로 하면 0~10까지 겹치지 않게 들어 가더군요. 썩 보기 좋은
코드는 아니군요 ㅡㅜ
2,3번 구현은 뭐 사용자 입력 받는것은 잘 아실 테고, 비교하는 것은 역쉬 두개의 for문으로 돌렸슴다.
for(int i=0; i<secret.size();i++)
for(int j=0; j<secret.size();j++)
{
if(secret.at(i) == answer.at(j))
{
if(i==j) strike++;
else ball++;
break; // 난수들이 서로 독립적이므로 일단 같은 숫자가 발견되면
} // 더이상 진행할 필요가 없죠.
}
요로콤시 하면 strike,ball 개수를 얻을수 있죠. out은 난수 갯수에서 strike,ball을 빼면 그게 out 갯수겠죠.
여기서 strike 를 리턴 시키는 거죠.
음... 너무 복잡한가요 ^^;;; 열띠미 썻는데
더 낳은 함수도 많을꺼에요 힘내세요.
*** 첨부 겜에서 사용자 입력할때 엔터 보다는 탭으로 숫자를 구분하는게 보기 좋고.
마지막 숫자를 넣을 때만 엔터 치세요.
띠아블 님이 쓰신 글 :
: 옛날 놀이중 스트라이크/아웃 게임을 알고 계십니까???
: 만약 내가 375 라는 숫자를 남이 모르게 쓰고 상대방이 276 을 쓰면 ...
: 원 스트라이크 투 볼... 1s 2b...
: 375 를 쓰면 아웃... out
: 이런 프로그램을 짤수 있을 까여...
: 술래는 컴이 하구 제가 맞추는...
: 컴이 임의에 숫자 3개를 만들고 제가 그 숫자를 맞추는 게임...
: 아무리 생각 해도 머리에 정리가 되지 않는...
: 부탁 드립니다...
: 임의 숫자
: 375
: 237...3b (쓰리볼)
: 385...2s1b (투스트라이크 원볼)
: ....
|