반응형

좀 바빠지다보니 ㅠㅠ

오랜만에 포스팅을 하게 되네요~


지금까지는 시간의 개념이 빠진채,


사용자가 입력을 하면 결과를 뱉어(출력해)내고,

또 다시 사용자가 입력을 하면 결과를 뱉어내는..

말그대로 정적인 프로그래밍만 했다면,


오늘 타이머 개체를 배우고나면 동적인 프로그래밍이 가능하실 겁니다~


그럼 정/동적인 프로그래밍이 뭐냐~!


음...알기 쉽게 게임을 만든다고 가정하고 설명드릴게요.


사용자가 용사가 되어 괴물을 잡는 게임을 제작한다고 가정해보아요.


그럼 사용자가 컨트롤하는 캐릭터가 있을테고,

좌, 우, 상, 하, 점프...등등의 사용자의 입력을 받으면 캐릭터가 움직이겠죠?

반대로 사용자가 입력이 없을때는 캐릭터는 가만히 있겠죠.

이 부분에 대해서는 전혀 상관이 없는데,


그럼 사용자가 움직임을 입력했을때, 시간의 개념이 없다면 바로 움직이는 결과만 화면만 출력이 될거에요.


그러나 보통 그런게임은 요즘 흔치 않죠. (16이하 bit의 컴퓨터때도 흔하지 않았음.)





그럼 결국 시간의 흐름에 따라 입력된 값대로 캐릭터를 부드럽게 움직이게 하면

좀더 역동적으로, 동적인 게임을 만들 수 있게 되겠죠.


결국 캐릭터가 움직이는 모션은

'시간'이란 개념을 통해서 그림을 하나씩 표현하고,

해당 좌표로 이동해줘야 하겠죠?


예를들어,

자, 그러면 총 3개의 움직임이 추가가 되었죠?

사용자가 키를 입력하면 위의 '타이머'개념이 없는 것 보다는

좀 더 움직이는 것처럼 역동적으로 보여 질 거에요.


저 하나하나의 움직임을 프레임,(Frame) 이라고 불러요

요즘 3D 게임에 보면 Fps 라는 개념이 있는데

이게 바로 Frame per second 라고.

초당 보여지는 프레임의 수를 얘기하는 거에요.


그럼 초당 보여지는 프레임 수가 높을 수록 더 잘게 잘게 쪼개서 움직이는 모습을 보여주게 되는 거니까

더 부드러운 움직임을 보여주겠죠?


결국 '시간'의 개념이 도입되면 다이내믹한 연출이 가능해진다는 말씀.





그럼 또 다른 예를 들어볼게요.


현재 시간을 표시하는 디지털 시계 프로그램을 만들어 볼게요.


시간 개념이 없이 그냥 폼이 로드 되었을때 현재시간을 표시하는 코딩을 하게되면


Private Sub Form_Load()

(현재시간 표시하는 코딩)

End Sub

이렇게 되겠죠? 그럼 

결과가 이렇게 나올거에요.




문제는 폼이 로드된 시점의 시간에서 멈춰 버린다는 것이죠.


그럼 매 초마다 띄우게 할 수는 없을까? 에 대한 궁금증이 생기실 거에요.


역시 이것도 당연히 '시간' 의 개념이 필요한것이죠.



그렇다면,

한번 만들어볼게요!!


이게 타이머 입니다.



타이머 속성을 한번 볼게요.

속성에는 중요하게 봐야 할게

EnabledInterval 이 두개 입니다.


우선 Interval을 설명드리면,

ms(밀리세컨)을 사용해서 타이머가 가지는 시간값을 지정하는 것입니다.

1분 = 60000ms

10초 = 10000ms

1초 = 1000ms

0.1초 = 100ms


이렇게 되겠죠?

그럼 'Interval값을 1000으로 두면

1초마다 timer에 입력된 코드를 실행시킨다.' 라고 알고 계시면 됩니다.


