<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>밸런싱 on To the Moon</title><link>https://junstellar.github.io/tags/%EB%B0%B8%EB%9F%B0%EC%8B%B1/</link><description>Recent content in 밸런싱 on To the Moon</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Sun, 06 Sep 2026 09:00:00 +0900</lastBuildDate><atom:link href="https://junstellar.github.io/tags/%EB%B0%B8%EB%9F%B0%EC%8B%B1/index.xml" rel="self" type="application/rss+xml"/><item><title>AI로 게임 만들기 #11 — 60초 스네이크를 만들었습니다 (공개빌드 #11)</title><link>https://junstellar.github.io/p/ai-game-lab-build-11/</link><pubDate>Sun, 06 Sep 2026 09:00:00 +0900</pubDate><guid>https://junstellar.github.io/p/ai-game-lab-build-11/</guid><description>&lt;img src="https://junstellar.github.io/p/ai-game-lab-build-11/snake-play.webp" alt="Featured image of post AI로 게임 만들기 #11 — 60초 스네이크를 만들었습니다 (공개빌드 #11)" /&gt;&lt;p&gt;AI 게임 랩 열 번째 게임으로 스네이크를 만들었습니다. 점수 나는 방식 하나만 바꿨는데 게임이 꽤 달라졌습니다.&lt;/p&gt;
&lt;p&gt;시간은 60초로 고정입니다. 그 안에 최대한 높은 점수를 내면 됩니다. 부딪혀도 판이 끝나지 않아요. 몸이 처음 길이인 세 칸으로 돌아가고 1.2초 멈췄다가 이어집니다. 그동안에도 시계는 흘러가니 결국 누구나 60초를 씁니다. 랭킹으로 겨루려면 쓴 시간이 같아야 해서 이렇게 잡았습니다.&lt;/p&gt;
&lt;p&gt;조작은 방향키나 WASD, 휴대폰에서는 화면을 쓸면 됩니다. 격자는 16×16이고 뱀은 초당 여덟 칸씩 움직입니다.&lt;/p&gt;
&lt;p&gt;👉 &lt;strong&gt;&lt;a class="link" href="https://junstellar.github.io/games/snake60/" &gt;60초 스네이크 하러 가기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="점수-규칙"&gt;점수 규칙
&lt;/h2&gt;&lt;p&gt;보통 스네이크는 먹이를 먹으면 점수가 오릅니다. 여기서도 먹이가 30점이긴 한데, 그보다 중요한 건 머리가 지나가는 칸의 좌우가 얼마나 막혔는지입니다.&lt;/p&gt;
&lt;p&gt;옆이 트여 있으면 0점입니다. 한쪽에 제 몸이 있으면 1점. 양옆이 다 막힌 한 칸 틈을 지나가면 15점이 들어오고, 여기에 HEAT라는 배수가 최대 세 배까지 붙습니다. HEAT는 좁은 틈을 연달아 통과할 때만 올라가고, 넓은 데로 나오면 금방 식습니다.&lt;/p&gt;
&lt;p&gt;&lt;img alt="옆이 어떻게 막혔는지에 따라 점수가 갈린다. 벽만 있으면 0점이다" class="gallery-image" data-flex-basis="513px" data-flex-grow="213" height="860" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://junstellar.github.io/p/ai-game-lab-build-11/snake-rule.webp" srcset="https://junstellar.github.io/p/ai-game-lab-build-11/snake-rule_hu_f5036dfb72dc9fd5.webp 800w, https://junstellar.github.io/p/ai-game-lab-build-11/snake-rule_hu_a4451cc669ffafec.webp 1600w, https://junstellar.github.io/p/ai-game-lab-build-11/snake-rule.webp 1840w" width="1840"&gt;&lt;/p&gt;
&lt;p&gt;바깥 벽은 세지 않습니다. 벽에만 붙어서 달려서는 아무 점수도 안 나와요. 왜 그렇게 했는지는 아래에 적었습니다.&lt;/p&gt;
&lt;p&gt;좁은 틈은 몸이 길어야 생깁니다. 그래서 먹이도 결국 필요해요. 먹이 하나에 몸이 네 칸 자라고, 좁은 틈에 놓인 먹이를 먹으면 5배인 150점이 들어옵니다. 한 판에서 제일 크게 버는 순간이 여기입니다.&lt;/p&gt;
&lt;p&gt;&lt;img alt="똬리 튼 몸 사이 한 칸 틈을 빠져나오는 중. HEAT가 2.8배까지 올라 42점이 붙었다" class="gallery-image" data-flex-basis="200px" data-flex-grow="83" height="1030" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://junstellar.github.io/p/ai-game-lab-build-11/snake-play.webp" srcset="https://junstellar.github.io/p/ai-game-lab-build-11/snake-play_hu_65d8e86d4fa342b8.webp 800w, https://junstellar.github.io/p/ai-game-lab-build-11/snake-play.webp 860w" width="860"&gt;&lt;/p&gt;
&lt;h2 id="왜-이렇게-만들었나"&gt;왜 이렇게 만들었나
&lt;/h2&gt;&lt;p&gt;스네이크를 그냥 만들면 두 가지가 걸렸습니다.&lt;/p&gt;
&lt;p&gt;하나는 스네이크가 순수 실력 게임이라는 점입니다. 잘하는 사람이 항상 이깁니다. 게임 랩 게임들은 하루 한 판씩 남들과 점수를 겨루는 형태라, 실력 순서가 그대로 고정되면 못하는 사람은 영영 못 이깁니다. 운이 좀 섞여야 뒤집힐 여지가 생깁니다.&lt;/p&gt;
&lt;p&gt;다른 하나는 60초라는 시간입니다. 1분 안에는 몸이 별로 안 길어집니다. 스네이크가 조여드는 느낌은 몸이 화면을 채우기 시작할 때 오는데, 거기까지 갈 시간이 없어요.&lt;/p&gt;
&lt;p&gt;그래서 점수를 지나간 자리의 위험도로 옮겼습니다. 안전하게만 돌면 점수가 안 나오게 만들어두면, 짧은 시간에도 위험을 감수할 이유가 생기니까요. (&lt;a class="link" href="https://junstellar.github.io/p/ai-game-lab-build-10/" &gt;지난 편&lt;/a&gt;에서는 주사위 게임을 두 번 만들었다 두 번 다 버렸는데, 이번 건 남았습니다.)&lt;/p&gt;
&lt;h2 id="봇을-풀어놨더니-테두리만-돌더군요"&gt;봇을 풀어놨더니 테두리만 돌더군요
&lt;/h2&gt;&lt;p&gt;밸런스를 감으로 잡고 싶지 않아서 자동 플레이어를 만들었습니다. 겁쟁이, 먹이만 쫓는 놈, 위험하게 노는 놈, 무모한 놈. 넷을 각각 80판씩 돌렸습니다.&lt;/p&gt;
&lt;p&gt;처음 버전에서는 바깥 벽도 막힌 면으로 셌습니다. 옆이 막혀 있으면 위험한 거라고 봤거든요.&lt;/p&gt;
&lt;p&gt;결과가 이상했습니다. 테두리를 따라 60초 내내 뱅뱅 도는 것만으로 2,800점이 나왔고, 그동안 한 번도 부딪히지 않았습니다. 안전하면 점수가 없게 만들겠다고 해놓고 가장 안전한 길을 최고점으로 만들어둔 셈이었습니다.&lt;/p&gt;
&lt;p&gt;이유는 간단했습니다. 벽은 움직이지 않습니다. 벽에 붙어 달리는 건 그림으로는 아슬아슬해 보여도 실제로는 아무 일도 일어나지 않아요. 저는 &amp;ldquo;옆이 막혀 있다&amp;quot;를 위험이라고 착각하고 있었습니다.&lt;/p&gt;
&lt;p&gt;그래서 막힌 면 중에 제 몸이 최소 하나는 있어야 점수를 주도록 고쳤습니다.&lt;/p&gt;
&lt;h2 id="이번엔-자기-몸-옆에-딱-붙어서"&gt;이번엔 자기 몸 옆에 딱 붙어서
&lt;/h2&gt;&lt;p&gt;고치고 다시 돌렸습니다. 순서는 맞게 나왔어요. 위험하게 노는 봇이 겁쟁이보다 훨씬 높았습니다. 그런데 그 옆 칸의 숫자를 보고 또 걸렸습니다. 평균 2,911점을 내면서 &lt;strong&gt;부딪힌 횟수가 0.0번&lt;/strong&gt;이었거든요. 480칸 중 393칸에서 점수를 뽑았는데도 말이죠.&lt;/p&gt;
&lt;p&gt;자기 몸 옆에 나란히 붙어 달리는 게 안정적인 자세였습니다. 몸이 제 뒤를 그대로 따라오니까 옆은 계속 막혀 있는데, 정작 부딪힐 일은 없습니다. 벽으로 하던 짓을 몸으로 하고 있었을 뿐이었어요.&lt;/p&gt;
&lt;p&gt;이번에는 규칙 대신 배점을 손봤습니다. 나란히 달리기는 1점 고정으로 낮추고 HEAT가 안 붙게 했습니다. HEAT는 양옆이 다 막힌 좁은 틈에서만 오릅니다.&lt;/p&gt;
&lt;p&gt;돌이켜보면 두 경우 다 같은 착각이었습니다. 벽도, 나란히 가는 제 몸도, 옆에 있기는 한데 저를 쫓아오지는 않습니다. 위험한 건 옆이 막혀 있는 상태가 아니라 제가 다음에 갈 자리를 누가 먼저 차지할 수 있느냐였습니다.&lt;/p&gt;
&lt;h2 id="없는-점수를-쫓던-봇"&gt;없는 점수를 쫓던 봇
&lt;/h2&gt;&lt;p&gt;중간에 이상한 일도 있었습니다. 봇 하나가 네 칸을 뱅뱅 돌면서 아무것도 안 했습니다. 로그를 한 수씩 찍어보니 매번 옆이 막혔다고 판단하는데 실제 점수는 0이었어요.&lt;/p&gt;
&lt;p&gt;게임 쪽 문제가 아니었습니다. 봇이 후보 칸의 위험도를 이동하기 전 상태로 재고 있었습니다. 뱀은 앞으로 가면 꼬리가 한 칸 빠져나가죠. 그러니까 지금은 막혀 있어도 머리가 도착할 때쯤에는 비어 있을 칸이었던 겁니다. 봇은 있지도 않은 점수를 보고 제자리를 돌고 있었습니다.&lt;/p&gt;
&lt;p&gt;로그를 안 찍었으면 멀쩡한 게임을 뜯어고쳤을 겁니다.&lt;/p&gt;
&lt;h2 id="봇이-사람보다-잔인한-테스터인-이유"&gt;봇이 사람보다 잔인한 테스터인 이유
&lt;/h2&gt;&lt;p&gt;이 두 가지를 봇으로 찾은 데는 이유가 있습니다. 봇에게는 부끄러움이 없습니다.&lt;/p&gt;
&lt;p&gt;사람은 테두리만 60초 도는 짓을 잘 안 합니다. 이길 수 있어도 안 해요. 이렇게 이기면 재미없잖아, 하는 감각이 있으니까요. 제가 직접 백 판을 했어도 못 찾았을 겁니다. 자기 게임은 자기가 의도한 방식으로 플레이하게 되거든요. 봇은 그런 게 없고 점수만 봅니다.&lt;/p&gt;
&lt;p&gt;나중에 찾아보니 게임 디자인에서는 오래된 이야기더군요. 게임 디자이너 소렌 존슨이 남긴 말인데, 기회만 주면 플레이어가 게임에서 재미를 최적화해 없애버린다는 겁니다. 플레이어가 최적화하는 건 재미가 아니라 승리니까요.&lt;/p&gt;
&lt;h2 id="숫자로-본-결과"&gt;숫자로 본 결과
&lt;/h2&gt;&lt;p&gt;전략별로 80판씩 돌린 최종 수치입니다.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;전략&lt;/th&gt;
					&lt;th&gt;평균&lt;/th&gt;
					&lt;th&gt;상위 10%&lt;/th&gt;
					&lt;th&gt;최고&lt;/th&gt;
					&lt;th&gt;부딪힘&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;트인 곳만 달림&lt;/td&gt;
					&lt;td&gt;1,155&lt;/td&gt;
					&lt;td&gt;1,465&lt;/td&gt;
					&lt;td&gt;2,248&lt;/td&gt;
					&lt;td&gt;1.1번&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;먹이만 쫓음&lt;/td&gt;
					&lt;td&gt;1,949&lt;/td&gt;
					&lt;td&gt;2,627&lt;/td&gt;
					&lt;td&gt;3,788&lt;/td&gt;
					&lt;td&gt;1.0번&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;몸 옆 나란히&lt;/td&gt;
					&lt;td&gt;1,682&lt;/td&gt;
					&lt;td&gt;2,138&lt;/td&gt;
					&lt;td&gt;2,635&lt;/td&gt;
					&lt;td&gt;0.0번&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;좁은 틈 사냥&lt;/td&gt;
					&lt;td&gt;1,935&lt;/td&gt;
					&lt;td&gt;2,390&lt;/td&gt;
					&lt;td&gt;6,671&lt;/td&gt;
					&lt;td&gt;2.9번&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;노린 데까지는 왔습니다. 몸 옆에 나란히 달리기가 그냥 잘 두는 것보다 낮아졌으니까요. 위험을 하나도 안 지는 전략이 최적해 자리에서 내려온 겁니다.&lt;/p&gt;
