산업용 컨트롤러로 게임 하나는 아깝다

맥주 게임기1부에서 만들어 이제 책상 옆에서 잘 돌아갑니다. 그런데 잘 돌아가는 기계를 보고 있으면 자꾸 아까운 생각이 듭니다. 산업용 컨트롤러에 터치 패널에 실물 레버까지 붙여 놓고, 게임은 딱 하나라니요. 이만한 장비면 게임기 한 대가 아니라 오락실 하나는 돌려야 하는 것 아닌가요.

마침 요즘 유튜버들이 Gamble With Your Friends를 하는 걸 재밌게 봤습니다. 친구들끼리 한 통장을 공유하며 카지노 게임으로 빚을 갚는 그 게임 말입니다. 그 안의 여러 종목 중 눈에 들어온 건 역시 블랙잭 — 딜러와 저, 21을 향한 눈치 싸움입니다. “저건 우리 게임기로도 되겠는데?” 싶었습니다.

원본 게임 〈Gamble With Your Friends〉 — 카드·칩·주사위가 바닥에 널린 카지노 난장판

영감을 준 원작 〈Gamble With Your Friends〉입니다. 친구들과 한 통장을 공유하며 여러 카지노 게임으로 빚을 갚는 게임이고, 그중 블랙잭이 이 프로젝트의 출발점이 됐습니다. © TEAM GWYF / TENSTACK · Steam

그래서 타이틀 화면을 게임 선택 메뉴로 바꾸고, 두 번째 게임으로 블랙잭을 꽂기로 했습니다. 로고도 “BEER POUR GAME”에서 **“ARCADE GAME”**으로 바꿨습니다. 이제 맥주는 여러 게임 중 하나고, 이 비싼 장비도 조금은 덜 아깝습니다.

ARCADE GAME — 타이틀이 게임 선택 메뉴가 됐다

로고를 “ARCADE GAME”으로 바꾸고, 타이틀을 게임 선택 메뉴로 바꿨습니다. 이제 맥주 따르기와 블랙잭 중 고릅니다. 위쪽엔 각 게임의 최고 점수(맥주 BEST 909 · 블랙잭 BEST 1200)가 뜹니다.

물리 버튼 4개와 IO 확장 보드 입력 4점

물리 버튼으로 블랙잭을 조작하고 싶었습니다 — 터치가 아니라요. 히트냐 스테이냐를 고민하다 버튼을 탕 치는 그 맛은 화면 터치로는 안 나옵니다.

필요한 버튼을 세어 보니 네 개입니다 — 플레이(딜 시작) / 히트 / 스테이 / 더블. 그리고 게임기에 이미 붙어 있는 IO 확장 보드의 입력이 정확히 4점입니다. 1부에서 램프 출력용으로 달아둔 보드의 입력 단자가 그대로 놀고 있었습니다. 보드 추가 없이, 배선 네 가닥이면 끝. 이런 우연은 기분이 좋습니다.

버튼이 눌리는 차례는 화면이 안내합니다. 베팅 중엔 PLAY 칩만, 제 턴엔 HIT/STAY/DOUBLE 칩만 제 색으로 켜집니다. LED 버튼 대신 화면이 그 역할을 하는 셈입니다.

주문한 아케이드 버튼이 오기 전에, 우선 택트 버튼 네 개를 임시로 배선해 입력 로직부터 확인했습니다.

임시 택트 버튼 4개 — 플레이·히트·스테이·더블

진짜 아케이드 버튼이 오기 전, 택트 스위치 네 개를 임시 패널에 붙여 IO 확장 보드 입력 4점에 물렸습니다. 배선 네 가닥으로 플레이·히트·스테이·더블이 그대로 들어옵니다.

두 번째 게임은 절반의 시간 — PLC 로직 재사용

첫 게임을 만들 때 세운 원칙 — PLC가 로직을 갖고, HMI는 연출만 한다 — 을 그대로 유지했습니다. 카드 섞기, 에이스를 1로 칠지 11로 칠지, 딜러가 몇에서 멈출지, 칩 정산까지 전부 컨트롤러 안에 삽니다. 화면은 그 값을 받아 카드를 그릴 뿐입니다.

