๐ŸŽฎ 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 ๊ณผ์ œ์—์„œ ์ •ํ•œ, ์ผ์ข…์˜ ์•ฝ์†์ด์—ˆ๋‹ค. ๊ฒŒ์ž„ ์›”๋“œ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๋Š” โ€˜์„ค๊ณ„๋„โ€™์ด๋‹ค. ์ด ์„ค๊ณ„๋„๋ฅผ ํ•ด์„ํ•˜์—ฌ ์ธ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

  1. ํŒŒ์‹ฑ (Parsing) ๋ฐ ์—ญ์ง๋ ฌํ™” (Deserialization): get_next_line์„ ํ™œ์šฉํ•ด ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์ฝ๊ณ , ์ด๋ฅผ char ** ์™€ ๊ฐ™์€ ์ธ-๋ฉ”๋ชจ๋ฆฌ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ด๋Š” ํŒŒ์ผ์— ์ง๋ ฌํ™”๋˜์–ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋กœ๊ทธ๋žจ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์ด๋‹ค.
  2. ๋งต ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (Validation): ํŒŒ์‹ฑ๋œ ๋งต์ด ๊ฒŒ์ž„์˜ ๊ทผ๋ณธ์ ์ธ ๋ถˆ๋ณ€ ๊ทœ์น™(Invariants)์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.
    • ๊ตฌ์กฐ์  ๊ทœ์น™: ์ง์‚ฌ๊ฐํ˜• ํ˜•ํƒœ, ๋ฒฝ(1)์œผ๋กœ์˜ ์™„์ „ํ•œ ๋‘˜๋Ÿฌ์‹ธ์ž„.
    • ๊ตฌ์„ฑ ์š”์†Œ ๊ทœ์น™: ํ”Œ๋ ˆ์ด์–ด(P) 1๊ฐœ, ์ถœ๊ตฌ(E)์™€ ์ˆ˜์ง‘ํ’ˆ(C) ๊ฐ๊ฐ 1๊ฐœ ์ด์ƒ์˜ ์กด์žฌ.
    • ๊ฒฝ๋กœ ์œ ํšจ์„ฑ ๊ทœ์น™ (์‹ฌํ™”): ๋‹จ์ˆœํžˆ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ชจ๋“  ์ˆ˜์ง‘ํ’ˆ์„ ๊ฑฐ์ณ ์ถœ๊ตฌ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํšจํ•œ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)๋‚˜ BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ๊ฐ™์€ ๊ทธ๋ž˜ํ”„ ์ˆœํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งต ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„๋กœ ๋ณด๊ณ , ์‹œ์ž‘์ ์—์„œ ๋ชฉํ‘œ ์ง€์ ๊นŒ์ง€์˜ ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ(Reachability)์„ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค. ์ด ๊ฒ€์ฆ์ด ๋ˆ„๋ฝ๋˜๋ฉด ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ ˆ๋Œ€๋กœ ํด๋ฆฌ์–ดํ•  ์ˆ˜ ์—†๋Š” ๋งต์„ ํ—ˆ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿƒโ€โ™‚๏ธ ๊ฒŒ์ž„ ๋ฃจํ”„: ์ž…๋ ฅ, ์ƒํƒœ ์—…๋ฐ์ดํŠธ, ๋ Œ๋”๋ง์˜ ์ˆœํ™˜

๊ฒŒ์ž„์˜ ์‹ค์งˆ์ ์ธ ๋™์ž‘์€ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒŒ์ž„ ๋ฃจํ”„(Game Loop) ์•ˆ์—์„œ ์ผ์–ด๋‚œ๋‹ค. so_long์—์„œ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ด ๋ฃจํ”„์˜ ํ•œ ์‚ฌ์ดํด์ด ๋™์ž‘ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  1. ์ž…๋ ฅ (Input): mlx_key_hook์ด ํ‚ค ์ž…๋ ฅ์„ ๊ฐ์ง€ํ•œ๋‹ค.
  2. ์ƒํƒœ ์—…๋ฐ์ดํŠธ (State Update): ์ž…๋ ฅ์— ๋”ฐ๋ผ ๊ฒŒ์ž„์˜ ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ, ์ฆ‰ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.
    • ํ”Œ๋ ˆ์ด์–ด์˜ ๋‹ค์Œ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๋ฒฝ(1)๊ณผ์˜ ์ถฉ๋Œ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.
    • ์ด๋™์ด ์œ ํšจํ•˜๋‹ค๋ฉด, ํ”Œ๋ ˆ์ด์–ด์˜ ์ขŒํ‘œ(game->player_x, game->player_y), ์›€์ง์ธ ํšŸ์ˆ˜(game->steps), ๋‚จ์€ ์ˆ˜์ง‘ํ’ˆ ๊ฐœ์ˆ˜(game->collectibles) ๋“ฑ์˜ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
    • ๊ฒŒ์ž„์˜ ๋ชจ๋“  ๊ทœ์น™๊ณผ ๋กœ์ง์€ ์˜ค์ง ์ด โ€˜์ƒํƒœโ€™๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋‹จ๊ณ„์—์„œ๋งŒ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.
  3. ๋ Œ๋”๋ง (Rendering): ๋ณ€๊ฒฝ๋œ ์ตœ์‹  โ€˜์ƒํƒœโ€™๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค. ๋ Œ๋”๋ง ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€, ์ˆ˜์ง‘ํ’ˆ์ด ์–ด๋””์— ๋‚จ์•˜๋Š”์ง€ ๋“ฑ์˜ ๊ฒŒ์ž„ ๋กœ์ง์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์˜ค์ง ์ „๋‹ฌ๋œ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ฑ…์ž„๋งŒ ๊ฐ€์ง„๋‹ค.
    • ์• ๋‹ˆ๋ฉ”์ด์…˜ (์‹ฌํ™”): ๋‹จ์ˆœํ•œ ํ‚ค ์ž…๋ ฅ ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง์„ ๋„˜์–ด, mlx_loop_hook์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ฌด๋Ÿฐ ์ž…๋ ฅ์ด ์—†์–ด๋„ ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•ด ํ”„๋ ˆ์ž„ ์นด์šดํ„ฐ๋ฅผ ๋‘๊ณ , ํŠน์ • ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํ”Œ๋ ˆ์ด์–ด๋‚˜ ์ˆ˜์ง‘ํ’ˆ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋กœ ๊ต์ฒดํ•ด์ฃผ๋ฉด ๊ฐ„๋‹จํ•œ ์Šคํ”„๋ผ์ดํŠธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฒŒ์ž„์— ์ƒ๋™๊ฐ์„ ๋ถˆ์–ด๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

