본문 바로가기

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

게임명_GuessNumber_04_코딩

게임 화면 디자인을 마쳤다.

이제 본격적으로 디자인에 들어있는 View(뷰)들이 내가 원하는 대로 잘 작동하도록 코딩하는 일만 남았다.

코틀린으로 코딩을 해보자.

 

다시 말하지만 이 글에 처음부터 왔거나 안드로이드 스튜디오 사용법을 잘 모른다면 '첫 프로젝트 만들기'를 먼저 익히길 바란다. 코틀린 '쌩초보를 위한 기초'도 먼저 학습하면 더욱 좋다.

 

 

이 게임에서 가장 핵심적인 기능은 다음과 같다.

 

  • 임의의(랜덤) 수를 만들어 변수에 저장해 둔다.

  • ENTER버튼을 클릭했을 때 editText에 있는 수와 랜덤수를 비교하여 결과를 변수에 저장한다.

 

이 핵심 기능만 잘 작동하면 그 외 다른 것은 쉬운 작업들이다.

이 핵심 기능의 코딩 부터 시작한다.

 

게임이든 앱이든 첫 화면이 있을 것이다.

이 첫 화면을 Main Activity(메인 액티비티)라고 한다.

프로젝트를 처음 만들면 main이라는 이름을 붙여서 자동으로 만들어 준다.

 

Activity는 쉽게 말하면 '어떤 작업을 하는 화면'이다.

지금 만드는 게임은 하나의 화면에서 모든 이루어지므로 Activity가 1개다.

Activity는 필요하면 만들 수 있다.

 

한 개의 Activity 는 기본적으로 2가지 파일을 가진다.

 

디자인을 담당하는 파일 activity_main.xml

코드를 작성하는 파일 MainActivity.kt

 

파일 이름에 같은 글자(main)이 있는 것 처럼 일반적으로 한 쌍의 파일로 이루어져 있다.

만약 새로운 작업이 코드 작성이 필요 없는 경우에는 디자인 파일만 새로 만들고

디자인 파일이 필요없으면 코드 만드는 파일만 새로 만들 수 있다.

 

이 파일들이 어디 있는지 확인하자.

 

 

왼쪽 프로젝트 폴더에서 해당 파일을 더블클릭하면 열린다.

그리고 AndroidManifest.xml 은 모든 activity를 관리하는 파일이다.

이제 코드를 작성해야 하므로 MainActivity.kt 탭을 누르자.

 

 

기본적인 설정이 코딩되어 있다.

각 코드의 설명은 '첫 프로젝트 만들기10'에서 알아보았다.

 

random()함수

 

먼저 random(랜덤)값을 넣을 변수가 필요하다.

 

 

변수는 다음과 같이 만든다.

 

  • '보기 제한자'는 이 파일에서만 접근할 수 있도록 private을 붙인다.
  • 변수 이름은 랜덤으로 정수(Integer)를 만들것 이므로 randomInteger로 한다.
  • 랜덤수는 게임을 하면서 계속 만들어야 하므로 변할 수 있는 var로 선언한다.

랜덤수를 만들 수 있는 Random() 이라는 내장 함수(function 또는 method)가 있다. 

대입 연산자( = )을 붙여서 연결한다. 

그러면 위 그림의 녹색처럼 자동으로 import 해서 Random함수를 연결해 주므로 우리가 신경 쓸 필요없다.

정수의 랜덤수를 만들 때는 Random.nextInt()를 사용한다.

괄호 안에 넣을 인자를 11로 하면 '0부터10까지' 라는 뜻이다.

결론적으로 위 코드는 변수 randomInteger에 0~10까지 범위의 랜덤수를 Random()함수로 만들어 저장하라는 코드이다.

 

Button(버튼)을 담을 변수

 

코드는 디자인 창에서 만든 ENTER 버튼이 있다는 것을 모른다.