&lt;p&gt;다만 좁은 틈 사냥이 압도적으로 유리하지는 않습니다. 평균이나 상위 10%로 보면 먹이만 착실히 쫓는 쪽과 비슷해요. 다른 건 분포입니다. 6,671점 같은 판은 틈을 노린 쪽에서만 나오는데, 그 대신 열에 한 번쯤은 부딪힙니다.&lt;/p&gt;
&lt;p&gt;궁금해서 위험 감수 정도만 바꿔가며 한 번 더 재봤습니다. 앞을 안 보고 틈에 들이받는 쪽은 중앙값이 1,755점, 적당히 조심하는 쪽은 1,747점으로 거의 같았습니다. 최고 기록만 7,981점 대 2,872점으로 크게 갈렸고요. 죽는 게 이득은 아니라는 뜻입니다. 부딪히면 몸이 초기화되는데 이 게임에서 몸은 점수를 뽑는 도구라서, 1.2초 멈추는 것보다 몸을 다시 키우는 10여 초가 훨씬 비쌉니다. 크게 터지는 판이 죽을 자리에 들어간 쪽에서만 나올 뿐입니다.&lt;/p&gt;
&lt;h2 id="몇-점이면-잘한-걸까"&gt;몇 점이면 잘한 걸까
&lt;/h2&gt;&lt;p&gt;봇 기준으로는 트인 곳으로만 다니면 1,100점대, 먹이를 착실히 쫓으면 1,900점대가 나옵니다. 좁은 틈까지 노리면 운이 따를 때 6,000점을 넘고요.&lt;/p&gt;
&lt;p&gt;다만 봇은 매 수마다 남은 공간을 전부 계산해서 움직입니다. 사람은 그렇게 못 하니 실제로는 더 낮게 나올 겁니다. 저는 2,000점 넘기기가 쉽지 않았습니다.&lt;/p&gt;
&lt;p&gt;해보실 때 참고하실 만한 것 몇 가지입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;처음 10초쯤은 먹이를 먹어 몸을 키우는 게 낫습니다. 몸이 짧으면 좁은 틈 자체가 생기지 않습니다.&lt;/li&gt;
&lt;li&gt;HEAT는 좁은 틈을 연달아 지나야 오릅니다. 한 번 통과하고 넓은 데로 나오면 금방 식어요.&lt;/li&gt;
&lt;li&gt;후반에 부딪히면 회복할 시간이 없습니다. 몸이 길어졌을 때가 제일 벌기 좋으면서 제일 위험합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="그림-없이-만들기"&gt;그림 없이 만들기
&lt;/h2&gt;&lt;p&gt;이 게임에는 이미지 파일이 한 장도 없습니다. 뱀도 먹이도 파티클도, 소리까지 전부 코드로 만들었고 파일 하나에 44KB입니다.&lt;/p&gt;
&lt;p&gt;지난 편에서 &amp;ldquo;그래픽을 줄이자&amp;quot;를 &amp;ldquo;화면이 안 움직여도 된다&amp;quot;로 잘못 읽고 게임을 두 개 버렸던 터라 이번엔 신경을 썼습니다. 도형과 선만으로도 움직일 건 다 움직이더군요.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a class="link" href="https://junstellar.github.io/games/snake60/" &gt;60초 스네이크&lt;/a&gt; 한 판 해보시고 몇 점 나왔는지 알려주세요. 혹시 제가 아직 못 막은 지름길을 찾으시면 그것도 알려주시고요. 바로 막겠습니다. 🐍&lt;/p&gt;
&lt;p&gt;다음 편은 새 게임을 들고 오겠습니다.&lt;/p&gt;</description></item></channel></rss>