이 구조의 보상은 두 번째 게임에서 왔습니다. 순위표, 이니셜 입력 키패드, 설정 팝업, 통신 계층 — 전부 맥주 게임 것을 그대로 재사용했습니다. 새로 만든 건 블랙잭 로직과 테이블 화면뿐입니다. 첫 게임이 하루였다면 두 번째 게임은 체감상 절반이었습니다.

디테일이 하나 있습니다. 딜러의 뒷면 카드는 공개 전까지 통신에도 실리지 않습니다(값 0). 컨트롤러 메모리를 들여다보는 꼼수를 써도 히든 카드는 알 수 없습니다. 게임기라도 판정의 단일 출처는 지켜야 하니까요.

블랙잭 룰 — 아케이드답게 비튼 지점

블랙잭 룰은 카지노 규칙을 그대로 옮기면 재미가 없습니다. 이 기계의 손님은 서서 5분 노는 사람입니다.

블랙잭 테이블 — 딜러 뒷면 카드와 플레이어 카드, 베팅 패널, HIT/STAY/DOUBLE 버튼

실제 블랙잭 화면입니다. 딜러는 앞면 7♣ + 뒷면 한 장(?), 저는 2♥·4♥로 6. 오른쪽에 판(1/10)·칩·베팅, 아래에 PLAY·HIT·STAY·DOUBLE 버튼. 카드는 이미지가 아니라 코드로 그립니다 — 자세한 건 아래에서.

  • 1,000칩으로 시작, 10판 승부. 끝났을 때 칩이 점수 — 많이 딴 사람이 명예의 전당에 이니셜을 새깁니다. 파산하면 그 자리에서 끝.
  • 베팅은 100 단위, 올인 버튼 있음. 마지막 판 올인 역전이 이 게임의 꽃입니다.
  • 더블다운은 표준대로 — 베팅을 2배로 걸고 딱 한 장만 더 받습니다.
  • 그리고 하나를 비틀었습니다.

교대 딜 — 내가 받으면 딜러도 받는다

일반 블랙잭은 제가 다 끝난 뒤에 딜러가 카드를 몰아서 뽑습니다. 결과가 한꺼번에 쏟아지니 아케이드에선 심심합니다. 그래서 제가 히트할 때마다 딜러도 한 장씩 받는 변형 룰을 넣었습니다 (딜러 합이 17 미만일 때만).

일반 블랙잭 vs 교대 딜 — 카드가 판 위에서 같이 쌓인다

제 카드가 늘 때마다 딜러 쪽에도 앞면 카드가 쌓입니다. 뒷면 한 장은 끝까지 숨어 있으니, “보이는 게 벌써 14인데 뒷면까지 하면…” 하는 계산이 매 턴 이어집니다. 히트 버튼이 갑자기 무거워집니다.

카드 52장을 이미지 없이 코드로 그리는 법

트럼프 카드 52장이 화면에서 제일 걱정이었습니다. 이미지를 만들 생각을 하니 아득했는데, 결론은 한 장도 안 그렸습니다. 카드는 흰 라운드 사각형에 랭크와 무늬 문자를 얹어 코드로 렌더링합니다. 에셋 제작 0분, 그리고 어떤 해상도에서도 선명합니다.

물론 공짜는 아니었습니다. 소소한 사건 셋:

  • 투명 잉크 사건 — 카드는 그려지는데 글자가 안 보였습니다. 색상 코드의 알파 자리를 착각해서 글자를 13% 투명도로 칠하고 있었던 것입니다. 흰 카드 위의 투명한 글자라니, 완벽한 위장이었습니다.
  • 다이아가 깨졌습니다 — ♠♥♣는 멀쩡한데 다이아만 네모(□)로 나왔습니다. 쓰던 한글 폰트에 카드 전용 다이아 문자(♦)가 없었던 것입니다. 도형 문자 ◆로 바꾸니 해결. 폰트에 어떤 글자가 들어 있는지는 폰트만 압니다.
  • 딜러가 파업했습니다 — 스테이를 눌렀는데 딜러가 뒷면만 까고 멈춰 섰습니다. 범인은 PLC의 고전, 스캔 순서입니다. 딜러의 카드 연출용 0.5초 펄스를 만드는 타이머가, 펄스를 세는 로직보다 앞에 있어서 완료되는 순간 자기가 먼저 펄스를 지워버리고 있었습니다. 두 룽의 순서를 바꾸는 것으로 끝 — 코드 한 줄 안 고치고 위치만 바꿔서 고치는 버그는 PLC에서만 맛볼 수 있는 별미입니다.

정산은 색상 배지로 보여줍니다. WIN은 초록, LOSE와 BUST는 빨강, BLACKJACK!은 앰버, PUSH는 회색 — 카드 사이에 큼직하게 뜨니 술자리에서 어깨 너머로 봐도 승패를 압니다.

버튼 케이스 3D 프린트 — 이번엔 펜으로 설계를 고쳤다

택트 스위치 4개를 부품함에서 꺼내 판에 납땜한 것이 임시 버튼이었습니다. 동작은 하는데, 새끼손톱만 한 스위치를 손끝으로 콕콕 찌르는 건 도저히 “블랙잭 치는 맛”이 아니었습니다. 그래서 2부의 레버처럼 Blender로 3D 프린트 버튼 케이스를 설계했습니다.

버튼 케이스 조립 렌더 — PLAY / HIT / STAY / DOUBLE

구조는 기계식 키보드에서 훔쳐 왔습니다. 큼직한 직사각 캡(32×24mm) 아랫면에 원형 소켓이 있어서 키캡처럼 스위치 플런저에 쏙 끼워집니다. 스프링은 없습니다 — 탈락 방지 플랜지가 캡을 잡아주고, 복귀는 스위치 자체 반발력이 합니다. 캡 윗면엔 PLAY/HIT/STAY/DOUBLE을 음각으로 새겼습니다. 사각 캡이라 돌아가지 않으니 글자가 항상 바로 보입니다.

이번 설계의 재미는 수정 방식이었습니다. 스위치들을 잇는 공통(COM) 배선이 지나갈 통로를 깜빡했는데, 이번엔 말로 설명하는 대신 3D 모델 위에 주석 펜으로 슥슥 표시했습니다. AI가 그 펜 자국의 좌표를 읽어 정확히 그 세 자리에 배선 채널을 뚫었습니다. 도면에 빨간 펜 긋던 그 감각 그대로입니다.

상판 아랫면 — 스위치 포켓 사이로 뚫린 배선 채널

교훈도 2부 그대로 반복됐습니다. 스위치 데이터시트를 확인하기 전의 추정 설계는 플런저 높이가 3mm나 달랐습니다 — 그대로 출력했으면 캡이 스위치를 상시 누른 채 조립되는 물건이 나올 뻔했습니다. 부품의 치수는 부품(의 데이터시트)에게 물어볼 것. 마지막으로 캡 속 소켓을 깊게 파서 플런저를 캡 안으로 삼키게 하는 다이어트로 케이스 높이를 처음 설계보다 7mm 넘게 깎았습니다.

남은 것 — 게임 플랫폼이 된 게임기

버튼 케이스를 출력해서 씌우면, 화면 속 안내 칩과 손끝의 버튼이 제대로 만납니다. 그때가 이 시리즈의 다음 이야기입니다 (2부에서 실패한 진동 레버의 복수전도 함께).

첫 게임을 만들 때는 “게임기 하나 만들었다”였는데, 두 번째 게임을 꽂고 나니 문장이 바뀝니다. “게임 플랫폼이 하나 생겼다.” 세 번째 게임은 뭐가 좋을까요 — 이미 버튼도 레버도 다 있는데요.

PLC가 로직을 갖는 구조 덕분에 순위표와 통신 계층을 그대로 재사용해, 게임기 한 대가 게임 플랫폼이 됐습니다.

▶️ 4부: 화면에 생명 불어넣기 — 그리고 AI가 AI에게 그림을 시켰다

🍺 이전 편: 1부 — 크랭크를 진짜 레버로 · 2부 — 레버 깎기와 진동 이식 실패기

문의