Enabled값은 말그대로 사용가능한지에 대한 여부인데.

False값으로 설정되지면 Timer는 정지 상태가 됩니다.

반대로 True값이 되면 타이머는 설정된 Interval수치를 작동시켜 돌아가게 되는 것이죠.


그럼 인터벌값을 1초로 두고, 매 초마다 현재 시간을 표현하는 레이블을 만들어 볼까요?




아주아주, 간단합니다.


이렇게 하면 아주 간단하죠!

매 초마다 Timer가 작동하게 되고, 그 타이머는 Label1의 caption속성에다가 Now라는 함수.

즉 현재 시간을 나타내는 함수를 대입하라는 것이죠.

실행 한번 해보세요 ㅎㅎ


2016-02-12 오후 1:11:25 와 같이 시간이 표시 될 것입니다.


자, 그럼 Format 형식을 사용해서 더 나은 타이머를 만들어볼게요.



어? 그럼 Format(Now, "hh:mm:ss") 이 부분이 뭐지? 라고 생각하시겠죠?


Format 함수는 간단하게 사용하시려면 Expression 부분과 [Format] 부분만 신경쓰시면 됩니다.

Expression은 표현할 인수를 얘기하는 것이고,

Format은 그 인수를 어떻게 표현할 것인지를 나타내는 것입니다.


알기 쉽게 풀어서 설명 드리면,

Now라는 함수는 2016-02-12 오후 1:11:25 라는 값을 가지고 있겠죠? (당연히 매초마다 바뀜.)


영어 단어로 풀어보자면




2016 

02 

12 

오후 

11 

25 

Year

Month 

Day 

AM/PM 

Hour 

Minute 

Second 


Year-Month-Day AM/PM Hour:Minute:Second 로 되어 있죠?


이걸 이제 Format 함수에 써먹는 방법은, 각 문자의 앞글자를 따서 사용합니다.


가령 현재 연도를 출력하고 싶다면 Year 단어의 앞글자인 Y.


월을 출력하고 싶다면 Month의 M

일을 출력하고 싶다면 Day의 D

...AM/PM은 그대로 AM/PM으로 사용하시면 되고,


H, M, S 이렇게 각각 앞글자를 따게 되죠.


어라? 근데 이상하네요.

Month의 M과 Minute의 M이 겹치네요?


그래서 날짜는 대문자

시간은 소문자로 표현합니다.


예를 들어볼게요.


16/02/12 을 표현하고 싶다. 하면 "YY/MM/DD" 라고 하면 되겠고,

2016년 02월 12일을 표현하고 싶다. 하면 "YYYY년 MM월 DD일" 이라고 표현하면 되겠습니다.


시간도 역시 마찬가지로.

현재시각: 2시 10분입니다.

라고 표현하고 싶다!

"현재시각: h시 m분입니다." 라고하면 되겠죠.


정말 쉽게 풀어 쓴거라. 후에 제대로 설명을 한번 드리도록할게요.

지금은 개념만 이렇게 잡아두시면 문제 없을 겁니다!


자 그럼 심화 문제 나갑니다!


아래와 같이 폼을 꾸며 주시고,


Label과 타이머를 이용해서 계속해서 시계가 출력되도록 설정합니다.

매초마다 시간을 보여주고,


사용자는 두개의 버튼을 누를 수 있습니다.

우선

1. 현재 시간 체크! 를 클릭하면 현재 시간을 저장합니다.

2. 얼마나 지났나? 를 클릭하면 아까 저장했던 시간부터 얼마나 지났는지 출력하는 문제입니다.



해답은 아래에 있지만. 꼭 풀어보고 하셔요!

















오늘은 여기까지 하겠습니다.


이해 안되시는 부분이나 궁금한점 있으시면 댓글 남겨주세요~!! 확인하는대로 바로 답변드릴게요!


반응형
반응형

