화면에 떨어지는 일곱 가지 블록을 빈틈없이 쌓아 가로줄을 지우는 방법
프로그램 파트
이 글은 프로그램 파트 Android의 첫 글이다. 이 분류에는 직접 실행해 보는 프로그램의 사용법을 둔다. 이번 글은 Qt 창으로 여는 테트리스를 사람이 직접 두는 방법이다. 같은 엔진으로 에이전트를 학습시키는 과정은 「테트리스를 배우는 강화학습 에이전트 만들기」에 따로 적혀 있다.
한 판이 돌아가는 방식
보드는 가로 10칸이다. 위쪽 4칸은 블록이 태어나는 숨은 줄이고, 화면에 보이는 높이는 22칸이다. 블록은 I, O, T, S, Z, J, L 일곱 가지다. 일곱 개가 한 묶음으로 섞여 나온 뒤에 다음 묶음이 시작하므로, 한 모양이 묶음 안에서 두 번 나오지는 않는다.
오른쪽 패널의 next에는 앞으로 나올 블록 다섯 개가 보인다. 지금 떨어지는 블록을 어디에 둘지는 그 다섯 개를 보고 정한다.
블록은 바닥이나 이미 쌓인 칸에 닿아 더 내려갈 수 없으면 그 자리에 고정된다. 가로 한 줄이 전부 채워지면 그 줄은 지워지고, 위에 있던 칸이 아래로 붙는다. 한 번에 지운 줄 수에 따라 패널의 last_reward가 달라진다. lines는 지금까지 지운 줄의 합이다.
| 한 번에 지운 줄 | last_reward에 더해지는 값 |
|---|---|
| 1줄 | 1 |
| 2줄 | 3 |
| 3줄 | 10 |
| 4줄 | 30 |
네 줄을 한 번에 지우는 값이, 한 줄씩 네 번 지우는 값의 합보다 크다.
게임을 켜고 시작하는 법
테트리스 소스의 tetris 폴더에서 Qt6가 잡히면 실행 파일이 만들어진다.
cmake -S . -B build
cmake --build build -j
./build/tetris_rl창이 열리면 status는 paused다. 블록이 저절로 떨어지지 않는다. P를 누르면 running이 되고, 기본 간격 650밀리초마다 한 칸씩 내려온다. 다시 P를 누르면 시계만 멈춘다. 멈춰 있는 동안에도 방향키는 동작하므로, 한 수씩 두고 싶을 때 쓴다.
R은 판을 처음 상태로 되돌린다. 되돌린 직후에도 시계는 멈춰 있으므로, 이어 두려면 P를 다시 누른다. 게임이 끝난 뒤에는 R만 받는다.
속도를 바꾸려면 +와 -를 쓴다. 간격은 50밀리초에서 2000밀리초 사이다. 숫자가 작을수록 빨리 떨어진다. 처음부터 간격을 정하려면 실행할 때 --tick-ms 1000처럼 준다.
키
창을 한 번 클릭해 포커스를 둔 뒤 키보드로 둔다.
| 키 | 하는 일 |
|---|---|
| ← → | 왼쪽, 오른쪽으로 한 칸 |
| ↑ | 시계 방향으로 회전 |
| Z | 반시계 방향으로 회전 |
| ↓ | 한 칸 내리기. 더 내려갈 수 없으면 그 자리에 고정 |
| Space | 바닥까지 내린 뒤 바로 고정 |
| P | 자동 낙하 일시정지와 재개 |
| R | 판을 리셋하고 일시정지 |
| + - | 낙하 간격을 50밀리초씩 조절 |
좌우 이동과 회전은 그 키를 누르는 순간 적용되고, 동시에 블록이 한 칸 내려간다. 아래 방향키와 Space만 이 추가 낙하를 따로 적용하지 않는다. Space는 갈 수 있는 맨 아래까지 붙인 뒤 바로 고정한다.
회전할 자리가 막혀 있으면 제자리만 보지 않는다. 좌우 한 칸, 위 한 칸, 오른쪽 두 칸 정도를 밀어 보며 빈 곳을 찾는다. 그 범위 안에 자리가 없으면 회전은 취소된다. 홀드와 착지 예상선은 없다.
오래 두는 순서
- next의 다섯 개를 보고, 지금 블록이 들어갈 낮은 자리를 고른다.
- 가로 높이를 들쑥날쑥하게 쌓지 않는다. 옆 칸과 높이 차가 크면 맞는 모양이 와도 줄을 메우기 어렵다.
- 블록 아래에 빈칸을 남기지 않는다. 같은 세로줄에서 위가 막힌 빈칸은 그 줄을 채워도 사라지지 않아, 줄을 지울 수 없게 만든다.
- 한 칸짜리 골을 남겨 두면 I 블록으로 네 줄을 한 번에 지울 기회가 생긴다. 그 골을 다른 블록으로 미리 막지 않는다.
- 쌓임이 위쪽 태어나는 자리까지 닿으면 다음 블록이 나오지 못하고 게임이 끝난다. 꼭대기를 비워 둔다.
에이전트와 같이 켜 둔 경우
--rl-port로 포트를 열고 학습 클라이언트가 붙어 있으면, 기본은 에이전트가 조작한다. 그때는 R 외의 키가 무시된다. 사람이 직접 두려면 클라이언트가 human 모드로 바꾼 뒤에 같은 키를 쓴다. 포트 없이 ./build/tetris_rl만 실행하면 처음부터 사람이 둔다.
댓글
0개아직 댓글이 없습니다.