대학생활/수업

게임밸런스및시뮬레이션 11주차 - 배열, 간단한 게임 만들기

se.jeon 2023. 11. 20. 16:06
728x90
반응형

배열 (Array)

같은 데이터형을 가지는 연속된 데이터를 의미한다.

선언 방법 : Dim 배열변수(크기) As 데이터형 (ex : Dim Arr배열(5) As String)

 

인덱스 시작값 설정

모듈 선언문에 'Option Base 1'을 넣으면 배열 인덱스가 1부터 부여된다. (디폴트는 0부터 부여된다.)

 

배열 사용법

1. 배열 변수를 선언하고 인덱스에 따라서 값을 각각 대입하는 형식

2. 변수를 선언하고 Array 함수를 통해서 값을 지정하는 방법

3. 변수를 선언하고 Split 함수를 통해서 값을 지정하는 방법 (시작 인덱스가 무조건 0임)

 

Option Base 1 '배열을 0이 아닌 1부터 사용하겠다는 모듈선언문

Public 배열1(3) As String '배열1(1)~배열1(3)까지 3개의 배열을 갖는 String 변수로 선언
Public 배열2 As Variant 'Array 함수로 배열 변환 예정
Public 배열3 As Variant 'Split 함수로 배열 변환 예정

Sub 배열테스트()
    배열1(1) = "아침1"
    배열1(2) = "점심1"
    배열1(3) = "저녁1"
    
    배열2 = Array("아침2", "점심2", "저녁2")
    배열3 = Split("아침3,점심3,저녁3", ",")

End Sub

 


로또 번호 추출기 만들기

1~45까지 중복되지 않는 6개의 수를 뽑기 (오름차순으로 정렬)

앞의 6개의 수와 중복되지 않는 1개의 수를 뽑기 (보너스 번호)

선택한 셀에서 1~7까지 우측으로 적기

 

Option Base 1

Sub 로또대박()
    Dim 로또번호(7) As Byte '로또번호(1)부터 로또번호(7)까지의 배열변수 선언
    Dim i As Byte 'For문 처리를 위한 카운트변수 선언
    
    ' 로또번호가 중복되지 않도록 랜덤 돌리기 (6개)
    ' 한땀한땀 비교하면 너무 복잡해지기 때문에 다른 방식 사용.
    
    For i = 1 To 6 Step 1
        Do ' 고유한 결과값을 뽑기 위해 필요한 조건반복문
            Range("A1").Offset(i - 1, 0).Value = Application.RandBetween(1, 45)
        Loop While WorksheetFunction.CountIf([A1:A6], Range("A1").Offset(i - 1, 0).Value) > 1
    Next i
    
    
    ' 소팅/ 매크로 기록하기로 불러오기
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("A1:A6") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A1:A6")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    
    ' 보너스 번호 생성 (7번째 숫자/ 중복이 안 되도록 처리)
    Do
        Range("A7").Value = Application.RandBetween(1, 45)
    Loop Until WorksheetFunction.CountIf(Range("A1:A7"), Range("A7").Value) = 1
    
    
    ' 로또번호 배열변수에 대입
    For i = 1 To 7 Step 1
        로또번호(i) = Range("A1").Offset(i - 1, 0).Value
    Next i
        
        
        
    '중간 결과값 (A1:A7 삭제)
    Range("A1:A7").Value = ""
    
    
    ' 선택된 셀부터 우측으로 해당 값 표시
    For i = 1 To 7 Step 1
        ActiveCell.Offset(0, i - 1).Value = 로또번호(i)
    Next i
    
End Sub

 

VBA로 베이스볼 게임 만들기

1~9 사이의 중복되지 않는 3개의 숫자가 임의의 정답으로 정해진다.

아래 '도전' 버튼을 눌러 정답(3스트라이크)을 맞춰야 한다.

- 선택한 숫자가 3개의 정답 숫자와 같지 않다면 '아웃'

- 선택한 숫자가 정답과 일치하지만 자리가 다르다면 '볼'

- 선택한 숫자가 정답과 자리 모두 일치하면 '스트라이크'

정답을 맞출 기회는 10회

 

 

개발 도구 > 삽입 > 양식 컨트롤에서 콤보 박스를 생성

 

개체 서식에 들어가 데이터 확인 기능 추가

셀 연결을 통해 값 연동

 

Option Base 1 '배열을 1부터 사용하겠습니다.
Public 정답(3) As Byte '정답(1)~정답(3)까지 배열변수로 선언
Public 도전횟수 As Byte '히스토리 및 게임 종료 처리를 위한 카운트 용도로 변수 선언

Sub 게임세팅()
    ' 정답 초기화 처리
    For i = 1 To 3 Step 1
        정답(i) = 0
    Next i
    
    ' 도전횟수 초기화 처리
    도전횟수 = 0
    
    ' 히스토리 초기화 처리
    Range("B18:F27").Value = ""

End Sub



Sub 게임플레이()
    '정답1~3이 중복되지 않도록 1~9 사이의 랜덤값으로 대입
    
    Dim i As Byte ' For문 사용을 위한 카운트 변수 선언
    Dim 유저입력(3) As Byte '콤보박스를 통해서 유저의 입력값을 받을 수 있도록 배열변수 선언
    Dim 스트라이크 As Byte, 볼 As Byte, 아웃 As Byte '게임의 진행결과를 계산하기 위한 변수 선언
    
    
    ' 정답(1)~정답(3) 중복되지 않고 세팅하도록 하는 처리 구문
    Do Until 정답(1) <> 정답(2) And 정답(2) <> 정답(3) And 정답(1) <> 정답(3)
        ' 정답을 3개 세팅하기 위한 For 반복문
        For i = 1 To 3 Step 1
            정답(i) = Application.RandBetween(1, 9)
        Next i
    Loop
    
    ' MsgBox 정답(1) & "/" & 정답(2) & "/" & 정답(3)
    
    
    ' 유저의 입력을 받는 구문
    유저입력(1) = Range("D11").Value
    유저입력(2) = Range("F11").Value
    유저입력(3) = Range("H11").Value
        
    ' 유저입력값이 중복되지 않도록 해주는 처리
    If 유저입력(1) = 유저입력(2) Or 유저입력(1) = 유저입력(3) Or 유저입력(2) = 유저입력(3) Then
        MsgBox "중복되지 않게 입력 해 주세요", vbCritical, "잘못된 값"
        Exit Sub ' 매크로 강제 종료
    
    '유저의 입력값이 중복되지 않았을 경우 (정상적인 상황 처리!!)
    Else
        ' 게임 플레이의 실제 처리 구문이 위치해야 하는 자리
        ' 도전횟수 변수 선언 및 증가 처리 구문
        도전횟수 = 도전횟수 + 1

        
        ' 입력값과 정답을 비교하는 구문 (자리와 값 확인 처리 / 스트라이크, 볼, 아웃의 값을 바꿔주는 처리)
        
        
        ' 히스토리를 표시하는 구문 / offset 활용 with 도전횟수
        Range("B17").Offset(도전횟수, 0).Value = 도전횟수
        Range("B17").Offset(도전횟수, 1).Value = 유저입력(1)
        Range("B17").Offset(도전횟수, 2).Value = 유저입력(2)
        Range("B17").Offset(도전횟수, 3).Value = 유저입력(3)
        Range("B17").Offset(도전횟수, 4).Value = "고민필요" '현재 상태 반영 처리
        

        ' 게임 클리어 처리
        
        ' 게임 오버 처리
        
        If 도전횟수 = 10 Then
            MsgBox "게임 오버"
            Call 게임세팅
        End If
        
        ' 게임 세팅 정리 - 게임 종료시 연계처리
    End If
    
End Sub
728x90
반응형