โœจ ์„ฑ์ฐฐ ๋ฐ ๋ฐฐ์šด ์ 

so_long์€ C์–ธ์–ด๋กœ ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์˜ ์„ธ๊ณ„๋กœ ์ด๋Œ์–ด๋‚ด๋Š” ๊ฐ’์ง„ ๊ฒฝํ—˜์ด์ž, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ฃจํ”„๋ผ๋Š” ๊ฒƒ์ด ์–ด๋–ค ์‹์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ง€๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŠนํžˆ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์“ด๋‹ค๋Š” ์ ์—์„œ, ๊ฐ์ฒด ์ง€ํ–ฅ์  ๊ตฌ์กฐ์˜ ์ผ๋ถ€๋ฅผ ๋ง›๋ณธ๋‹ค๋Š” ์ฐจ์›์—์„œ ์•„์ฃผ ํฅ๋ฏธ๋กœ์šด ๊ณผ์ œ์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

  • ์ƒํƒœ์™€ ๋ทฐ์˜ ๋ถ„๋ฆฌ: ๊ฒŒ์ž„์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” โ€˜์ƒํƒœ(State)โ€™์™€, ๊ทธ ์ƒํƒœ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” โ€˜๋ทฐ(View/Rendering)โ€™์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ์ง€ ์ฒด๊ฐํ–ˆ๋‹ค. ์ด ์›์น™์€ ์ดํ›„ MVC, MVVM ๋“ฑ ๋ชจ๋“  ํ˜„๋Œ€์ ์ธ UI ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ๊ฒƒ์ด์—ˆ๊ณ , ๋ฐฐ์šธ ๋‹น์‹œ๋Š” ๋ชฐ๋ž์ง€๋งŒ, ์ดํ›„ ๋งŽ์€ ์ž‘์—…๋“ค ์†์—์„œ ๊ทธ ์›๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ, ๋ณธ์งˆ์ ์ธ ์˜๋ฏธ์™€ ํŠน์ง•์„ ๋‚˜๋ฆ„ ์ดํ•ดํ•˜๊ฒŒ ๋œ ๊ฒฝํ—˜์ด์—ˆ๋‹ค.
  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์ดํ•ด: ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์ด ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์™ธ๋ถ€ ์ด๋ฒคํŠธ์— ์˜ํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ด‰๋ฐœ๋˜๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๋ฅผ ์–ป์—ˆ๋‹ค. ๊ฒฐ๊ตญ ์–ด๋–ค ๋ฃจํ”„ ์•ˆ์—์„œ, ์–ด๋–ค ๊ฒƒ๋“ค์„ ์–ด๋–ค ์ˆœ์„œ์˜ ์ด๋ฒคํŠธ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , ํŠนํžˆ ์ตœ์ข…์ ์ธ ๋ Œ๋”๋ง์€ ๋งจ ๋งˆ์ง€๋ง‰์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๊ณ , ๋˜ ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ๊ฒฝํ—˜ํ•œ ์‰ฝ์ง€ ์•Š์€ ์ผ์ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ์  ์‘์šฉ: DFS/BFS ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹จ์ง€ ์ด๋ก ์— ๋จธ๋ฌด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, โ€˜ํ”Œ๋ ˆ์ด ๊ฐ€๋Šฅํ•œ ๋งตโ€™์„ ๊ฒ€์ฆํ•˜๋Š” ๋“ฑ ์‹ค์ œ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ ์–ด๋–ป๊ฒŒ ์‹ค์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“ค์–ด๋‚ธ ์ž‘์€ ์บ๋ฆญํ„ฐ๊ฐ€ ๋งต์„ ๋Œ์•„๋‹ค๋‹ˆ๊ณ , ์•„์ดํ…œ์„ ์ˆ˜์ง‘ํ•˜๋ฉฐ, ๋งˆ์นจ๋‚ด ์ถœ๊ตฌ์— ๋„๋‹ฌํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ์ง€์ผœ๋ณด๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํ•œ ๊ฒฐ๊ณผ ํ™•์ธ์„ ๋„˜์–ด์„  ์ฐฝ์ž‘์˜ ๊ธฐ์จ์ด์—ˆ๋‹ค. so_long์€ ๋‚˜์—๊ฒŒ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๋ช…๋ ฅ์„ ์–ป์–ด ์‚ฌ์šฉ์ž์™€ ์†Œํ†ตํ•˜๋Š” โ€˜์„ธ๊ณ„โ€™๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฐ€๋ฅด์ณ์ค€ ํ”„๋กœ์ ํŠธ๋กœ ๊ธฐ์–ต๋˜๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ๊ฝค๋‚˜ ๊ธฐ๋ถ„ ์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค.