본문 바로가기

전체 글

(17)
1-7 숫자야구 게임 완성하기 (한셀/VBA) 한셀에도 엑셀처럼 코드를 짤 수 있는 기능이 있습니다. 이름은 엑셀과는 다르게 VBS(Visual basic script)라고 부른다고 합니다. 도구 - 매크로 - 스크립트 편집기(C)를 누르거나, Alt + F11로 들어갈 수 있습니다. 모듈 삽입을 하고 Module에 들어가줍니다. 이제 여기다가 코드를 입력하면 됩니다. 코드는 엑셀에서 사용한 코드와 거의 동일합니다. 한셀의 VBS의 경우 엑셀과는 다르게 RandBetween 함수를 사용할 수 있습니다. Sub main() Range("B5:B14").Select Selection.ClearContents Range("B5").Select Do '중복되는 숫자를 없애기 위함 a = RandBetween(123, 987) Cells(1, 1) = a L..
1-6. 숫자야구 게임 완성하기 (엑셀/VBA) 이제 숫자를 찍을때 마다 Random 함수가 새로운 난수로 바뀌는 문제를 해결해보겠습니다. 이를 위해 VBA를 활용하겠습니다. 시작할때 버튼을 누르면 난수를 A1에 저장해주고 B를 초기화 시켜줍니다. 버튼을 누르지 않으면 A1에 저장된 값은 초기화 되지 않으므로 게임을 진행하는 도중에 값이 바뀌지 않습니다. 그리고 숫자가 112와 같이 중복되는 숫자가 나오면 새로운 난수로 바꾸어 주는 기능도 추가하겠습니다. 엑셀의 기본 함수만으로는 할 수 없는 반복 작업과 같은 것을 할 수 있게 해주는 것이 VBA 입니다. 엑셀 위에 있는 보기에서 매크로 기록을 눌러줍니다. 확인을 누르고 바로 기록중지를 해서 아무 기능을 하지 않는 매크로를 하나 만듭니다. 이 매크로 편집을 위해 매크로 보기를 눌러서 매크로1를 편집하겠..
1-5. 숫자야구 - 같은 숫자가 있는지 확인하기 A5 부터 A14까지 1부터 10까지의 숫자를 적어두겠습니다. 게임을 할때 B5부터 B14에다가 예상하는 숫자를 적으면 C5 에서 C14까지 예측값이 정답과 어떤 관계인지 알려주는 것을 만들어 보겠습니다. 예시의 숫자는 297이므로 B5에다가 123으로 찍게 되면 C5에는 숫자 한개가 맞고 위치는 맞지 않으니 0S1B라고 출력이 되어야 합니다. 저렇게 표시가 되는 시스템을 만들기 위해서 예측을 한 B에 있는 숫자를 D부터 F에다가 분해해보겠습니다. 분해하는 것은 https://yijh0611.tistory.com/6 이 글에 있는 방법과 동일합니다. 엑셀에는 아주 좋은 기능이 있어서 C1에서 E1까지 드래그후 복사 D5에다가 붙여넣기 하면 바로 숫자가 분해됩니다. 이전에 만들어둔 함수를 그대로 복사해주는..
1-4. 숫자야구 - 중복된 확인 (if) 숫자 야구 게임에서 232와 같이 2가 두번 나오는 숫자는 제외 되어야 합니다. 사용하면 안된다는 룰이 따로 있는지는 잘 모르겠지만, 중복이 되는 경우는 제외하는 것이 게임을 더 깔끔하게 만들어주니, 이 경우는 제외하는 방향으로 게임을 만들어 보겠습니다. 이 방법에 대해서는 분명 더 좋은 방법이 있을 것 같긴 하지만, 그래도 제가 한 방법을 소개해 드리겠습니다. 그냥 참고만 하시면 됩니다. 원리는 이렇게 됩니다. 123이라는 숫자가 있다면, [1,2], [1,3] ,[2,3] 이런식으로 두개씩 비교를 합니다. 비교를 해서 숫자가 중복이 된다면 1점, 중복이 되지 않는다면 0점을 줍니다. 세 번의 비교에서 얻은 점수가 0점이라면 중복이 되지 않는 것이고, 세번의 비교에서 얻은 점수가 1점 이상이라면 중복이..
1-3. 숫자야구 자리수 별로 숫자 뽑아내기 (Mod) 엑셀에는 MOD라는 함수가 있습니다. MOD는 어떤 수를 다른 수로 나눈 나머지를 구하는 함수입니다. 10을 3으로 나누면 10 = 3*3+1이므로 나머지가 1입니다. MOD 함수는 셀에 =MOD(10,3) 이런식으로 적습니다. 이 함수는 10을 3으로 나눈 나머지라는 뜻입니다. 이 함수를 이용하면 숫자를 자리수 별로 나누는 것이 가능해집니다. 214라는 3자리 자연수를 각 자리수로 숫자를 분해하면 2,1,4가 됩니다. 214에서 1의 자리의 4를 뽑아내는 것은 어렵지 않습니다. 214를 10으로 나눈 나머지는 1의 자리(4)이기 때문에, MOD(214,10)을 하면 1의 자리를 뽑아낼 수 있습니다. 214에서 1을 뽑아내는것은 한단계를 더 거쳐야 합니다. 우선, 214에서 4를 뺍니다. 그럼 210이 ..
1-2. 숫자야구 난수 생성(randbetween) 엑셀에서 난수를 만드는 방법은 다양하다. 대표적으로 두가지 함수가 있는데, RAND 함수와 RANDBETWEEN 함수이다. RAND 함수는 0부터 1 사이의 난수를 만드는 함수이다. 0부터 1사이의 난수를 2부터 10 사이의 난수로 바꿔주는 간단한 수식을 이용하면 2부터 10사이의 난수를 얻을 수 있다. 8*RAND()를 해주게 되면 0부터 8사이의 난수로 바뀌게 되며, 여기에 2를 더해주게 되면 2부터 10사이의 난수를 얻게 되는 것이다. 식으로 표현하면 =2+8*RAND()가 된다. 실수가 아닌 정수나 자연수를 얻고 싶다면 반올림 함수를 추가적으로 사용해주면 정수를 얻을 수 있다. RANDBETWEEN 함수는 지정한 범위 내에서 무작위로 정수를 만들어주는 함수이다. 활용은 RNADBETWEEN(1,1..
1-1. 숫자야구 만들기 숫자야구 게임을 본격적으로 만들기 전, 게임을 만들기 위해 어떤 기능들을 알아야 하는지 생각해보자. 게임 진행을 보면, 우선 컴퓨터가 난수를 생성해야 한다. 그러므로 시작할때 난수를 생성하는 함수를 알아야 한다. 그리고 각 자리수 별로 숫자가 같은지 다른지도 파악해야 하기 때문에, 숫자를 자리수 별로 구분하는 방법을 알아야 할 것이다. 제가 만든 숫자야구 게임에서 자리수 별로 숫자를 구분하는 기능은 mod(나머지)를 이용해 구현 했으며, 난수는 randombetween 함수, 비교할때는 if 함수를 사용했다. 엑셀 함수를 아시는 분들은 이정도 아이디어면 충분히 게임을 구현할 수 있을 것이다.
1. 숫자야구 숫자야구란? 숫자야구는 램덤으로 생성한 자연수를 맞추는 게임이다. 주로 세라지 및 네자리 자연수를 맞추된다. 랜덤으로 생성하는 자연수를 만들때 주의 할 점은 각 자리수의 숫자는 모두 다른 수로 이루어져야한다. 예를 들어 112 같은 경우 1이 두번 등장하므로 안된다. 490처럼 모두 다른 숫자를 사용해야하며, 012 같은 숫자는 본 예시에서는 안되는 것으로 게임을 만들었다. (실제로 저렇게 해도 되는건지는 잘 모르겠다) 정답을 123이라고 할때, 이 숫자를 맞추는 방법은 우선, 아무 세자리 자연수를 찍는다. 513이라고 찍어보겠다. 513과 정답인 123을 비교해보면 1과 3은 둘다 가지고 있다. 3의 경우 위치도 둘다 1의 자리수로 동일하다. 이 경우 컴퓨터는 1S1B이라고 알려준다. S는 야구에서 스..