본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/안드로이드 스튜디오로 게임 제작 익히기

게임명_GuessNumber_05_완성

남은 함수를 만들고 게임을 완성해 보자.

만들어야 할 함수는 아래 두 함수다.

 

 

buttonResetClick함수 만들기

 

좀 더 쉬운 buttonResetClick함수부터 만들어 본다.

리셋버튼은 게임이 끝난 후 다시 할 때 누르는 단추다.

화면에서 리셋버튼을 클릭하면 어떤 일이 일어나야 할지 생각해 보자.

 

랜덤 수를 다시 만들어서 변수 randomInteger에 저장한다.

tryCount 횟수를 다시 0으로 만든다.

화면을 처음 시작했을 때의 모양으로 바꾼다.

 

아래와 같이 코딩하면 된다.

 

화면을 처음 시작했을 때의 모양은 앞에서 만들어 놓은 resetGame()함수를 다시 사용하면 된다.

이렇게 함수는 한번 만들어 놓으면 재사용할 수 있으므로 코드를 계속 나열하지만 말고 기능별로 분류해서 함수로 만들어 놓는 것이 중요하다.

프로젝트가 복잡해 질수록 함수의 활용과 중요성은 더욱 커지게 된다.

 

이제 가장 중요한 buttonEnterClick함수를 만들자.

 

buttonEnterClick함수 만들기

 

이 함수는 플레이어가 editText에 숫자를 입력한 후 엔터버튼을 누르면 랜덤으로 만들어져 있는 수와 입력한 수가 같은지 비교해서 결과를 알려주는 기능이다.

이 함수에서 바로 만들어도 되지만 여기서는 checkValue(값 검사)라는 함수를 따로 만들어서 이 함수에서 호출하도록 만들자.

 

 

checkValue함수 만들기

 

이 함수는 제일 아래쪽에 만든다.

 

이 함수는 엔터 버튼을 클릭했을 때 실행할 내용을 만든다고 했었다.

여기서 중요한 점은 엔터 버튼을 클릭할 때 어떤 경우가 있을지 모두 파악하는 것이다.

그래서 각 상황에 맞는 해결책을 코드로 만들어야 한다.

 

일단 글로 적어보자.

괄호 안에 해야 할 작업을 적었다.

 

첫째. 플레이어가 입력한 수를 가져와야 한다.

(변수를 하나 만들고 입력한 수를 가져와서 저장한다)

 

이때 아무 숫자도 넣지 않고 엔터 버튼을 누를 수도 있다. 이 경우에는 어떻게 할 것인가?

(변수에 아무것도 없으면 return으로 실행을 종료하고 함수로 돌아간다)

 

둘째. 입력한 수와 랜덤 수를 비교할 경우를 생각해 보자.

 

두 수가 같으면 어떻게 할 것인가?

(힌트에 '맞았다'를 표시하고 ?에 랜덤수가 나타나게 해서 확인하도록 한다)

 

또는 입력한 수가 더 크면 어떻게 할 것인가?

(힌트에 '더 작은수'라고 표시한다)

 

아니면 입력한 수가 더 작으면 어떻게 할 것인가?

(힌트에 '더 큰 수'라고 표시한다)

 

셋째. 두번째 경우를 해결한 후에는 어떻게 할 것인가?

(시도 횟수를 1 올린다)

 

코드 작성

첫째 내용

 

첫번째 내용부터 순서대로 만들어 보자.

 

위 코드의 뜻은 다음과 같다.

 

check(체크)라는 변수를 만들고 넣어라(=) editText 뷰의 text에 있는 값을. 문자열로 바꿔서

 

# toString() 함수는 문자열로 바꿔주는 기능을 가진 내장함수이다.

 

만약(if) (check변수에 문자열이 없으면) 

{힌트의 text 속성에 넣어라(=) 문자열을 가져오라 (string 이름 edit_text_hint 의 값)

실행을 종료하고 돌아간다(return)

}

 

둘째 내용.

 

두번째 코드를 만들자.

 

다음 코드는 입력한 수와 랜덤수를 비교해야 한다.

먼저 현재 입력한 수를 저장하고 있는 check 변수를 정수타입으로 바꿔야 한다.

