๐ฎ so_long : ๋ฐ์ดํฐ์ ์๊ฐํ์ ์ํธ์์ฉ(Interaction)์ ์์
42์์ธ์ ๋ค์ด์ค๋ฉด, ๊ฐ์ฅ ํฅ์ด ๋๋, ์์์ด ๋๋ ๊ณผ์ ๊ฐ ๋ฌด์์ธ๊ฐ? ๋ผ๊ณ ํ๋ค๋ฉด ๋ฐ๋ก ์ด ๊ณผ์ ๊ฐ ๊ฝค๋ ์์๊ถ์ ๊ณผ์ ๊ฐ ์๋๊น ์ถ๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ถ์์ ์ธ ์ธ๊ณ์ ๋จธ๋ฌผ๋ ๋ ์ด์ ๊ณผ์ ๋ค๊ณผ ๋ฌ๋ฆฌ, so_long์ ์ฐ๋ฆฌ์ ์ฝ๋๊ฐ ๋ง๋ค์ด๋ธ ๊ฒฐ๊ณผ๋ฌผ์ ์ฒ์์ผ๋ก ์๊ฐ์ ์ด๊ณ ๋์ ์ธ โ์ธ๊ณโ๋ก ๊ตฌํํด๋ด๋ ๊ณผ์ ๋ค.
์ด ํ๋ก์ ํธ์ ๋ณธ์ง์ ๋จ์ํ 2D ๊ฒ์ ์ ์์ ๋์ด, ๋ฉ๋ชจ๋ฆฌ์์ ์ ์ ์ธ 2์ฐจ์ ๋ฐฐ์ด ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ์์ ์ํธ์์ฉํ๋ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค๋ก ๋ณํ๋๋์ง๋ฅผ ์ดํดํ๋ ๋ฐ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ง์ ๋์ผ๋ก ๋ณธ๋ค๋ ๋ฟ๋ฏํจ์, ๊ฒ์์ ๊ฐ๋ฐ์ ๋ก๋ง์ ๊ฐ์ง ๋จ์๋ค์ด๋ผ๋ฉด ์๋นํ ์ค๋ , ๊ทธ๋ฆฌ๊ณ ๋์์ 42์์ธ์ ์์ ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์จ๋ณธ๋ค๋ ์ ์์ ๊ฝค๋ ์ง์ฅ์ ๋ง๋ณด๋(โฆ) ๊ณผ์ ์ด์๋ค.
์ด๋ ์ํ(State), ์ ๋ ฅ(Input), ๊ทธ๋ฆฌ๊ณ ๋ ๋๋ง(Rendering) ์ด๋ผ๋ GUI ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ ๊ฐ์ง ํต์ฌ ์์๋ฅผ ์ฒ์์ผ๋ก ๋ค๋ฃจ๋ ๊ฒฝํ์ด๋ค. ์ญ๋งํ ํฐ๋ฏธ๋์ ๋ฒ์ด๋, ํ๋ก๊ทธ๋จ์ ๋ด๋ถ ์ํ๊ฐ ์คํฌ๋ฆฐ ์์ ํฝ์ ๋ก ์ค์๊ฐ ํฌ์๋๋ ๊ฒ์ ๋ณด๋ฉฐ, ์ฐ๋ฆฌ๋ ๋น๋ก์ โ๊ณ์ฐโ์ ๋์ด โ์ํธ์์ฉโ์ ์์ญ์ผ๋ก ์ฒซ๋ฐ์ ๋ด๋๋ ๊ณผ์ ๋ผ ํ ์ ์๊ฒ ๋ค.
๐จ MiniLibX: ๋ณต์ก์ฑ์ ๊ฐ์ถ๋ ์ถ์ํ ๊ณ์ธต
so_long์ ๊ธฐ์ ์ ์ค์ฌ์๋ MiniLibX๊ฐ ์๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด์์ฒด์ ๋ง๋ค ๋ค๋ฅธ ๋ณต์กํ ๊ทธ๋ํฝ ์์คํ
(Linux์ X11, macOS์ AppKit ๋ฑ)์ ๋จ์ํ API๋ก ๊ฐ์ธ๋์ 42๋ผ๋ ๋ถํธ์บ ํ๊ฐ ์์ฒด์ ์ผ๋ก ๊ฐ๊ณ ์๋, ์ถ์ํ ๊ณ์ธต(Abstraction Layer)์ด๋ค. ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ๋ก์ฐ๋ ๋ฒจ์ ์๋์ฐ ์์คํ
์ ์ง์ ๋ค๋ฃจ๋ ๋์ , ๊ฒ์ ๋ก์ง ์์ฒด์ ์ง์คํ ์ ์๋ค.
์ง๊ธ ์๊ฐํด๋ณด๋ฉด ๊ทธ๋ํฝ์ค์ ๊ด๋ จํ ๋ก์ฐํ ๊ฐ๋
, ์ฝ๋๋ฅผ ๋ง์ฝ ๋ง์ก๋ค๋ฉด ์๊ฐ์ ๊ณต๋ถ๋ก๋ ์ฝ์ง ์์๊ฒ ์ง๋ง, ๊ทธ๊ฑธ ๋ฐ์ด๋๊ฒ ๋ง๋ค์ด์คฌ๋ค๋ ์ ์์ ์์ฃผ ํ๋ฅญํ ์ ํ์ด์๋ค๊ณ ๋ณธ๋ค. (๋ฌผ๋ก ์ ์ง๋ณด์๊ฐ ์๋์ด, ์ง์ง ๋ฒ๊ทธ๊ฐ ๋๋ฌด ๋ง์๋ค)
ํต์ฌ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ(Event-Driven Architecture)๋ฅผ ์ดํดํ๋ ๊ฒ.
mlx_loop: ์ด ํจ์๋ ํ๋ก๊ทธ๋จ์ ์ ์ด๊ถ์ ๊ฐ์ ธ๊ฐ ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ค. ์ด๋ ๋ช ๋ น์ ์์ฐจ์ ์ผ๋ก ์คํํ๊ณ ์ข ๋ฃ๋๋ ๊ธฐ์กด์ ํ๋ก๊ทธ๋จ๊ณผ ๋ค๋ฅด๋ค. ํ๋ก๊ทธ๋จ์ ์ด์ ์ฌ์ฉ์์ ํค๋ณด๋ ์ ๋ ฅ, ๋ง์ฐ์ค ํด๋ฆญ, ์ฐฝ ๋ซ๊ธฐ ๋ฒํผ ๋ฑ ์ธ๋ถ์์ ๋ฐ์ํ๋ ๋น๋๊ธฐ์ ์ด๋ฒคํธ(Asynchronous Events)๋ฅผ ์์ ๋๊ธฐํ๋ โ๋ฐ์ํ ์์คํ โ์ด ๋์ด ๋ฐ์ ๋ฃจํ(busy loop)๋ฅผ ๋๊ฒ ๋๋ค.mlx_key_hook,mlx_hook: ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋ ํจ์(์ฝ๋ฐฑ ํจ์ ๋๋ ํธ๋ค๋ฌ)๋ฅผ ๋ฏธ๋ฆฌ ๋ฑ๋กํ๋ ํ์. ์ด๋ฅผ ํตํด โW ํค๊ฐ ๋๋ฆฌ๋ฉดmove_player_upํจ์๋ฅผ ์คํํ๋ผโ ์ ๊ฐ์ ์ด๋ฒคํธ์ ๋ก์ง์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. ์ด๋ฌํ ์ด๋ฒคํธ๋ค์ด ๋ค์ด์ฌ ๋, ๊ทธ ์ข ํฉ์ ์ธ ์ํ๋ค์ ๋ชจ์์, ๋งต๊ณผ ์บ๋ฆญํฐ, ์ด๋ฏธ์ง์ ์ํธ์์ฉ์ ๋ง๋๋ ๊ฒ, ๊ทธ๊ฒ์ด ์ด ๊ณผ์ ์ ํต์ฌ ๊ฐ๋ ์ด์๋ค.
๐บ๏ธ .ber ํ์ผ: ์ธ๊ณ์ ์ค๊ณ๋๋ฅผ ํด์ํ๋ค
.ber ํ
์คํธ ํ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก 42 ๊ณผ์ ์์ ์ ํ, ์ผ์ข
์ ์ฝ์์ด์๋ค. ๊ฒ์ ์๋์ ์ด๊ธฐ ์ํ๋ฅผ ์ ์ํ๋ โ์ค๊ณ๋โ์ด๋ค. ์ด ์ค๊ณ๋๋ฅผ ํด์ํ์ฌ ์ธ๊ฒ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค.
- ํ์ฑ (Parsing) ๋ฐ ์ญ์ง๋ ฌํ (Deserialization):
get_next_line์ ํ์ฉํด ํ ์คํธ ํ์ผ์ ์ฝ๊ณ , ์ด๋ฅผchar **์ ๊ฐ์ ์ธ-๋ฉ๋ชจ๋ฆฌ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํํ๋ค. ์ด๋ ํ์ผ์ ์ง๋ ฌํ๋์ด ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ก๊ทธ๋จ์ด ์ดํดํ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ด๋ค. - ๋งต ์ ํจ์ฑ ๊ฒ์ฌ (Validation): ํ์ฑ๋ ๋งต์ด ๊ฒ์์ ๊ทผ๋ณธ์ ์ธ ๋ถ๋ณ ๊ท์น(Invariants)์ ๋ง์กฑํ๋์ง ๊ฒ์ฆํ๋ค.
- ๊ตฌ์กฐ์ ๊ท์น: ์ง์ฌ๊ฐํ ํํ, ๋ฒฝ(
1)์ผ๋ก์ ์์ ํ ๋๋ฌ์ธ์. - ๊ตฌ์ฑ ์์ ๊ท์น: ํ๋ ์ด์ด(
P) 1๊ฐ, ์ถ๊ตฌ(E)์ ์์งํ(C) ๊ฐ๊ฐ 1๊ฐ ์ด์์ ์กด์ฌ. - ๊ฒฝ๋ก ์ ํจ์ฑ ๊ท์น (์ฌํ): ๋จ์ํ ๊ตฌ์ฑ ์์์ ๊ฐ์๋ฅผ ์ธ๋ ๊ฒ์ ๋์ด, ํ๋ ์ด์ด๊ฐ ๋ชจ๋ ์์งํ์ ๊ฑฐ์ณ ์ถ๊ตฌ์ ๋๋ฌํ ์ ์๋ ์ ํจํ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋์ง๋ฅผ ๊ฒ์ฆํด์ผ ํ๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก DFS(๊น์ด ์ฐ์ ํ์)๋ BFS(๋๋น ์ฐ์ ํ์) ๊ฐ์ ๊ทธ๋ํ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋งต ๋ฐ์ดํฐ ์์ฒด๋ฅผ ํ๋์ ๊ทธ๋ํ๋ก ๋ณด๊ณ , ์์์ ์์ ๋ชฉํ ์ง์ ๊น์ง์ ๋๋ฌ ๊ฐ๋ฅ์ฑ(Reachability)์ ํ๋ณํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋ค. ์ด ๊ฒ์ฆ์ด ๋๋ฝ๋๋ฉด ํ๋ ์ด์ด๊ฐ ์ ๋๋ก ํด๋ฆฌ์ดํ ์ ์๋ ๋งต์ ํ์ฉํ๊ฒ ๋๋ค.
- ๊ตฌ์กฐ์ ๊ท์น: ์ง์ฌ๊ฐํ ํํ, ๋ฒฝ(
๐โโ๏ธ ๊ฒ์ ๋ฃจํ: ์ ๋ ฅ, ์ํ ์ ๋ฐ์ดํธ, ๋ ๋๋ง์ ์ํ
๊ฒ์์ ์ค์ง์ ์ธ ๋์์ ๋ณด์ด์ง ์๋ ๊ฒ์ ๋ฃจํ(Game Loop) ์์์ ์ผ์ด๋๋ค. so_long์์๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ด ๋ฃจํ์ ํ ์ฌ์ดํด์ด ๋์ํ๋ค๊ณ ๋ณผ ์ ์๋ค.
- ์
๋ ฅ (Input):
mlx_key_hook์ด ํค ์ ๋ ฅ์ ๊ฐ์งํ๋ค. - ์ํ ์
๋ฐ์ดํธ (State Update): ์
๋ ฅ์ ๋ฐ๋ผ ๊ฒ์์ ํต์ฌ ๋ฐ์ดํฐ, ์ฆ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
- ํ๋ ์ด์ด์ ๋ค์ ์ขํ๋ฅผ ๊ณ์ฐํ๊ณ , ๋ฒฝ(
1)๊ณผ์ ์ถฉ๋์ ๊ฒ์ฌํ๋ค. - ์ด๋์ด ์ ํจํ๋ค๋ฉด, ํ๋ ์ด์ด์ ์ขํ(
game->player_x,game->player_y), ์์ง์ธ ํ์(game->steps), ๋จ์ ์์งํ ๊ฐ์(game->collectibles) ๋ฑ์ ์ํ ๋ณ์๋ฅผ ๊ฐฑ์ ํ๋ค. - ๊ฒ์์ ๋ชจ๋ ๊ท์น๊ณผ ๋ก์ง์ ์ค์ง ์ด โ์ํโ๋ฅผ ๋ณ๊ฒฝํ๋ ๋จ๊ณ์์๋ง ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค.
- ํ๋ ์ด์ด์ ๋ค์ ์ขํ๋ฅผ ๊ณ์ฐํ๊ณ , ๋ฒฝ(
- ๋ ๋๋ง (Rendering): ๋ณ๊ฒฝ๋ ์ต์ โ์ํโ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด ์ ์ฒด๋ฅผ ๋ค์ ๊ทธ๋ฆฐ๋ค. ๋ ๋๋ง ํจ์๋ ํ์ฌ ํ๋ ์ด์ด๊ฐ ์ด๋์ ์๋์ง, ์์งํ์ด ์ด๋์ ๋จ์๋์ง ๋ฑ์ ๊ฒ์ ๋ก์ง์ ์ ํ์๊ฐ ์๋ค. ์ค์ง ์ ๋ฌ๋ ์ํ ๋ฐ์ดํฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ํํํ ์ฑ
์๋ง ๊ฐ์ง๋ค.
- ์ ๋๋ฉ์ด์
(์ฌํ): ๋จ์ํ ํค ์
๋ ฅ ๊ธฐ๋ฐ ๋ ๋๋ง์ ๋์ด,
mlx_loop_hook์ ์ฌ์ฉํ๋ฉด ์๋ฌด๋ฐ ์ ๋ ฅ์ด ์์ด๋ ๋งค ํ๋ ์๋ง๋ค ํน์ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค. ์ด๋ฅผ ํ์ฉํด ํ๋ ์ ์นด์ดํฐ๋ฅผ ๋๊ณ , ํน์ ํ๋ ์๋ง๋ค ํ๋ ์ด์ด๋ ์์งํ์ ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ก ๊ต์ฒดํด์ฃผ๋ฉด ๊ฐ๋จํ ์คํ๋ผ์ดํธ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ์ฌ ๊ฒ์์ ์๋๊ฐ์ ๋ถ์ด๋ฃ์ ์ ์๋ค.
- ์ ๋๋ฉ์ด์
(์ฌํ): ๋จ์ํ ํค ์
๋ ฅ ๊ธฐ๋ฐ ๋ ๋๋ง์ ๋์ด,
โจ ์ฑ์ฐฐ ๋ฐ ๋ฐฐ์ด ์
so_long์ C์ธ์ด๋ก ์ ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ธ ์ํธ์์ฉ์ ์ธ๊ณ๋ก ์ด๋์ด๋ด๋ ๊ฐ์ง ๊ฒฝํ์ด์, ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฃจํ๋ผ๋ ๊ฒ์ด ์ด๋ค ์์ผ๋ก ์ ๋๋ฉ์ด์
์ ๋ง๋ค์ด๋ด๋ ์ง๋ฅผ ๋ฐฐ์ธ ์ ์์๋ค. ํนํ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ด๋ค๋ ์ ์์, ๊ฐ์ฒด ์งํฅ์ ๊ตฌ์กฐ์ ์ผ๋ถ๋ฅผ ๋ง๋ณธ๋ค๋ ์ฐจ์์์ ์์ฃผ ํฅ๋ฏธ๋ก์ด ๊ณผ์ ์๋ค๊ณ ์๊ฐํ๋ค.
- ์ํ์ ๋ทฐ์ ๋ถ๋ฆฌ: ๊ฒ์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ โ์ํ(State)โ์, ๊ทธ ์ํ๋ฅผ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ โ๋ทฐ(View/Rendering)โ์ ์ญํ ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ ์ค์ํ์ง ์ฒด๊ฐํ๋ค. ์ด ์์น์ ์ดํ MVC, MVVM ๋ฑ ๋ชจ๋ ํ๋์ ์ธ UI ํ๋ ์์ํฌ์ ๊ทผ๊ฐ์ด ๋๋ ๊ฒ์ด์๊ณ , ๋ฐฐ์ธ ๋น์๋ ๋ชฐ๋์ง๋ง, ์ดํ ๋ง์ ์์ ๋ค ์์์ ๊ทธ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ, ๋ณธ์ง์ ์ธ ์๋ฏธ์ ํน์ง์ ๋๋ฆ ์ดํดํ๊ฒ ๋ ๊ฒฝํ์ด์๋ค.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ํจ๋ฌ๋ค์์ ์ดํด: ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ด ์์์ ์๋๋ก ํ๋ฅด๋ ๊ฒ์ด ์๋๋ผ, ์ธ๋ถ ์ด๋ฒคํธ์ ์ํด ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฐ๋๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋ํ ๊น์ ์ดํด๋ฅผ ์ป์๋ค. ๊ฒฐ๊ตญ ์ด๋ค ๋ฃจํ ์์์, ์ด๋ค ๊ฒ๋ค์ ์ด๋ค ์์์ ์ด๋ฒคํธ๋ก ๋ํ๋ด๊ณ , ํนํ ์ต์ข ์ ์ธ ๋ ๋๋ง์ ๋งจ ๋ง์ง๋ง์์ ์ด๋ฃจ์ด์ง๋ ๊ตฌ์กฐ๊ฐ ๋๋ค๋ ์๋ฏธ๋ ์๋นํ ๋ณต์กํ๊ณ , ๋ ๋๋ฒ๊น ๊ณผ์ ์์ ๊ฒฝํํ ์ฝ์ง ์์ ์ผ์ด์๋ค๊ณ ์๊ฐ์ด ๋ ๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ์ ์์ฉ: DFS/BFS ๊ฐ์ ์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ์ด ๋จ์ง ์ด๋ก ์ ๋จธ๋ฌด๋ ๊ฒ์ด ์๋๋ผ, โํ๋ ์ด ๊ฐ๋ฅํ ๋งตโ์ ๊ฒ์ฆํ๋ ๋ฑ ์ค์ ๊ฒ์ ๊ฐ๋ฐ์์ ์ด๋ป๊ฒ ์ค์ฉ์ ์ผ๋ก ์ฌ์ฉ๋๋์ง ์ง์ ํ์ธํ ์ ์์๋ค.
๋ด ์ฝ๋๊ฐ ๋ง๋ค์ด๋ธ ์์ ์บ๋ฆญํฐ๊ฐ ๋งต์ ๋์๋ค๋๊ณ , ์์ดํ
์ ์์งํ๋ฉฐ, ๋ง์นจ๋ด ์ถ๊ตฌ์ ๋๋ฌํ๋ ์ผ๋ จ์ ๊ณผ์ ์ ์ง์ผ๋ณด๋ ๊ฒ์ ๋จ์ํ ๊ฒฐ๊ณผ ํ์ธ์ ๋์ด์ ์ฐฝ์์ ๊ธฐ์จ์ด์๋ค. so_long์ ๋์๊ฒ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์๋ช
๋ ฅ์ ์ป์ด ์ฌ์ฉ์์ ์ํตํ๋ โ์ธ๊ณโ๊ฐ ๋ ์ ์๋์ง๋ฅผ ๊ฐ๋ฅด์ณ์ค ํ๋ก์ ํธ๋ก ๊ธฐ์ต๋๋ฉฐ ์ง๊ธ๊น์ง ๊ฝค๋ ๊ธฐ๋ถ ์ข์ ๊ฒฝํ์ด์๋ค๊ณ ์๊ฐ์ด ๋ ๋ค.
