봇과 대전하는 3D 카트 게임 만들기
차량 조작과 벽 충돌을 먼저 만들고 봇·점수·재시작을 연결합니다. 작은 독자적 경기장에서 입력 중단과 라운드 초기화까지 확인하는 제작 가이드입니다.
GPT-6 Astra · Three.js · JavaScript · Web Audio
실제 실행 기록 · 확인한 범위만 공개
60초 수집 경기의 입력·종료·재시작을 시험했습니다
직접 제작하고 로컬에서 실행한 별도 학습용 샘플입니다. 단순 도형 경기장에 조작 차량 1대와 봇 2대를 만들었습니다. 실제 키보드 획득, 기본 음소거, 일시정지, 반복 초기화, 60초 종료, 두 손가락 입력과 취소 상태를 확인했습니다. 게임의 완성도·성능 전체 검증은 아닙니다.

무엇을 입력했나요?
- 60초·YOU/BOT1/BOT2·고정 아이템 8개·장애물 3개
- 방향키/WASD, 전진+회전 동시 터치, 기본 음소거
- 일시정지·두 번 재시작·프레임 시간이 큰 상황의 순수 함수 입력
실제로 얻은 결과
키보드 후진으로 아이템을 실제 얻고 손을 뗀 뒤 입력이 비었습니다. 실제 라운드가 0초에 종료됐고 다음 프레임에도 차량 상태가 같았습니다. BOT2의 획득과 동시 터치 두 입력·취소 후 빈 입력을 관측했습니다.
실제 키보드: 아이템 1개 이상 획득
종료: time=0 / ended=true / 이후 차량 상태 유지
동시 터치: forward=true, left=true → cancel 후 {}
새 경기 두 번: 60초 / 0점 / 초기 위치원문과 실행 결과를 대조한 항목
| 확인 조건 | 실제 관측 |
|---|---|
| 실제 키보드·정지·초기화 | 아이템 획득, 키 해제 후 빈 입력, 일시정지 시간 유지, 재시작 두 번 초기 상태 |
| 60초 경기와 입력 취소 | 브라우저 종료 상태·다음 프레임 대조, CDP 터치 두 점·touchCancel 확인 |
| 충돌·중복 점수·종료 경계 | Node에서 장애물과 외곽 판정, 같은 아이템 두 차량의 중복 획득 차단, 종료 후 불변 확인 |
실패·수정과 경계 조건
검증 환경에서 발견한 시간 처리
관측: 저속 렌더링에서 프레임 상한을 시계에도 적용하면 경기 시간이 느리게 줄었습니다.
수정·대응: 경기 시계는 실제 경과 시간, 이동은 큰 점프 방지용 상한으로 분리했습니다.
다시 확인: 1초 경과 입력이 남은 시간을 1초 줄이는 회귀 검사와 실제 0초 종료를 확인했습니다.
조작 검사의 범위 구분
관측: 첫 일시정지 포인터 조작 뒤에는 기대한 정지 상태를 얻지 못했습니다. 봇 검사도 BOT1만 기다리면 제한 시간 안에 점수가 나지 않았습니다.
수정·대응: 현재 상태를 먼저 관측하고 키보드 Space로 일시정지를 재검사했습니다. 봇 둘을 구분해 기록했습니다.
다시 확인: 키보드 일시정지의 시간 불변과 BOT2의 획득만 확인 완료로 기록합니다. 포인터 일시정지 전반을 통과로 주장하지 않습니다.
직접 다시 확인하는 순서
- 소스 ZIP을 새 폴더에 풀고 README의 로컬 HTTP 명령으로 실행합니다.
- input.json의 가상 입력과 같은 값을 선택하고 해당 버튼을 실제로 조작합니다.
- verification.json의 관측값과 아래 적용 범위를 함께 대조합니다.
입력·소스·결과 파일
입력, 생성 응답 또는 직접 작성한 소스, 검증 자료의 성격을 각 사례에서 구분합니다. 공개 테스트 자료이며 실제 고객 성과 자료가 아닙니다.
- 로컬 재현 안내README.md · 2,138 bytes
- 실행 입력input.json · 93 bytes
- 샘플 제작 요구사항prompt.txt · 593 bytes
- 독립 샘플 소스 ZIPsample-source.zip · 470,814 bytes
- 실행 결과·적용 범위verification.json · 23,739 bytes
실행 환경·적용 범위
- 60초 경기의 시간 처리·키보드 조작·BOT2 획득·키보드 일시정지·초기화가 관측 범위입니다. 기기별 주행 성능과 장시간 봇 동작은 별도 성능 시험 대상입니다.
- 터치 입력은 데스크톱 CDP 이벤트로 관측했습니다. 실제 단말 터치·음향 청취·장기 메모리·전체 벽 모서리·탭 전환과 포인터 일시정지는 이 기록의 검사 범위 밖입니다. 복귀는 버튼으로 수동 재개합니다.
- 직접 작성한 별도 로컬 샘플의 동작 기록입니다. 원작 재현이나 지정 AI 모델 간 성능 비교와 구분합니다.
- 화면 폭 검사는 데스크톱 Chromium 뷰포트 에뮬레이션 기준입니다. 실제 단말·Safari·Firefox·장기 운영은 별도 환경 시험 대상입니다.