그래서 이 버튼도 변수를 만들어서 저장해야 한다.

 

엔터 버튼을 저장할 변수명은 buttonEnter라고 하고 타입은 Button을 선택한다.

import에 자동으로 widget(위젯)에 있는 Button(버튼)을 연결해서 참조한다. 

그런데 빨간 밑줄로 경고를 나타내고 있다. 

'이 속성은 초기화 하거나 추상화 해야 한다.'라는 경고문이다.

 

엔터 버튼은 게임이 시작되면 바로 초기화하지 않아도 된다.

왜냐하면 플레이어가 게임 시작하면 엔터 버튼부터 클릭하지 않기 때문이다.

이런 경우 나중에 초기화한다는 기능을 가진 lateinit (늦은 초기화) 키워드를 붙일 수 있다.

다음과 같이 수정하자.

 

lateinit을 사용하면 var 변수만 가능하다.

 

다 되었으면 아래와 같은 모습이다.

 

위와 같이 프로젝트의 모든 부분에 영향을 미치는 변수들은 액티비티의 시작을 알리는 노란색 중괄호 바로 아래에 선언한다.

 

버튼 View를 변수에 저장하기

 

이제 변수에 해당하는 View를 디자인 레이아웃에서 불러와서 변수에 넣어주자.

 

프로젝트가 실행하면 제일 먼저 매인액티비티.kt를 찾아서 실행한다.

이 MainActivity안에서는 방금 만든 변수를 만들고 초기화한다.

그것이 끝나면 함수 중에서는 onCreate()함수를 제일 먼저 실행한다.

이 함수를 진입점(entry point)이라고 부른다.

코틀린에서 설명했던 내용이다.

 

게임을 시작하면 버튼을 인식해야 하므로 변수 buttonEnter로 버튼 View를 불러오는 코드를 onCreate()함수 안에 넣어야 한다.

 

 findViewById 함수 이름은 글자 그대로 'id로 View를 찾아라'는 뜻이다.

< > 화살괄호에는 타입을 넣는다.

추론이 가능하면 생략할 수 있다.

 

함수의 인자를 넣는 ( )괄호 안에는 찾아야 하는 View가 있는 위치를 적어준다.

안드로이드 스튜디오는 모든 리소스(resource)를 R 이라는 상수에 저장한 후 id 또는 name으로 리소스를 불러올 수 있게 해준다. 그러므로 buttonEnter의 위치는 R.id.buttonEnter로 나타낼 수 있다. 

여기서 보듯이 마침표( . )는 어떤 위치에 접근할 때 또는 함수를 호출할 때 사용한다.

 

리스너 (Listener)

 

플레이어가 버튼을 클릭할 때 그것을 알아차리는(듣는) 함수가 있다.

Listener 함수다.

글자 그대로 '듣는 사람, 청취자'라는 뜻이다.

이 함수는 행동(액션)이 일어날 때 마다 호출되는 함수이며 여러 종류가 있다.

여기서는 버튼 클릭을 들어야 하므로 ClickListener라는 글자가 만들어졌다.

여기에 설정,준비라는 뜻의 setOn을 붙여서 setOnClickListener라는 함수를 만들어 놓았다.

이 setOnclickListener 함수를 사용하여 버튼이 클릭될 때 해야할 작업을 만들 수 있다.

 

버튼에 setOnClickListener 연결하기

 

이 함수도 게임을 시작하는 즉시 발동해야 하므로 onCreate()함수에서 코드를 작성한다.

 

 

여기서는 setOnClickListener 함수에 직접 적용하는 람다함수를 사용할 것이므로 위의 옵션에서 두번째 형태로 만들것이다. 람다 함수에 대해서는 코틀린 '쌩초보를 위한 기초13'을 참고한다.

 

buttonEnter가 setOnClickListener 함수를 호출하고 클릭 이벤트가 발생하면 view라는 매개변수를 통해 buttonEnterClick()함수에 전달한다.

