반응형


 목차

 1. [조건문]Select Case문

2. [함수] Randomize

3. [코딩] 가위바위보


안녕하세요~


오늘은 가위바위보 게임을 만들어 볼거에요.



이런 개사기 가위바위보 말고...정정당당한 가위바위보 프로그램을 짜봅시다...


그전에 배워야 할 것이 두가지가 있어요!






1. [조건문]Select Case문


그러기위해서 필요한 IF문과 똑같은 성질을 지닌

다른 조건문을 다뤄보도록 할게요~


그건 바로,

C언어에서 Switch문과 비슷한 기능을 하고 있는

Select case 문!


Select Case. 뭔가 떠오르지 않으세요?

선택 조건


선택된 변수가 각각의 케이스에 따라 변하겠죠?

그 케이스에 따라 실행될 명령을 줄 수 있는 기능입니다.


IF문의 경우 TRUE/FALSE 둘중 하나만 선택가능하죠?


조건식이 참일경우와 거짓일 경우.


하지만 Select문은 여러가지 케이스를 넣을 수 있습니다.


쉽게 예제를 보여드릴게요.

가위바위보 게임을 하는데,

0을 '가위'

1를 '바위'

2을 '보'

라고 가정할게요.


다중 IF문

Dim A As Integer


If A=0 then

   Msgbox "가위를 내셨습니다."

 Else

   If A=1 then

      Msgbox "바위를 내셨습니다."

   Else

      If A=2 then

         Msgbox "보를 내셨습니다."

      End If

   End If

 End If

이해하기 쉽게 각각 IF문의 색깔을 다르게 해볼게요.

Dim A As Integer


┌If A=0 then

Msgbox "가위를 내셨습니다."

├Else

│ If A=1 then

│ │   Msgbox "바위를 내셨습니다."

│ Else

│ │ If A=2 then

│ │    Msgbox "보를 내셨습니다."

│ │ End If

│ End If

End If


가장큰 IF문 안에 두번째 IF문이 들어갔고,

그 안에 또 세번째 IF문이 들어갔죠.

헷갈리죠?



총 3번의 If을 썼어요.

지금은 가위 바위 보를 예시를 들었지만

나중에는 RPG게임 같은 걸 코딩 한다고 했을때

캐릭터 움직임과 공격 같은 걸 한다고 가정해봐요


그럼

상, 하, 좌, 우, 공격키, 방어키, 스킬키, 인벤토리, 옵션창......

각각 전부다 키입력을 받는 IF문을 다 만들어주게 되겠죠.

그럼 엄청나게 코딩이 불어날거에요.


이걸 가독성도 올리고 (*가독성-프로그래머가 읽기 쉬운 정도)

코딩 양도 줄고, 이해도 빨라 지겠죠?


자, 그럼 저 IF문을 가지고 Select Case문으로 바꿔 볼게요.


Dim A As Integer


Select Case A

Case 0

   Msgbox "가위를 내셨습니다."

Case 1

   Msgbox "바위를 내셨습니다."

Case 2

   Msgbox "보를 내셨습니다."

End Select

깔끔 하게 딱 떨어지죠?



이걸 좀더 코딩스럽게 바꾼다면

Dim A As Integer

Dim B As String


Select Case A

Case 0

   B = "가위"

Case 1

   B = "바위"

Case 2

   B = "보"

End Select

Msgbox B & "를 내셨습니다."

이렇게 되겠죠? (최대한 잘게 쪼개는걸 좋아하는 무꼬)


자, 그럼 IF문과 형제인 Select Case문 강의도 끝났습니다!

아 진짜 잘 가르치는듯..



2. [함수] Randomize




자, Randomize. 이게 뭘까요?

사전적 의미로는


임의 추출하다, 임의로 순서를 정하다. 라는 뜻인데요.

비주얼 베이직에서 이녀석이 하는 기능은


난수 생성기(랜덤 함수)를 초기화 하는 것 입니다.

팁을 드리자면,


사람에게 아무숫자나 생각해보세요~

라고 말하면 진짜 말그대로 랜덤한 숫자를 뽑아 낼 수 있겠죠?

165897, 1884111, 897516...등등...


하지만, 컴퓨터에게 "야, 랜덤한 숫자를 불러와!"

라고 했을때 어떻게 반응할까요?


사고력이 없는 컴퓨터는 그게 무슨말인지 모릅니다.

지정된 숫자 안에서 연산을 하고 지정된 명령에 따라 결과를 도출하는 컴퓨터에게는

절대로 불가능한 것입니다.


그럼? 우리가 컴퓨터에서 자주보는 난수(랜덤)값은 어디서 나오는 걸까요?

절대로 컴퓨터는 난수라는 개념을 생성할 수가 없습니다.

그럼 컴퓨터가 알아먹을 수 있는 틀 안에서 '난수가 생성되는 것 처럼 보이도록' 가능한 방법은 뭐가 있을까요?


바로 '시간'입니다.





시간은 계속 흐르고 있습니다.