오늘은 Array! 배열에 대해 공부 해볼게요!


배열은 어떨때 쓰냐!


예를들어 이런 프로그래밍을 한다고 하면...


하나하나 변수 다 넣고, 일일히 A1 & A2 & A3 & A4 ....이렇게 설정을 해줘야 하죠?


이걸 좀더 편하고, 관리하기 쉽게 하기 위해서 배열이라는 것을 사용합니다.


자 위의 사진과 비교했을때 얼마나 짧아지는지 볼까요?




글자수가 많이 줄었지요?


변수 선언란에 보면


dim A(4) As String

이라고 선언을 했습니다.

이건 쉽게 얘기하자면,


A라는 그릇을 만드는데,

5조각으로 나누어라! 라는 뜻입니다.


그냥 변수에다가 Dim A as String 이라고 선언하면 A라는 그릇 하나가 생기는데,

이렇게 선언 해주면


차이점을 아시겠나요?


그렇다고 그릇의 크기가 저렇게 쪼개지는게 아니라,

(컴퓨터는 가상의 그릇을 만드는 것이니까)


A 하나만 선언 한 것의 크기나,

배열로 선언한 A(0)의 크기나 같습니다.


다만 사용자가 주의해야할 점은

배열은 0부터 시작한다는 것입니다.


그럼 Dim A(4) as String 이라고 선언하면,



0,1,2,3,4 이렇게 5개가 생성이 되는 것이지요.




자 그럼 문제입니다!


텍스트에 문자열을 입력후

배열에 등록하기 버튼을 누르면


A라는 배열안에 하나씩 차곡히 저장되는 코딩을 해볼게요!


이번 문제는 생각해야 할 것이 많으니, 해답을 아래에 게시하겠습니다~!!







우선 해볼 수 있는데 까지 해보시고, 보셔요 ㅎㅎ




자, 다 입력하고, 배열에 등록하기 그냥 누르면!


배열 0번에 값이 등록되고

텍스트 박스는 비워지게 되지요!


이런식으로 계속 입력해볼까요


이번엔 0번째에 이어 1번째 배열에 "안녕?"이라는 문자열이 저장되었습니다.


6번째까지 입력하다가 귀찮아서 때려치움..


For 문이 10번까지. 즉 배열의 갯수 만큼 맞춰 주었기때문에

10번째 입력을 마치고 11번째 또 입력을 하면

For문은 그냥 넘어가버릴 겁니다. 결국 아무 것도 입력이 되지 않음.


그럼 여기에 11번째 부터 경고를 띄워 줘볼까요?



귀찮아서 실행 완료된 것 은 안올릴래요 ㅋㅋㅋ


수고하셨습니다~!!





반응형
반응형

Swap 이란 단어, 들어 보신분들도 계시고 아닌 분도 계신데,


네이버 영어사전에 뜻을 검색해보면




우리는 다른 뜻은 필요 없고,

<데이터>를 교환하다.만 보시면 됩니다 ㅎㅎ


그럼 데이터를 교환하는데 왜이렇게 스왑이란 단어로 명명하고,

힘들게 하냐?


예시를 들어보면



이렇게 두개의 변수가 있다고 합시다!


그리고 이 변수 들에게 각각 어떤 값이 들어갔습니다.


A라는 변수에는 "안녕?" 이라는 문자열이.

B라는 변수에는 "무꼬" 라는 문자열이 각각 저장 되었죠.


여기까진 쉽죠?


그냥


Dim A as String

Dim B as String

A = "안녕?"

B = "무꼬"


이렇게 해주시면 되지요.


여기 까진 문제가 없습니다.


그럼 이건 어떨까요?


A의 값과 B의 값을 서로 바꿔야 할 상황이 생겼습니다.


어떻게 할까요?





Dim A as String

Dim B as String

A = "안녕?"

B = "무꼬"


A = B

B = A


이렇게 하면 될까요?