랜덤수가 정수이므로 서로 비교하려면 같은 타입이 되어야 한다.

 

변환하는 값은 새로운 변수 getInputNumber에 저장한다.

이 변수는 정수 타입으로 바뀐 후 한 게임이 끝날때 까지 변하지 않으므로 val로 선언하면 된다.

위 코드의 뜻은 아래와 같다.

 

변하지 않는(val) 변수 getInputNumber에 저장하라(=) 변수 check를 정수 타입으로 바꿔서 

 

#toInt() 함수는 정수 타입으로 바꿔주는 내장함수이다.

 

이제 변수 getInputNumber와 변수 check를 비교할 수 있다.

비교해야 하는 경우는 세가지다.

 

  • 입력한 수가 크다면
  • 랜덤수가 크다면
  • 서로 같다면

 

위의 내용은 조건문(if ~else)을 사용하여 코드를 만든다.

if else조건문에 대해서는 '쌩초보 기초14'를 참고한다.

 

여기서 중요한 것은 비교하는 순서를 정하는 일이다.

코드는 일반적으로 위에서 부터 순서대로 아래로 실행한다.

if else문은 조건이 맞지 않으면 다음 조건을 실행한다.

그러므로 첫번째 조건은 제일 중요한 비교를 조건에 넣도록 하자.

 

  1. 서로 같다면 
  2. 입력한 수가 크다면
  3. 랜덤수가 크다면

#코드로 만들 때는 위의 조건문을 아래의 모양처럼 만들면 된다.

 

만약 (같다)면 { 실행하라 }

또 만약 (크다)면 { 실행하라 }

그 외는 { 실행하라 }

 

조건을 위의 순서대로 하고 해당 조건일 때 실행하는 부분을 넣으면 다음과 같다.

 

 

# 두 변수가 서로 같은 지 비교하는 연산자는 == 이다.

참고로 equal 기호가 3개인 연산자도 있는데 (===) 이것은 '참조 주소가 같은지'를 검사한다.

 

# randomInteger.toString() 은 두 수가 같을 때 랜덤수를 문자열로 바꿔서 ? 가 있는 자리표시자에 넣기 위함이다.

 

셋째 내용

 

조건문이 완료 되면 시도 횟수를 1올린다.

 

tryCount변수는 만들 때 Int로 타입을 정하고 0으로 초기값을 정했다.

현재 이 변수의 메모리에는 0이라는 값이 들어 있다.

이 값에 1을 더하려면 변수명 뒤에  ++ 를 사용하면 된다.

 

tryCount 변수의 메모리에 1이 저장된 후에는 textView의 text 속성값이 화면에 나타나게 한다.

그리고 자리표시자(%1$d)에 변수tryCount를 넣어주면 숫자 1이 나타날 것이다.

 

테스트

 

여기까지 완성한 후 실행해서 테스트 해보자.

어떤 문제점이 있는 지 파악한다.

 

 

문제점

 

발견한 문제는 무엇인가?

 

검사가 끝난 후 숫자가 그대로 있다.

지우고 다시 입력해야 하는 점이 불편하다.

 

이 문제를 해결하려면 어떻게 하면 될까?

 

마지막에 조건문을 하나 더 넣어준다.

 

숫자 입력을 다시 하는 경우는 '입력수와 랜덤수가 같지 않을 때' 이다.

그러므로 이 경우에 숫자를 입력하는 editText의 텍스트를 '문자열이 없는 상태'로 만들어 준다.

비교 연산자 != 는 '같지 않다'를 사용해서 조건을 만든다.

실행할 내용은 앞에서 한번 해본 대로 setText() 함수를 사용하여 바꿔준다.

 

다시 테스트

 

문제가 해결되었는지 다시 실행해서 확인해보자.

테스트는 다양하게 여러번 할 수록 좋다.

플레이어가 어떤 식으로 행동할 지 모르기 때문이다.

게임을 하다가 전화가 올 수도 있고

화면이 가로에서 갑자기 세로로 바뀔 수도 있다.

이런 모든 경우에 대비해서 코드를 만들어야 하지만

지금은 기초 연습이므로 생략하고 다음 게임을 만들 때 하나씩 적용해 보기로 한다.

 

마무리

 

코드를 모두 완성한 것 같다.

이제 필요없는 줄은 삭제하고 주석이 필요한 곳에는 넣기도 하면서 코드를 깔끔하게 정리한다.

 

안드로이드 스튜디오에서는 코드에 문제가 있는지를 오른쪽 세로줄에 표시해 준다.

 

마우스 포인터를 가져가면 위치와 설명이 나타난다.

옅은 색은 참고하라는 뜻이고

빨간색은 반드시 고쳐야 한다.

 

현재 이 코드에서는 3군데에 참고 표시가 나타나고 있다.

처음 2개는 view 이다.

밑줄에 마우스 포인터를 대보면 '매개변수(파라미터) view가 사용되지 않고 있다, 이름을 바꿀 수 있다.'

그리고 아래 파란색 문장에는 '싱글 람다 파라미터 선언을 지운다' 는 메시지이다.

오른쪽 파란색 글(More actions; 더 많은 행동)에 추가로 선택할 수 있는 메뉴가 있다.

 

초보자의 경우, 어떤 안내가 정확한 것인지 잘 모를 수 있다.

중대한 에러가 아닌 경우에는 되도록 그대로 둬도 무방하다.

정확한 내용을 알고 난 후에 선택하고 만약 잘못 바뀐것 같다면 Ctrl+Z 키를 눌러서 다시 되돌리면 된다.

 

view는 싱글 람다 매개변수이므로 삭제해도 되는 것 같다.

Remove single lambda~를 클릭해보자.

 

화면에 별 문제가 나타나지 않으면 상관없다.

 

 

이번에는 if에 나타난 참고문을 보자.

 

안내문은 다음과 같은 뜻이다.

 

if문이 3개 이상의 가지(조건)일 때는 , 대체할 수 있다, when 표현으로

 

위 코드는 if문의 조건이 3개 이므로 어떻게 변하는 지 when문으로 바꿔보자.

if글자 부분에 클릭해서 커서가 깜박이게 하고 Replace 'if' with 'when'을 클릭하자.

 

 

아래와 같이 바뀐다.

더 깔끔한 느낌으로 바뀌었다.

코드에 있던 경고가 모두 사라지고 완벽하다는 체크 표시가 오른쪽 위에 나타난다.

 

 

ActionBar 액션바 없애기

 

게임을 실행해 보니 세로일 때는 괜찮은데 가로로 했을 때 아래쪽 부분의 여백이 조금 부족하다.

뷰들을 위로 조금 올려도 되지만 이 프로젝트는 게임이므로 위쪽 제목이 있는 타이틀바(또는 액션바)를 보이지 않도록 설정하는 것이 더 보기가 좋다.

 

위 그림의 빨간색 테두리 부분을 ToolBar 또는 TitleBar 또는 ActionBar(액션바)라고도 했다. 그 위쪽 얇은 부분은 StatusBar(상태바)라고 한다.

여기서는 타이틀바를 나타나지 않게 한다.

 

프로젝트의 전반적인 설정은 AndroidManifest.xml 파일에서 관리한다고 말했다.

파일을 열고 코드를 아래와 같은 부분이 있을것이다.

 

android:theme="@style/AppTheme"

 

아래 2가지 중 하나로 수정한다.

Light.NoActionBar는 상태바와 버튼 색이 밝은색이고

그 아래는 상태바와 버튼색이 짙은색인 차이가 있다.

참고로 이런 색들은 모두 원하는 색으로 바꿀 수 있다.

다른 게임에서 다루기로 한다.

 

android:theme="@style/Theme.AppCompat.Light.NoActionBar"

android:theme="@style/Theme.AppCompat.NoActionBar"

 

 

여기서는 밝은색 버튼을 사용하기로 한다.

 

 

랜덤수 범위 수정하기

 

테스트 하기 위해 랜덤수 범위를 0~10까지 했었다.

이제 처음 만들때 0~100까지 정하기로 했으므로 랜덤 범위를 수정하자.

11을 101로 고치면 된다.

 

이상으로 게임 GuessNumber (숫자 맞춰봐) 만들기를 마친다.

완성한 코드는 아래와 같다.