반응형

도전6. 친구와 둘이서 숫자 맞추기 게임을 해 본적이 있을 것이다.(보통은 야구 게임이라고 불리고 있다.) 이것을 컴퓨터와 할 수 있도록 프로그램을 작성해 보자. 게임의 방식은 다음과 같다.

 

컴퓨터는 0에서 9사이의 숫자 중에서 서로 다른 세개의 숫자를 고르고, 사용자는 이것을 ㅁ자추는 게임이다. 중요한 것은 숫자의 순서까지 정확히 맞춰야 한다는 것이다. 단, 사용자가 예상한 숫자를 입력할 때 마다 컴퓨터는 입력된 숫자와 컴퓨터 자신이 생각한 숫자가 얼마나 비슷한지를 알려준다. 

 

예를 들어서 컴퓨터가 고른 숫자가 "1 4 9"이고, 사용자가 입력한 숫자가 "4 0 9"라고 하면 두 개의 숫자 4와 9가 일치한다. 9는 숫자와 위치까지 일치하지만(1 strike), 4는 숫자만 일치한다(1 ball). 이런 경우 컴퓨터는 다음과 같은 메시지를 출력해 준다. "1strike, 1ball", 만약에 사용자가 "1 4 9"를 입력하였다면 "3strike, 0ball" 이 되어서 프로그램은 종료하게 된다. 이때 몇 번 만에 3strike를 얻어냈는지에 대해서도 출력해 주기로 하자(진행하면서 "몇 번째 도전입니다." 라는 메시를 출력해 줘도 좋다,) 

 

 

내용만 거창하지, 2가지만 생각하면 됩니다. 

1. 서로 다른 3개의 난수를 어떻게 만들어 낼 것인가? 

2. strike 와 ball 을 어떻게 구분할 것인가? 

이렇게 두가지 입니다. 

 

1번먼저 생각해 봅시다. 

서로 다른 3개의 난수를 만들어 내는 방법에는 2가지가 있습니다. 

첫번째는, 난수를 하나씩 만들면서, 중복되면 다시 만드는 방법 이고 

두번째는, 미리 난수의 범위의 배열을 만들어 놓고 배열을 섞어 이용하는 방법입니다. 

여기서는 두번째 방법을 사용할 것이고, 

 

2번같은 경우에는 

컴퓨터 배열과 사용자 배열을 비교해 나가면서, 값이 같은 경우에, 

인덱스가 같으면, 스트라이크, 인덱스가 다르면 볼 로 처리하면 됩니다. 

 

 

의사코드입니다. 

 

길이가 10인 배열을 선언하고 0부터 9까지 넣는다. 

 

for ( 적당히 많이, 얼마나 하는지는 중요하지 않음, 잘 섞이게만 하면 된다. ) 

{ 

   0에서 9까지의 난수 2개를 발생시켜 

   그 두개의 난수 인덱스의 배열값을 바꿔준다. 

} 

잘 섞고나서 인덱스 0, 1, 2 값을 임의값 3개로 사용한다. 

 

 

무한루프 

{ 

  스트라이크, 볼 값 0으로 초기화 

  카운터 변수++ 

  사용자로부터 3개의 수를 입력받아 배열에 넣음. 

  for(0부터 2까지) 

    for(0부터 2까지) 

     { 

     컴퓨터 배열과 사용자 배열을 비교하여, 

     값이 같을때, 인덱스도 같다면 

     스트라이크 ++ 

     값이 같을때, 인덱스가 다르면 

     볼++ 

     } 

 스트라이크가 3이면 

 반복문 탈출

} 

 

요정도 밖에 안됩니다. 

 

 

실제코드입니다. 

 

15 ~ 25번째줄을 잘 보시면,

15번째줄에서 시드값을 시간으로 설정하고,

미리 선언해놨던, 난수 범위의 배열 comarr를

난수 2개를 받아 적절히 섞는것입니다.

 

계속 스왑을 하는것이기 때문에, 저 위에서의 난수 a와 b가 같은값이 나와도 전혀

문제가 되지 않습니다. 10000번 섞기 때문이죠.

이렇게하면 난수발생시, 중복에 신경안쓰고 쉽게 난수를 발생시킬 수 있습니다.

 

나머지는 어려운것 없습니다.

41번째줄에서, 반복문을 돌며, 배열 2개값을 비교할때, 값이 같은 경우,

인덱스까지 같으면 스트라이크, 인덱스가 다르면 볼로 처리한뒤

스트라이크가 3개일때만 반복문을 탈출하게 했습니다.

 

 

실행결과입니다.

각각 3번의 다른 실행결과를 편집한 것입니다. 

 

이상입니다. 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기