그럼 현재 이 코딩을 모식도로 보여 드릴게요.



??????

왜이런 결과가 나올까요.


결과가 A와 B모두 "무꼬"라는 문자열이 저장 되어 버리지요.


컴퓨터는 코딩 내용을 위에서 아래로 읽어 내려 갑니다.



그럼 A 와 B의 값을 깔끔하게 바꿀 수 있는 방법은 뭐가 있을까요?


쉽게 바꿔 얘기하면

A라는 페트병과

B라는 페트병 두개가 있습니다.


A에는 우유가 들어있고

B에는 이온음료가 들어 있지요.


두개의 내용물을 바꾸는 방법이 뭐가 있을까요?

생각 한번 해보시고 스크롤을 내려보세요.




과연 당신의 IQ는 높을까요?








정답은 C라는 페트병을 하나 임시로 가져와서

A의 내용물을 C에다가 옮겨 담고,

B의 내용물을 A에 옮기고,

C의 내용물(원래는 A의 내용물)을 다시 B에다가 넣게 되면


결과 적으로


A와 B의 내용물은 정확히 바뀌게 되지요?


순서도로 보여드릴게요!

정확히 반대로 바뀌게 됩니다.



그렇다면

코딩으로 볼게요,


Dim A as String

Dim B as String

Dim C as String

A = "안녕?"

B = "무꼬"


C = A

A = B

B = C


이렇게 할 수 있겠죠?



이 방법이 바로 '스왑'이라는 방법입니다.


스왑에 관한 전반적인 설명이 끝났습니다!




반응형
반응형


 목차

 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도 복잡해보이는데

후덜덜 하실겁니다.


후덜덜..




반응형
반응형

안뇽하세요~ 무꼬입니다.


오늘은 리스트 박스와 콤보 박스에대해 설명해드릴게요~!





리스트 박스나 콤보박스는 모양만 다르지 자신들이 가지고 있는 속성이 같아요!


사용자에게 어떻게 보여주고 싶은지에 따라 입맛대로 사용하시면 됩니다~



리스트박스는 말그대로 리스트를 보여주는 박스이구요


콤보박스는 ▼ 모양을 눌렀을때 거기서 카데고리를 고를 수 있게 되어 있는게 콤보박스에요


그럼 둘다 성질이 비슷하니까 리스트 박스로 간단히 설명 드릴게요!


우선 리스트 박스 혹은 콤보박스에 아이템을 추가하는 방법입니다.


커맨드 버튼을 하나 추가해서 그 커맨드 버튼이 눌러지면


리스트가 추가 되는 코딩을 해볼게요



이렇게 하면 커맨드 박스를 누를때마다 "리스트 추가!" 라는 아이템이 계속 생성되는걸 보실수 있으세요



세 번 눌렀습니다.



자, 그럼 이번에는

만약에 사용자가 리스트들 중 3번째 리스트를 눌렀을때 메세지 박스를 띄우는걸 해볼게요.


간단합니다.


ListIndex 속성이 뭐냐면

사용자가 현재 리스트중에 선택한 리스트의 순번을 나타냅니다.


다만 순번이

1부터 2,3,4,5...이렇게 나가지 않고,

0부터 숫자를 세어나가죠.


그럼 첫번째 리스트의 ListIndex는 0번이라는 말이겠죠?


그래서 List1_Click 서브에 있는 IF문을 보시면

If List1.ListIndex = 2 then

여기에 3이 아니라 2를 넣은 이유도


3번째가 되려면 0,1,2 이렇게 해서 2번이 실질적으로 3번째가 되는 것이죠


실험을 직접해보면

우선 커맨드 버튼으로 3번 이상 눌러줘서 3개 이상 아이템을 생성해주고,


리스트에서 3번째 것을 클릭하면


메세지가 짜잔~ 하고 뜨죠



자 그럼 이번에는 리스트를 클릭했을때