다시 말해 매시, 매분, 매초, 매m/s...계속 시간은 흐르고 있죠.

그렇다면!!!

그 계속 흐르고 있는 시간 중에

사용자가 "랜덤 값을 띄워라!" 라고 명령했을 때,

컴퓨터는 흐르고 있는 시간을 캐치해서

숫자를 보여준다면?


계속해서 다른 숫자가 나오겠죠?


사실 조금 더 많이 복잡하지만 이와 원리가 같습니다.


아무튼 '난수'라는 개념만 놓고,

더 더 깊게 생각해보면 어떠한 규칙이 있을 수도 있다는 말입니다.

물론 그 규칙을 발견해서 예측을 하는 매니악한 해커도 있지요.


그럼 서론은 치우고,

Random 함수에대해 배워볼게요.


우선 비주얼 베이직에서는

랜덤 함수를 사용하기 전에 무조건 Randomize 라고 선언처럼 입력해줍니다.

왜 그러냐면


Random이라는 개념이 없다고 분명히 서론에서 말씀드렸죠?


Randomize를 미리 선언해주지 않고 함수를 사용하게 되면

랜덤함수가 발현 되었을때,

난수가 하나 만들어 집니다.

그 후, 다시 랜덤함수를 불러오면.


처음에 발현되었던 그 난수를 계속 반복해서 쓰게 됩니다.


쉽게 말해,

"랜덤 값 하나줘!" 라고 말했을때

 컴퓨터가 "자 내가 내놓은 랜덤값은 123이야."

라고 123이란 숫자를 뱉어냈습니다.


그리고 조금있다가

다시 "랜덤값 하나 더 줘!" 라고 말했을때

컴퓨터는 "어? 아까 가져갔잖아. 아까 말했다시피 내놓은 랜덤값은 123이야."

또 다시 123이란 값을 내뱉습니다.

..백번 천번 반복해도

처음 내뱉었던 123이란 값을 계속해서 뱉어냅니다.


그럼 어떻게 해야하냐


바로 난수생성기 초기화 함수인 Randomize 를 사용하시면 됩니다.


Randomize를 미리 써놓고

"랜덤값 하나줘!" 라고 말하면

처음에 123을 내뱉었다가


두번째에 또 "랜덤값 하나 더 줘!" 라고 말했을때

컴퓨터는

"응? 내가 언제 랜덤값을 준적있나? 초기화되어서 기억이 안나네. 에이 그냥 다시 만들어 줄게 자 111이야."


이렇게 되는 거죠.


이해하셨으면

직접 Random 함수를 사용해봅시다.


간단하게 1~10 숫자중에 아무거나 랜덤으로 값이 나오게 해볼게요.

랜덤값을 받을 RandINT 라는 변수를 선언


Dim RandINT As Integer 

Randomize

RandINT = (10 * Rnd()) + 1

Msgbox RandINT



이렇게 하면 서브가 실행 될때마다

1~10까지 랜덤으로 구한 숫자를 메세지 박스에 띄울겁니다.


다른거 다 필요없고,


RandINT = (10 * Rnd()) + 1

이 부분만 볼게요


Rnd() 함수는 난수 생성기에 있는 1을 넘지 않는 실수(Float)를 가져오는 함수입니다.

Rnd()함수는 결국 0 부터 0.99999..... 의 숫자들중 하나를 임의로 가져오는 거죠.

만약 난수생성기가 비어있다면 난수 생성기를 한번 돌린 후, 가져오고,

만약에 난수 생성기에 이미 한번 돌린 숫자가 있다면 그걸 그대로 가져옵니다.


그럼 RandINT라는 정수형 변수에 


난수 생성기가 뱉어낸 숫자를 하나 가져옵니다.

예를들어 '0.6284' 라고 합시다.


그럼 0.6284라는 숫자에 10을 곱하라고 되어 있죠?

6.284 라는 값이 나옵니다.

그 다음에 마지막에 +1 이 되어 있는데,

이건 즉 초기값을 뜻합니다.

그럼 7.284라는 숫자가 나오겠죠?


하지만 RandINT 변수는 '정수형'변수 이기때문에 뒤의 소수점은 전부 떼버립니다.

그럼 '7'이라는 값을 가지게 되겠죠.


결론적으로

[(10 * Rnd()) + 1] 이 수식은

최소값이 1 그리고 최대값이 10인 숫자들 중 하나를 가져오라는 말입니다.


그리고 참고로,


만약 RandINT 변수가 Integer(정수형)이 아니라 실수형 변수(Long)이라면?


Dim RandINT As Long

RandINT = (10 * Rnd()) + 1


이러면 7.284 라는 값이 그대로 나오겠죠.


그렇지만 그래도 나는 이 변수에 실수를 넣지 않고, 정수만 나오게 하고싶다!

그러면 뭐하러 Long으로 선언했냐, 그냥 Integer로 선언을 하지.

라고 말하시겠지만 이럴 때 있어요.

간혹 그런 상황이 필요하거든요.


그럴때 사용하는 함수가 바로

