Tetris with Android

github: https://github.com/Zzu-h/AndroidStudy

 

Zzu-h/AndroidStudy

Contribute to Zzu-h/AndroidStudy development by creating an account on GitHub.

github.com

UML

UML


사실상 이전 코드 그대로 가져왔기에 이전과 별 다를게 없다. 다만 TetrisUI의 약간 없어진 메소드, DataManage를 제거 등이 존재한다.

 

UI

가로 10 세로 22의 길이로 설정하고 게임 진행은 해당 칸 아래에 있는 버튼으로 조작한다.

 

 

시작을 위해 아래의 버튼을 클릭하면 되며, 게임 진행 중에는 이 버튼이 블럭이 아래로 하강하는 기능을 수행한다.
위의 버튼을 클릭하면 블럭의 rightRotate를 수행한다.

실행 화면

MainActivity

MainActivity 클래스는 테트리스를 진행하는데 있어 모든 클래스를 집합해 둔 클래스 이다.
UI를 생성하고, 점수판과 게임 진행 객체, 게임의 상태를 생성한다.





TetrisUI

테트리스의 전체 UI를 구성한다.

테트리스는 가로 10칸, 세로 22칸으로 구성하기 위해 TextView을 2차원 배열로 구성한다.

또한 점수를 표시하기 위한 보드를 만들어 TextView의 텍스트로 점수를 갱신한다.


메뉴바는 게임 관련 메소드를 제공한다.
게임이 종료되었을 경우 새 게임을 진행하는 것, 게임 저장 및 불러오기, 게임 종료 또는 프로그램 종료를 제공한다.

제공 메소드

  • setLayout(int[][])
    • 테트리스 게임 Layout을 갱신한다.
  • setScore(int)
    • 테트리스 게임을 진행할 경우 점수판의 점수를 갱신한다.
  • setText(String)
    • 게임 진행 중이 아닐 경우 현재 상태에서 제공하는 메시지를 표시한다.




ScoreBoard

현재 실행되고 있는 프로그램의 점수를 저장하는 객체이다.
점수의 갱신이 필요한 경우 현재 점수를 갱신하고, 해당 점수에 맞는 블럭의 스피드를 조절한다.

제공 메소드

  • update(int)
    • 새로 얻은 점수를 갱신하기 위한 메소드이다.
    • 게임 진행 중인 상태에 사용한다.
  • setScore(int)
    • 입력받은 점수로 초기화한다.
    • 저장된 게임을 불러올 경우 저장된 게임의 점수를 불러와 초기화한다.
  • getScore()
    • 현재 점수를 리턴한다.




GameRun

게임 진행의 메인 클래스이다.
쓰레드를 상속받아 쓰레드에 올려 게임을 진행한다.

게임 진행 상태 State가 2가 입력 될 경우 BlockDrop이 실행 된다. 그 후 생성된 블럭이 떨어지며 게임이 진행된다.

떨어지는 블럭을 조정하는 BlockMove를 통해 해당 블럭을 조정한다.

BlcokDrop 이 끝날 경우 테트리스 게임 Layout을 탐색하여 완성된 줄을 탐색한다. 탐색 후 그 라인을 삭제하고 UI를 갱신한다.
또한 게임이 끝났는지를 체크하여 게임 종료 유무를 판단한다.

제공 메소드

  • run(): 테트리스 게임을 진행한다.
  • getPlace()
    • 테트리스 게임의 진행 정보인 2차원 배열을 제공한다.
    • 게임의 쌓여진 현 상태를 반환
  • setPlace(int[][])
    • 테트리스 전체 Layout을 입력받은 배열로 갱신한다.
  • initPlace()
    • 이전 상태가 무엇이었든 초기 상태로 돌린다.
    • 즉, 어떠한 블럭을 다 없애고 초기화 한다.

BlockDrop

블럭이 떨어지는 원리는 다음과 같다.

  1. 현재 저장된 배경 Layout 데이터를 temp 배열에 저장한다.
  2. 블럭을 Layout을 이루는 place에 저장한다.
  3. 현재 블럭이 가지는 좌표에서 1증가된 y좌표가 layout에서 장애물이 있는지 판단한다.
    • 혹여 장애가 있어 내려갈 수 없는 상태일 경우 현재 블럭 데이터를 layout에 표현하고 이 동작을 종료한다.
    • 장애가 없을경우 다음을 수행한다.
  4. 생성된 블럭의 y좌표를 1씩 증가한다.
  5. 새로 갱신된 place를 UI로 표현한다.
  6. place에 temp에 저장된 초기 배경을 저장하고 2번부터 이 동작이 끝날 때까지 수행한다.

블럭의 회전이 랜덤하게 이루어질 수 있도록 randRotate()를 호출한다.

BlockMove

생성된 블럭의 동작을 제어한다.
입력받은 key값을 ActionRouter()를 통해 각각에 맞는 블럭 제어를 한다.
좌, 우, 하강, 좌회전, 우회전, 수직하강을 통해 블럭제어를 수행한다.
BlockDrop과 같이 해당 동작을 수행하고 layout을 갱신하여 UI에 표시한다.

또한 게임 중 입력받은 키에 따라 게임의 일시정지와 게임 종료를 수행한다.

Block

각 블럭 모양의 최상위 클래스이자 추상클래스이다.
각 블럭은 이 클래스를 토대로 생성한다.

shape[a][b][c] 3차원 배열로 모양을 정하는데, a는 해당 모양의 회전한 모양을 의미한다.
shape[rotation][b][c]를 통해 하나의 블럭을 구성한다.

제공 메소드

  • RightRotate()
    • 블럭의 오른쪽 회전을 하여 저장 후 리턴한다.
  • LeftRotate()
    • 블럭의 왼쪽 회전을 하고 저장 후 리턴한다.
  • rShift()
    • x좌표를 증가시킨 후 리턴한다.
  • lShift()
    • x좌표를 감소시킨 후 리턴한다.
  • downShift()
    • y좌표를 증가시킨 후 리턴한다.
  • getShape()
    • 현 블럭의 모양을 반환한다.

'Android > Tetris with Android' 카테고리의 다른 글

시작하기 앞서  (0) 2021.01.24
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기