그 리스트에 있는 텍스트를 메세지 박스로 띄워보는 것을 만들어 볼게요!



List 역시 현재 선택된 아이템의 문자열을 Text로 인식합니다.


그렇다면 현재 선택된 아이템의 문자열을 받아 들이려면

List1.Text 를 사용하면 되겠죠?


이렇게! 됩니다.


그럼 리스트 박스의 내용을 전부 지우려면 어떻게 할까요?


List1.Clear

이 명령어를 쓰시면 깔끔하게 리스트가 초기화됩니다.




그럼 이번에도 문제를 내볼게요~


폼이 로드 되었을때


List 에


이름: 홍길동

전화번호: 010-1234-5678

나이: 30

주소; 서울시 강남구 논현동


한줄씩 아이템이 추가 되게 해보세요!


그 후에 리스트를 클릭하면

그 해당 텍스트가 메세지 박스로 뜨게!




오늘은 해답을 아래에 실어 둘게요!




해답입니다!



자, 그럼 이번에는

텍스트박스를 하나 더 만들어서

커맨드 버튼을 클릭하면

해당 텍스트 박스의 내용이 리스트에 추가되고,

그와 동시에 텍스트 박스의 내용은 빈공간이 되게 만들어 봅시다~



이렇게 말이죠!





이것도 두 줄이면 끝나네요



이게 완성 되셨다면

이번에는 콤보박스로 연계 해볼게요.

콤보박스와 커맨드 버튼을 하나더 추가 해서 아래와 같이 배치해보세요




오늘의 진짜 문제입니다!


텍스트 박스로 입력해서 추가한 리스트들 중에


원하는 내용을 콤보에 추가 버튼을 누르면 콤보박스에 선택된 리스트의 텍스트가

콤보에 추가 되게 만들어보세요!


이렇게요


이렇게 텍스트를 입력해서 리스트에 추가시키고,


리스트중에 아무거나 선택 후에,

'콤보에 추가' 버튼을 누르면


아래 콤보에 추가가 되게요!


힌트는 List와 Combo는 속성이 같습니다!


궁금한게 있다면 댓글로~~



반응형
반응형

안녕하세요 무꼬입니다~


프로그래밍에서 제일 중요한 구문 대표적인걸 꼽으라고 한다면


바로 딱 떠오르는게 조건문반복문입니다. (사실 전부다 중요하죠 ㄲㄲ)


어떤 언어(C,JAVA등)에서든 쓰이고,


조건문의 경우는 이전 강의에서 예제를 보면서 진행을 했고,


이번 강의에서는 반복문의 기본에 대해서 알려드리고자합니다.


조건문은 대표적인게 IF문이 있죠. (그 외 응용을 해서 사용가능한 조건문도 있습니다.)

짚고 넘어가자면 조건문은 '만약에' 라는 조건에 충족되면 IF~end IF 사이에 있는 명령을 수행합니다.

Else문이 추가가 된다면 '만약에'라는 조건이 충족되지 않았을때 Else~end IF 사이에 있는 명령을 수행하죠.


그럼 반복문이라 하면,

말 그대로 반복을 하는 것입니다.


반복문은 대표적이라 할 것 없이 

Do...Loop

For

While 문 등이 있습니다.


반복문은 좀 많네요?


그 이유는 적재적소에 따라 다른 반복문을 사용해야 할 필요가 있단 뜻이지요.

하지만 모든 반복문은 메커니즘은 같다는 것.!


For 문은 조건식이 도달할때까지 반복을 하는 반복문입니다.


기본 식을 한번 보실까요


For i=1 to 10

(반복될 내용)

Next i


자, 기본 For문입니다.

하나씩 스토리텔링 형식으로 얘기해볼게요


'i'라는 아주 성실한 정수형 변수가 있었습니다.

그런데 이 i 라는 녀석이 야망이 커서