INT 함수입니다.

Integer 의 약자이죠?


Msgbox Int(10.55888)

이렇게 하면

소수점을 떼버리고 10이라는 숫자만 가지게 됩니다.


그럼 랜덤 함수에도 써먹을 수 있겠죠.


Int((10 * Rnd()) + 1)

괄호를 하나 더 씌워주고 Int를 넣어주면

1~10 사이의 정수형 난수가 추출되겠죠.


3. [코딩] 가위바위보


자, 이제 길고 길었던 요리의 재료준비를 마쳤습니다.


이제 컴퓨터와의 가위바위보 대결 게임을 만들어보겠습니다!


사용자는 [가위] [바위] [보] 이렇게 세가지를 낼 수 있고,

컴퓨터는 랜덤으로 가위 바위 보가 나오게 해야해요.



우선 기본적인 알고리즘을 볼까요.


이렇게 되겠죠.


자, 그럼 코딩으로 나가볼까요.


우선 사용자가 [가위] [바위] [보] 중 선택 할 수 있는 폼을 만들어볼게요.



자, 참고로 저기 있는 [가위][바위][보] 세개버튼은

[가위]버튼을 만들고 복사해서 붙여넣기 한겁니다.


그냥 하나씩 다 그려내는 것과

차이가 뭐냐면





하나씩 찍어서 그려내게 되면 Command1, Command2...이렇게 나옵니다.

하지만 복사 붙여넣기를 하게되면


이런 메세지가 출력되지요.


예(Y)를 누르면 복사가 하나 됩니다.


Command1(0)이 되었고.




Command1(1)이 되었습니다.


이게 뭐냐면 개체배열이라는 것인데,

복사된 개체는 이제 부터 Command1 이라는 이름하나가 되었고,

복사된 어떤 버튼을 누르든지 Command1_Click 으로 서브가 실행됩니다.

결국 위치, 모양만 다른 같은 버튼이라는 소리죠.

그럼 이 버튼들을 각각 다르게 동작하는 방법은 어떻게 될까 알아보면,

괄호 안에 있는 숫자가 해결해줍니다.

바로 인덱스(Index)라는 것입니다.


0번 부터 복사된 숫자 끝 번호까지 각각의 버튼은 인덱스에 다른 숫자를 가지게 됩니다.


그럼 커맨드 버튼을 더블클릭해서 Command1_Click 서브를 생성해볼까요?


두개 차이가 보이시나요?


괄호 안에 (Index As Integer) 라고 변수가 하나 더 선언 되어 있습니다.




자, 그럼 이걸로 가위, 바위, 보 버튼 세개를 만들어서 각각 버튼들이 다른 역할을 하게 하는 방법은!


이렇게 Command1(0)이 눌리면 Case 0으로 빠지고,

Command1(1)이 눌러지면 Case 1로 빠지고,

Command(2)가 눌러지게 되면 Case 2 로 빠지게 됩니다.


하지만 우리는 현재 이 방법을 쓰지는 않을 겁니다.

어차피 각각 버튼을 누르면

가위 = 0 

바위 = 1

보는 = 2

라는 인덱스 값이 들어오게 되죠.


이대로 가위바위보를 만들어도 되지만,

이해하기 쉽게 하기위해서 조금 더 쉽게 진행해볼게요.



그럼 계속해서...


자, 그럼 그냥 인덱스를 가져오기만하는 걸로 RSP_User 변수에 저장이 되겠죠?




그 다음은 이제 컴퓨터가 난수를 발생시킬 차례입니다.

그러면 RSP_Computer 이라는 변수에 0,1,2 중 하나의 값이 저장됩니다.


이제 다음 알고리즘대로 따라가면,

사용자의 선택과 컴퓨터의 난수를 비교해서 결과를 도출해주기만 하면 되겠죠.


저는 Label2.Caption 에다가 결과를 도출 할 겁니다.


우선 비교를 하는 구문을 보시죠~



유저가 가위를 냈을 경우 컴퓨터와 비교하는 것만 코딩 했습니다.

빨간 박스 안에 있는 코딩입니다.

[Select Case RSP_User] 구문 안에

다중으로 [Select Case RSP_Cumputer] 구문이 하나 더 들어갔죠?

다중 Select 구문입니다!


이런 식으로 유저가 바위를 냈을때 (Case 1) , 유저가 를 냈을때(Case 2)

두개 다 비교를 해주는 구문을 넣어주면 되겠죠.



완성된 최종 코드 입니다!


폼창도 틀린게 없는지 확인하고

실행을 한번 해볼게요~




바위를 한 번 눌러 볼게요




오늘 6강에서는 배운게 많았네요.


가위바위보 게임을 만드려면

Select Case문, Randomize, 개체 배열.

이렇게 알아야 할게 많네요~


코딩을 보시면

만약 저걸 If문으로 했다면...?

이라고 생각하시면 Select Case도 복잡해보이는데

후덜덜 하실겁니다.


후덜덜..




반응형

+ Recent posts