안녕하세요, 코딩은 못 하지만 IT가 너무 궁금한 비개발자 루카(Luka)입니다.
게임을 하나 만들었어요. 위에서 캐릭터를 떨어뜨리고, 같은 캐릭터 둘이 닿으면 합쳐져서 다음 단계 캐릭터가 되는 게임이에요. 수박게임이라고 하면 아실 거예요. 과일 대신 제 캐릭터들이 떨어져요.
AI한테 처음 한 말은 이랬어요.
"진화하고 도파민 터지는 게임."
여기서 바로 해볼 수 있어요. 설치 없어요.
그날 시간표
9월 5일이에요. 작업 기록에 남은 시각이에요.
| 시각 | 한 일 |
|---|---|
| 11:57 | 설계 문서 |
| 11:59 | 캐릭터 그림을 뽑을 지시문 |
| 12:33 | 캐릭터 그림 11장 완성 |
| 12:43 | 귀가 잘린 그림 세 장 다시 자르기 |
| 17:08 | 만들 순서 정리 (아홉 단계) |
| 17:11 | 점수 계산 |
| 17:14 | 랭킹 서버 |
| 17:35 | 물리, 합체, 효과음 |
| 17:51 | 배포 |
만들기 시작해서 배포까지 40분이에요. 17시 11분에서 17시 51분.
그런데 시간표를 보면 그 40분 앞에 다섯 시간이 있어요. 설계하고, 그림 뽑고, 순서를 정한 시간이요. 40분 만에 만든 게 아니라, 다섯 시간 동안 정해놓은 걸 40분 동안 옮긴 거예요.
참고로 이날 아침에 애드센스 세 번째 반려 메일을 받았어요. 오전엔 떨어지고 오후엔 게임을 만든 날이에요.
열한 단계
| 단계 | 캐릭터 |
|---|---|
| 1~5 | 제 AI 에이전트 캐릭터 다섯 |
| 6 | 루카 (저예요) |
| 7 | 황금 루카 |
| 8 | 불꽃 루카 |
| 9 | 우주 루카 |
| 10 | 천사 루카 |
| 11 | 전설 루카 |
1단계가 제일 작고 11단계가 제일 커요. 11단계 둘이 만나면 둘 다 사라지고 보너스 점수가 나와요.
7단계부터는 루카 그림 하나에 효과만 입혀서 만들 수도 있었어요. 저는 그러지 말자고 했어요. 단계마다 다른 그림이 있어야 보는 즐거움이 있다고요. 다음엔 뭐가 나올지 궁금해야 계속 합치게 되잖아요. 그래서 황금, 불꽃, 우주, 천사, 전설을 전부 따로 그렸어요.
삽질 1: 흰 티셔츠가 사라졌어요
캐릭터 그림은 흰 배경으로 나와요. 게임에 넣으려면 배경을 지워서 투명하게 만들어야 해요.
AI가 "흰색인 부분을 지운다"는 방식으로 배경을 지웠어요. 그랬더니 루카의 흰 티셔츠도 같이 지워졌어요. 몸통에 구멍이 난 거예요.
배경의 흰색이랑 티셔츠의 흰색이 완전히 같은 색이었거든요. 컴퓨터 눈에는 구별이 안 돼요.
해결은 이랬어요. "흰색이면 지운다"가 아니라 "바깥 테두리에서 시작해서 이어진 흰색만 지운다"로 바꿨어요. 배경은 테두리에 닿아 있고 티셔츠는 안 닿아 있으니까요. 그래도 티셔츠 아래쪽은 테두리에 닿아서, 그 부분은 아예 시작점에서 뺐어요.
천사 루카의 날개도 문제였어요. 날개가 거의 흰색이라 배경이랑 같이 날아갈 뻔했어요.
삽질 2: 귀가 잘렸어요
캐릭터를 동그라미 안에 넣어야 해요. 공처럼 굴러다녀야 하니까요.
동그랗게 잘랐더니 세 캐릭터의 귀가 잘렸어요. 귀가 큰 애들이었어요. 그림 열한 장을 만들고 10분 뒤에 세 장을 다시 잘랐어요.
삽질 3: 그림이 안 떠요
배포한 주소에서 그림과 게임 파일을 못 찾는 문제가 있었어요.
주소 때문이었어요. 게임 주소 끝에 /가 있느냐 없느냐에 따라, 컴퓨터가 그림을 찾으러 가는 위치가 달라져요. 제 게임은 끝에 / 없이 열렸고, 그러면 그림을 엉뚱한 폴더에서 찾아요.
그림 위치를 "여기서 옆 폴더"가 아니라 "맨 처음부터 이 길로"라고 전부 다시 적었어요.
삽질 4: 흐릿해요
그림은 떴는데 흐릿했어요. 요즘 폰은 화면이 촘촘해서, 그냥 그리면 그림을 늘려서 보여줘요. 폰 화면의 촘촘한 정도에 맞춰서 더 크게 그린 다음 줄여서 보여주게 바꿨어요.
용량도 줄였어요. 그림 열한 장이 3.8MB였는데 0.6MB로요. 폰에서 게임 하나 여는데 그림만 4MB면 기다리다 나가요.
점수를 속이지 못하게
랭킹을 만들면 꼭 생각해야 하는 게 있어요. 누가 점수를 속이면 어떡하지?
이 게임은 점수를 폰에서 계산해서 서버로 보내요. 그 말은, 아는 사람은 게임을 안 하고도 "저 99999점이에요"라고 보낼 수 있다는 거예요.
그래서 서버가 점수만 받지 않아요. 몇 단계 캐릭터를 몇 번 합쳤는지도 같이 받아요. 그리고 계산해요. "이만큼 합쳤으면 아무리 잘해도 최대 몇 점"이 나오는데, 보낸 점수가 그걸 넘으면 거절해요.
| 서버가 확인하는 것 | 걸리면 |
|---|---|
| 합친 횟수로 나올 수 있는 점수를 넘었나 | 거절 |
| 전체 합친 횟수와 단계별 횟수의 합이 맞나 | 거절 |
| 같은 곳에서 1초에 두 번 이상 보냈나 | 거절 |
| 이름이 열 글자를 넘나 | 거절 |
완벽한 방어는 아니에요. 작정하고 숫자를 맞춰서 보내면 뚫려요. 그래도 아무 숫자나 넣는 건 막아요.
게임 쪽 계산이랑 서버 쪽 계산이 다르면 멀쩡한 점수가 거절당하니까, 둘이 같은 답을 내는지 확인하는 시험도 만들었어요.
사람 있는 곳에 올릴 수 있다는 걸 몰랐어요
그날 오전 작업 기록에 이런 게 남아 있어요.
| 시각 | 한 일 |
|---|---|
| 11:27 | 예전에 만든 게임 두 개에, 게임 모음 사이트의 랭킹을 연결 |
| 11:42 | 되돌림 |
| 11:57 | 합체 게임 설계 시작 |
붙였다가 15분 만에 뗐어요. 그리고 새로 만드는 합체 게임은 그 사이트의 랭킹 구조만 참고하고, 랭킹은 제 걸로 따로 만들었어요.
그 사이트에는 게임 하러 오는 사람들이 이미 있었어요. 거기 올렸으면 누군가는 해봤을 거예요.
왜 안 올렸냐면요. 거기에 제 게임을 올릴 수 있다는 걸 몰랐어요. AI가 올리라고 한 적도 없고요. 알았으면 물어봤겠죠.
안 하기로 한 게 아니에요. 할 수 있는 줄 몰랐던 거예요. 모르는 건 물어볼 수도 없어요.
AI는 제가 물어본 건 잘 대답해 줘요. 근데 제가 뭘 모르는지는 제가 물어봐야 알려줘요. 그리고 저는 제가 뭘 모르는지 몰라요.
그래서 지금 랭킹은요
100위까지 저장하게 만들었어요. 100위 안에 들면 이름을 남길 수 있고, 못 들면 "100위까지 몇 점 남았어요"라고 알려줘요.
이 글을 쓰면서 랭킹을 열어봤어요.
| 준비한 자리 | 100 |
| 등록된 기록 | 4 |
| 이름 종류 | 1 |
| 1위 점수 | 7,093 |
| 최고 연속 합체 | 10번 |
그 이름 하나는 저예요. 저뿐인 것 같아요. ㅋㅋㅋㅋ
1위도 저, 2위도 저, 3위도 저, 4위도 저예요. 제가 만든 게임에서 제가 저랑 경쟁하고 있어요.
점수를 속이는 사람을 막으려고 서버에 검사를 네 개 달았는데, 막을 사람이 아직 안 왔어요. 100명이 몰릴 때를 대비해서 100위까지만 저장하게 만들었는데, 96자리가 비어 있어요.
근데 저는 너무 재밌던데요.
랭킹에 기록이 네 개 있다는 건 제가 적어도 네 판은 끝까지 했다는 뜻이에요. 1위 점수 7,093점도, 연속 합체 10번도 제 기록이에요. 만든 사람이 제일 열심히 하고 있어요.
재밌는 게임을 만든 건지, 제가 만들어서 재밌는 건지는 저 혼자서는 알 수가 없어요. 다른 사람이 해봐야 알아요. 그리고 다른 사람은 아직 안 왔어요.
이런 삽질을 모아놓은 전자책 『AI로 토스 미니앱 11개 만든 비개발자의 역습』은 크몽에 있어요.