자기가 가지고 있는 1원이 10원이 되길 원해요. (초기값 i=1 to 10)

그 i라는 녀석이 1원을 가지고 일을하기 시작했어요. (반복될 내용)

그는 일을 한번 하고 1원을 벌었어요.

그리고 또 다시 반복해서 (반복될 내용 두번째)

2원을 벌었고,

또 일을해서 3원을 벌었어요 (반복될 내용 세번째)

그렇게 10원까지 10번의 반복을 거쳐

10원을 벌었습니다!


변수 'i'의 입장에서 본 For 반복문 스토리텔링입니다^^


하지만 사실상 프로그래머 입장에서는 i 입장보다는 반복될 내용이 중요하죠.

이해하기 쉬우시라고 이렇게 써봤습니다.


자, 아무튼 그렇게 10번 반복을 했습니다!

이해하기 쉽게써서 간단 하죠?


자, 그러면 반복문을 배울때 항상 하는 구구단 만들기를 해볼게요!


기본 폼입니다.


그리고 sub Form_Load. 폼이 로드되었을때 실행될 명령어를 입력해볼게요.



레이블1의 캡션에  "2 곱하기 " & i & "는" & (2 * i)

이걸 감으로 이해 하셨을 수도 있고,

모르실 분도 계셔서 잠깐 설명드릴게요.


"2 곱하기" 이부분은 그냥 문자열 그대로 표현을 해준거죠! 다들 아시리라 믿고,

뒷 부분

& i & "는" & (2 * i)

이건 뭐라고 해석을 해야 되냐하면


'&' 연산자의 경우 변수와 변수사이(문자열과 문자열사이 혹은 변수와 문자열사이)를

이어주는 역할을 합니다.


그리고 괄호 부분의 (2 * i) 내용은

2 × i값을 하라는 뜻입니다.

수식 내용 그대로를 계산을 하는 것이죠.


그럼 i값이 1일 경우 (2 * i)의 값은? 2가 되겠죠?

그럼 i값이 9일 경우 (2 * i)의 값은? 18이 되겠죠?

괄호안의 변수의 내용에 따라 출력되는 값이 달라진다는 말씀!

그럼 만약 i 값이 3일 경우 전체적으로 출력될 문자열은?

2 곱하기 3는 6

이라는 문자열이 출력되겠죠.

결국 Label1.Caption = "2 곱하기 3는 6"

이렇게 나온다는 것입니다~!


그럼 실행을 해볼까요?

아마 실행 되자마자 Form_Load서브가 실행되어서 값이 출력 될거에요.


어라? 근데 뭔가 이상하죠?


왜 2곱하기 9만 나왔을까요?



그 이유는 For문이 10번 돌면서

Label1.Caption 값을 계속 10번 바꿨을 테죠.

그리고 마지막 9번째에는

Label1.Caption = "2 곱하기 9는18"

이라는 것을 출력했을테고...


그럼 Label1.caption에

2 곱하기 1는 2

2 곱하기 2는 4

2 곱하기 3는 6

2 곱하기 4는 8

.....

...

2 곱하기 9는 18


이렇게 나오게 할 수는 없을까요?



물론 있습니다!

아래 와 같이 코딩을 하면 되지요~!


Label1.caption = Label1.caption & "2 곱하기 " & i & "는" & (2 * i)

뭐가 좀더 추가 되었죠?

Label1.caption 값 안에 Label1.caption 자기자신이 가지는 값 그리고 "2 곱하기 " & i & "는" & (2 * i) 를 출력하라

라고 코딩을 했습니다.


그럼 이대로 실행해볼까요?

아마

2 곱하기 1는 22 곱하기 2는 42 곱하기 3는 6....

이렇게 한줄로 죽~~~~ 나올거에요...ㄷㄷㄷ

이게 뭐야..알아보기 힘들잖아..




그럼 뭔가 엔터를 칠 수 있는 인자가 있다면 좋겠죠.