01준비할 자료
- 독자적인 경기장 스케치: 바깥 벽, 장애물 3개, 차량 출발 위치와 점수 아이템 위치를 정합니다.
- 작은 첫 규칙: 플레이어 1대와 봇 2대가 60초 동안 점수 아이템을 모읍니다. 원작의 무기·상표·맵을 사용하지 않습니다.
- 키보드 조작표와 휴대전화 버튼 배치. 동시에 전진·좌회전을 누를 수 있는지, 손을 떼면 어떻게 멈출지 정합니다.
- 종료와 재시작의 초기 상태: 차량 위치, 점수, 남은 시간, 아이템, 입력과 소리 상태를 목록으로 만듭니다.
아래 도구는 이 예시의 구현 방향입니다. 선택한 AI 도구에서 코드·파일을 다룰 수 있는지 먼저 확인하고, 설치 버전과 실행 방법을 기록하세요.
02시작 프롬프트
GPT-6 Astra로 [경기장 스케치]를 바탕으로 작은 Three.js 카트 게임을 만들어 주세요. 원작 브랜드·차량·맵·무기·그래픽을 복제하지 말고 단순 도형의 새 차량과 경기장을 사용하세요. 단색 배경·재질·UI만 사용하고 그라디언트 효과를 넣지 마세요. 첫 버전은 플레이어 1대와 봇 2대, 60초 제한, 바닥 점수 아이템 수집입니다. 아이템 하나당 1점이며 같은 아이템을 여러 차량이 동시에 중복 획득할 수 없어야 합니다. 차량 조작과 벽 충돌을 먼저 완성한 뒤 봇을 추가하세요. 이동은 프레임 간 경과 시간을 기준으로 계산하고 화면 복귀 때 큰 시간 차로 차량이 튀지 않게 처리하세요. 탭이 숨겨지면 경기 시간과 움직임을 함께 일시정지하고 화면 복귀 때 재개하세요. 키보드 WASD/방향키와 동시에 누를 수 있는 터치 버튼을 제공하세요. 키·손가락 해제, pointercancel, 창의 초점 이탈에는 입력을 초기화하세요. 봇은 아이템을 목표로 움직이고 벽 근처에서 방향을 바꿉니다. 일정 시간 진행하지 못하면 새 목표를 고르게 하세요. 라운드 종료에는 조작과 점수 계산을 멈추고 결과를 보여 주세요. 재시작하면 차량·아이템·점수·시간·입력 상태를 모두 초기화하고 이벤트와 애니메이션 루프를 중복 등록하지 마세요. 소리는 사용자의 시작 동작 이후에만 재생하고 음소거 버튼을 두세요. 서버·온라인 방·Discord 연동은 제외합니다. 충돌, 봇 정체, 입력 중단, 종료 직전 획득, 반복 재시작을 확인하는 절차를 함께 설명하세요.
03만들고 다듬는 순서
첫 경기의 재미를 작은 규칙으로 정합니다
공개 카트 사례는 온라인 대전과 여러 무기를 포함하지만, 이 레시피는 새 경기장에서 점수 아이템을 모으는 로컬 봇 경기로 시작합니다. 공격·추적 미사일·온라인 방까지 한 번에 요청하면 조작이 불편한 이유를 찾기 어렵습니다. 첫 성공 조건은 차량을 움직여 벽에 막히고 아이템 한 개를 얻는 것입니다.
차량 하나로 입력과 충돌을 확인합니다
봇을 추가하기 전에 전진·후진·좌우 회전과 벽 충돌을 확인합니다. 차량이 모서리에 끼면 경기장 모양과 충돌 처리 중 어디가 원인인지 나누어 요청합니다. 매 프레임 고정 거리를 이동하면 화면 갱신 속도에 따라 속도가 달라질 수 있으므로 경과 시간을 사용하는지 확인합니다.
손을 뗀 뒤에도 움직이는 문제를 잡습니다
손을 뗐는데도 차량이 계속 달린다면 눌린 입력이 남아 있는지 살펴보세요. 손가락이 버튼 밖으로 나가거나 알림·다른 창으로 이동한 뒤에도 같은 문제가 생길 수 있습니다. 전진과 회전 버튼은 동시에 누를 수 있게 하고, 각 손가락의 입력을 따로 관리하도록 요청합니다. 해제·취소·초점 이탈 때는 해당 입력 상태가 초기화되어야 합니다.
봇은 관찰 가능한 작은 행동으로 넣습니다
봇 두 대를 추가하고 가까운 아이템 선택, 목표를 향한 회전, 벽 회피만 먼저 둡니다. 벽 앞에서 정지한 봇이 오래 같은 목표를 유지하면 일정 시간의 이동 거리로 정체를 판단해 목표를 바꾸게 합니다. 처음부터 사람 같은 지능을 요구하기보다 어떤 상황에서 움직임이 막히는지 관찰합니다.
점수와 종료 시점을 한 규칙으로 묶습니다
한 아이템을 동시에 밟아도 중복 점수가 나오지 않게 수집 여부를 먼저 갱신합니다. 제한 시간이 끝난 뒤 충돌 판정이나 늦은 효과가 점수를 더하지 않아야 합니다. 종료 직전 아이템을 얻는 경우를 시험하고 남은 시간 표시와 실제 경기 종료가 다른 시계로 움직이지 않게 합니다.
다시 시작해도 한 경기만 돌아가게 합니다
재시작을 여러 번 한 뒤 속도가 빨라지거나 소리가 겹치면 반복 루프나 이벤트가 쌓인 것일 수 있습니다. 차량·아이템·점수·입력은 새 경기 상태로 돌리고 기존 이벤트를 재사용하거나 정리하도록 요청합니다. 소리는 시작 버튼 이후에만 켜고 음소거가 재시작 뒤에도 유지되게 합니다.
04완성 전 체크
직접 확인한 항목만 체크하세요. 체크 상태는 저장되거나 서버로 전송되지 않습니다.
05막힐 때 확인할 것
다른 창으로 다녀오면 차량이 계속 움직입니다
눌린 키와 터치 입력이 해제되지 않았는지 확인합니다. 초점 이탈과 pointercancel에서 가속·회전 상태를 지우고 화면 복귀 때 지나치게 큰 프레임 시간 차를 그대로 적용하지 않도록 요청합니다.
봇이 벽에 붙은 채 아이템을 향해 회전만 합니다
벽 충돌에 대한 방향 변경과 정체 판단을 분리해 요청합니다. 일정 시간 위치 변화가 작으면 현재 목표를 버리고 다른 아이템이나 복귀 지점을 선택하게 합니다.
재시작할 때마다 속도나 소리의 겹침이 늘어납니다
재시작이 requestAnimationFrame과 이벤트를 새로 등록하는지 확인합니다. 루프는 한 개만 유지하고 경기 상태를 초기화하는 방식으로 바꾸며, 사용을 마친 음원과 임시 객체도 정리하게 합니다.
06출처와 참고 자료
아래 공개 사례는 주제의 참고 자료입니다. 이 글의 도구 선택·절차·프롬프트는 AI Tools Lab의 독립적인 편집 예시이며, 원 제작자의 실제 입력이나 실행 재현 기록이 아닙니다.
- GPT-6 Astra 카트 게임 공개 제작 기록·코드 ↗amsminn · 공개 제작 기록의 모델: GPT-6 Astra
- Three.js · Scene의 장면 구성 ↗
- MDN · Pointer events와 입력 취소 ↗
- MDN · Web Audio 사용 시 고려 사항 ↗
amsminn의 공개 제작 기록은 GPT-6 Astra로 만든 카트 사례와 로컬 봇 연습·별도 온라인 서버의 구분을 제공합니다. 위 프롬프트는 그 원작을 복제하지 않고 새로운 수집 경기 규칙으로 구성한 편집 예시입니다.