buttonEnterClick()함수는 아직 만들지 않았기 때문에 빨간색이다.

 

 

reset버튼도 위의 과정과 같이 만들자.

 

 

buttonReset도 플레이어가 리셋단추를 클릭했을 때 buttonResetClick() 함수를 실행하도록 한다.

함수는 조금 있다가 만들기로 한다.

view 아래 밑줄은 '람다의 싱글 파라미터 선언은 생략할 수 있다'는 안내다.

생략할 수는 있지만 일단 람다 표현에 익숙하지 않으므로 그냥 두기로 한다.

 

View를 담을 변수들

 

이번에는 화면에 있는 View들을 담을 변수를 선언한다.

버튼 변수 아래에 적는다.

 

마지막에 있는 변수 tryCount는 숫자가 맞는지 체크한 후 1씩 올리는데 사용할 시도 횟수이다.

초기값은 0으로 정한다.

 

변수에 View 연결하기

 

View를 담을 변수에 화면에 있는 뷰들을 찾아서 연결한다.

 

 

이제 남은 일은 엔터와 리셋버튼을 클릭했을 때 실행할 함수들을 만드는 것이다.

만들어야 할 함수는 다음과 같다.

 

buttonEnterClick( )

buttonResetClick( )

 

buttonEnterClick( ) 함수 만들기

 

buttonEnterClick()함수를 onCreate()함수 바깥에 만든다.

 

buttonEnterClick()함수에는 엔터버튼이 클릭되면 실행할 내용을 가진 함수이다.

 

아래의 과정을 거쳐 이 함수에 도달한다.

 

  1. 플레이어가 화면에서 엔터버튼을 클릭한다.
  2. setOnClickListener 함수가 누르는 소리를 듣고 buttonEnterClick 함수로 전달한다.
  3. buttonEnterClick함수는 입력한 값과 랜덤으로 만든 값이 서로 일치하는지 검사한다.

 

 

화면 테스트

지금까지 작성한 내용을 실제폰 또는 가상화면으로 확인해 보자.

실행(Run)하는 방법은 '첫 프로젝트 만들기'를 참고하기 바란다.

 

%1$s , %1$d 부분이 아직 나타나지 않는다.

이 부분은 각 View의 text 속성에 지정한 strings.xml에 저장한 문자열들이다.

이 부분을 해결하자.

앞에서 프로젝트가 실행하면 제일 먼저 변수를 메모리에 저장한 후 진입점인 onCreate()함수를 실행한다고 했다.

그런데 지금까지는 View만 불러와서 저장했고 %1$s와 d 자리에 무엇을 넣을지는 정하지 않았다.

 

이것을 해결하기 위해 함수를 하나 더 만든다.

함수 이름은 resetGame()이라고 하자.

buttonResetClick()함수 아래에 만든다.

 

getString( )함수는 문자열을 가져오는 함수다.

 

함수의 첫번째 줄을 설명하면 다음과 같다.

 

textViewNumber의 text 속성에 넣어라(=) 문자열 가져오기(문자열 이름 guess_number의 값, %1$s에는 문자열 ?)

 

세번째 줄 마지막에는 tryCount변수 값을 넣는다.

네번째 줄은 모양이 조금 다르다.

숫자를 입력하는 부분인 editText는 setText함수로 text값을 넣을 수 있다.

마지막에 "" 는 %1$s에 문자열이 없도록 하는 표현이다.

 

작성을 다했으면 이 resetGame()함수를 onCreate()함수에서 불러오도록 하자.

 

이제 다시 실행해서 어떻게 변했는지 확인해보자.

 

게임을 시작한 후 첫화면이 깔끔하게 나왔다.

 

이제 마지막 코드 2개만 남았다.

 

buttonEnter( )

buttonResetClick( )

 

이 게임의 가장 핵심 코드이기도 하다.

다음 글에서 완성하기로 한다.