이걸 개행문자라고 합니다.

키보드의 엔터키가 있죠

이 엔터키가 줄바꿈을 하는게 아니라

사실 어떤 문자를 입력합니다.

그게 바로 개행문자 이지요!


나중에 배울텐데 Ascii(아스키코드)로는 13번에 해당합니다.

그걸 컴퓨터가 알아먹게 바꿔주면

chr(13)

chr 이라는 함수(기능)인데요.

이건 컴퓨터 내에 등록되어서 숫자로 순번이 매겨져 있는 문자를 표시하게 하는 함수입니다.

13번째에 등록된 문자는 바로 엔터키를 쳤을때 입력되는 개행문자입니다!

그럼 chr(13) 이 코드를 Label1.Caption이 출력될 값이 끼워 넣어주면 되겠지요?



이렇게요.


Chr() 함수는 타 언어도 모두 통용되니까 이렇게 알려드렸구요

사실 비주얼 베이직에서는 개행문자를 출력하는 함수가 많아요.





 Chr(13) 과 같은 기능을 하는 함수

 vbNewLine

 vbCrlf

그럼 이렇게도 바꿀수 있다는 얘기겠죠



vbcrlf 를 사용해서 개행하기


vbNewLine 을 사용해서 개행하기



자 그럼 실행 해볼게요~


짜잔~ 제대로 나온게 보입니다~


이제 For문에 대해서 아셨으니까

나머지 반복문들도 쉽게 하실 수 있으세요.


마지막으로 Do..Loop문을 한번 볼까요?

For문은 해당 조건식에 맞으면 밖으로 빠져나오게 되어 있는 구조이죠.

하지만 Do Loop 문은 빠져 나갈 수가 없어요.


예를 들어


Do

msgbox "안녕?"

Loop

이라는 코딩을 했다면

메세지 박스로



이 메세지가 무한으로 루프되겠죠...



그래서 보통 Do Loop 문은 IF문을 함께 씁니다.

Do

   i=i+1


      If i >= 10 then 'i 값이 10 이상일때

         exit do 'Do 구문을 빠져나와라

      end if

Loop

이렇게 사용할 수가 있습니다.

해당 조건이 되면 DO 구문을 빠져나와라.



이해하셨죠?

그럼 오늘도 어김없이 퀴즈 나갑니다~

해답이 궁금하신분들은 댓글 달아주세요


오늘은 Do Loop문을 이용해서

구구단을 만들어 봅시다.

단 폼형식은



텍스트박스 하나, 커맨드버튼 하나, 레이블하나

이렇게 해서 텍스트박스에 숫자를 입력하고 커맨드버튼을 클릭하면,




이렇게 결과물이 나오게 해봅시다!

단 Do..Loop문으로 해결해야 합니다.






그리고 참고적으로

연산자라고 하는게 있는데 알아두세요


연산자

 설명

예제 

 +, -

더하기, 빼기 

 3+ 5

 *, /

곱하기, 나누기 

 3* 6

 mod

나머지

 3mod2  → 1

 &

변수와 변수 사이 연결

 3 & 32

 And

조건 A 와 B가 둘다 참일 경우 

 a=1 And b=2    a가 1이고 b가 2가 맞다면 True 아니면 False

 OR

조건 A 와 B가 둘 중 하나만 참일 경우 

 a=1 OR b=2   → a가 1이거나 b가 2 둘중 하나가 맞다면 True 아니면 False

 >, <

비교구문 

 비교 할때 보다 값이 미만일때 초과일때  A < 13  'A가 13미만일때

 >=, <=

비교구문 

이상일때 이하일때  A <= 13 'A가 13보다 이하일때

 <>

비교구문 

C 언어에서는 != 라고 표현하죠.

양쪽의 값이 일치하지 않을때   A <> 13 'A가 13이 아닐때


반응형

+ Recent posts