말랑 연쇄는 같은 색 말랑이 네 개를 붙여 터뜨리는 낙하 퍼즐이다. 뿌요뿌요를 해 본 사람이라면 규칙을 따로 읽을 필요가 없다. 두 개씩 붙어 떨어지는 말랑이를 돌리고 옮겨 쌓고, 네 개 이상 이어지면 터진다. 터진 자리로 위의 말랑이가 내려와 또 넷이 맞으면 연쇄가 된다. 지금은 컴퓨터와 판 두 개를 나란히 놓고 동시에 겨루는 대전 게임이고, play.ghmun.com/mallang-chain 에 있다. 라이브러리 없이 HTML 파일 하나, 790줄이다.
처음에는 혼자 하는 점수 게임이었다
9월 28일에 처음 올린 버전은 혼자서 최고 점수와 최고 연쇄를 기록하는 게임이었다. 올리자마자 첫 버그가 나왔다. 시작 버튼을 눌러도 안내창이 게임판을 계속 덮고 있었다. 안내창은 display: flex로 만들었고, 시작하면 hidden 속성을 붙여 숨기는 방식이었다. 그런데 CSS에서 display를 직접 지정하면 hidden 속성의 기본 숨김이 그 값에 덮인다. [hidden] { display: none !important; } 한 줄이 빠져 있었다.
혼자 하는 연쇄 게임은 금방 심심해졌다. 연쇄를 길게 쌓을 이유가 점수 말고는 없어서다. 뿌요뿌요가 재미있는 것은 내 연쇄가 상대 판에 방해 뿌요로 쏟아지기 때문이다. 그래서 같은 날 컴퓨터 대전으로 다시 만들었다. 554줄 가운데 288줄을 지우고 523줄을 새로 썼다. 판 하나를 전역 변수로 다루던 코드를 게임 객체 두 개로 나누고, 모든 규칙 함수가 어느 쪽 판인지 받도록 고쳤다.
점수와 공격은 뿌요뿌요 츠의 공식을 그대로 썼다
점수는 터진 개수 × 10 × (연쇄 보너스 + 색 보너스 + 덩어리 보너스)다. 연쇄 보너스는 1연쇄 0, 2연쇄 8, 3연쇄 16, 4연쇄 32, 5연쇄 64이고 그다음부터는 32씩 오른다. 한 번에 두 색 이상 터지면 색 보너스, 다섯 개 이상 붙은 덩어리는 덩어리 보너스가 붙는다. 괄호 안 값은 1에서 999 사이로 자른다. 판을 완전히 비우면 2,100점을 더 준다. 이 값들은 내가 정한 게 아니라 뿌요뿌요 츠(1994)의 공식을 그대로 옮겼다. 30년 동안 사람들이 다듬어 온 균형을 굳이 새로 맞출 이유가 없었다.
공격도 츠의 방식이다. 연쇄가 끝나면 그 연쇄로 얻은 점수를 70으로 나눈 만큼 상대에게 방해돌을 보낸다. 나머지 점수는 버리지 않고 다음 공격에 이월한다. 그래서 짧은 연쇄를 여러 번 하는 것보다 긴 연쇄 한 번이 훨씬 세다. 매번 네 개씩 터진다고 치면 2연쇄는 방해돌 5개, 3연쇄는 14개, 5연쇄는 69개다. 판이 6칸 너비이니 5연쇄 한 번이면 열한 줄 넘게 쏟아진다. 내 쪽에 떨어질 방해돌이 쌓여 있을 때 연쇄를 하면 먼저 그것부터 지우고, 남는 만큼만 상대에게 간다. 받은 공격을 맞받아치는 셈이다. 방해돌은 한 번에 최대 30개까지 떨어지고, 바로 옆에서 말랑이가 터지면 같이 사라진다.
공정하게 하려고 두 판은 같은 순서의 말랑이를 받는다. 조각 순서를 공용 배열 하나에 만들어 두고, 양쪽이 각자 몇 번째까지 썼는지만 따로 센다. 한쪽 운이 좋아서 이기는 일은 없다.
컴퓨터는 일부러 조금 서툴게 만들었다
컴퓨터는 새 조각이 나오면 놓을 수 있는 자리를 전부 따져 본다. 판 폭이 6칸이고 회전이 4가지라 많아야 24가지다. 자리마다 조각을 실제로 떨어뜨려 본 판을 만들고 점수를 매긴다. 넷이 붙어 터질 덩어리가 생기면 크게 더하고, 가장 높은 기둥, 이웃 기둥 사이의 높이 차, 같은 색끼리 붙은 정도를 따진다. 어느 기둥이든 9칸 이상 쌓이면 크게 깎는다.
이 평가는 지금 놓으면 바로 터지는지만 본다. 연쇄를 미리 설계하지 않는다. 그래서 컴퓨터는 넷이 모이는 대로 바로바로 터뜨리고 큰 연쇄를 거의 못 만든다. 사람이 이기는 길이 여기에 있다. 차근차근 연쇄를 쌓으면 컴퓨터의 작은 공격을 받아치고 한 번에 판을 덮을 수 있다. 여기에 12% 확률로 가장 좋은 자리 대신 2~4등 자리를 고르게 했다. 손도 일부러 느리다. 조각이 나오면 0.2~0.5초 생각하고, 0.11초마다 한 번 돌리고, 0.085초마다 한 칸씩 옮긴다. 컴퓨터가 순간 이동하듯 내려 놓으면 실력과 상관없이 보기에 얄밉다.
느낌을 만드는 작은 것들
말랑이는 이미지 없이 캔버스에 그린다. 원형 그라디언트로 몸통을 칠하고 하이라이트와 눈 두 개를 얹는다. 같은 색 말랑이가 옆이나 아래에 붙어 있으면 둘 사이를 같은 색 띠로 이어 그려서 한 덩어리처럼 보이게 했다. 방해돌은 금이 간 회색 돌이다. 터질 때는 0.3초 동안 깜빡이며 살짝 부풀었다가 줄어든다.
떨어지는 속도는 조각 12개를 놓을 때마다 빨라진다. 처음에는 한 칸에 0.7초가 걸리고, 단계마다 0.055초씩 줄어 0.09초까지 간다. 바닥에 닿은 뒤 0.45초 동안은 아직 옮기거나 돌릴 수 있고, 이 유예는 12번까지 다시 늘어난다. 벽에 붙어서 돌리면 한 칸 밀어내 보고, 그래도 안 되면 위아래를 뒤집는다. 소리는 파일 없이 Web Audio로 만든다. 연쇄가 이어질수록 터지는 소리가 두 반음씩 올라간다.
사용법
키보드는 ←→로 옮기고, ↑나 X로 오른쪽, Z로 왼쪽으로 돌린다. ↓는 빠르게, 스페이스는 바로 내리기, P나 Esc는 일시정지다. 휴대폰에서는 화면 아래에 버튼 여섯 개가 나오고, 화면이 좁으면 내 판 아래에 컴퓨터 판이 놓인다. 맨 위의 X 표시 칸이 차면 진다. 승패 전적은 이 브라우저에 저장된다. 처음에는 넷이 보이는 대로 터뜨려도 이길 수 있지만, 몇 판 지나 조각이 빨리 떨어지기 시작하면 3연쇄 이상을 준비해 두는 쪽이 이긴다.