1. ์†Œ๊ฐœ

๊ฒŒ์ž„ ์—”์ง„์„ ํ™”๋ฉด์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฑฐ์˜ ์“ธ๋ชจ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณธ๊ฒฉ์ ์ธ ๊ฒŒ์ž„์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ๋” ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์€ ์‚ฌ์šฉ์ž ํ–‰๋™์„ ์ถ”์ ํ•˜๊ณ  ์ด์— ์‘๋‹ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด CodeGym ๊ฒŒ์ž„ ์—”์ง„์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์ด๋‚˜ ํ‚ค๋ณด๋“œ ํ‚ค๋ฅผ ํด๋ฆญํ•  ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ํŠน์ˆ˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์—…์˜ ์š”์ ์€ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฉด CodeGym ๊ฒŒ์ž„ ์—”์ง„์ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋‹ด๋‹นํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์†Œ๋ฆฌ๋ณด๋‹ค ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.


2. ๋งˆ์šฐ์Šค๋กœ ์ž‘์—…ํ•˜๊ธฐ

๊ฒŒ์ž„ ์—”์ง„์—๋Š” ๋งˆ์šฐ์Šค๋กœ ์ž‘์—…ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)

ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ์ž์‹ ์˜ ํด๋ž˜์Šค์—์„œ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค Game. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ์— ์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์—”์ง„์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

onMouseLeftClick(int x, int y)๋งˆ์šฐ์Šค ์™ผ์ชฝ ๋ฒ„ํŠผ์„ ํด๋ฆญ ํ•˜๋ฉด ์—”์ง„์— ์˜ํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค . ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํด๋ฆญ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ๊ธฐ์žฅ ์…€์˜ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ์™ผ์ชฝ ์ƒ๋‹จ ์…€์˜ ์ขŒํ‘œ๋Š” ์ž…๋‹ˆ๋‹ค (0,0). @Override์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์•ž์— ์ฃผ์„์„ ๋ฐฐ์น˜ํ•˜์—ฌ ์žฌ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .

onMouseRightClick(int x, int y)๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค . ๋ฐฉ๋ฒ• ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค onMouseLeftClick(int x, int y).

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
   @Override
   public void initialize() {
      // Set the size of the playing field to 3x3
      setScreenSize(3, 3);

      // Paint the playing field white
      for (int x = 0; x < 3; x++) {
         for (int y = 0; y < 3; y++) {
            setCellColor(x, y, Color.WHITE);
         }
      }
   }

   @Override
   public void onMouseLeftClick(int x, int y) {
      // Put a "X" in the cell that was clicked with the left mouse button
      setCellValue(x, y, "X");
   }

   @Override
   public void onMouseRightClick(int x, int y) {
      // Clear the cell that was clicked with the right mouse button
      setCellValue(x, y, "");
   }
}

์œ„์˜ ์˜ˆ์—์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค: onMouseLeftClick()๋ฐ onMouseRightClick(). ์ฒซ ๋ฒˆ์งธ ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝ๊ธฐ์žฅ์˜ ์…€์—์„œ ๋งˆ์šฐ์Šค ์™ผ์ชฝ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฉ”์„œ๋“œ๋Š” ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜๋กœ CodeGym ๊ฒŒ์ž„ ์—”์ง„์€ (x, y)๋งˆ์šฐ์Šค๋ฅผ ํด๋ฆญํ•œ ๊ฒฝ๊ธฐ์žฅ ์…€์˜ ์ขŒํ‘œ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.



3. ํ‚ค๋ณด๋“œ๋กœ ์ž‘์—…ํ•˜๊ธฐ

๊ฒŒ์ž„ ์—”์ง„์—๋Š” ํ‚ค๋ณด๋“œ ์ž‘์—…์„ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

void onKeyPress(Key key);
void onKeyReleased(Key key);

์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ฅผ ๋ˆ„๋ฅผ ๋•Œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค์—์„œ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค Game.

์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋†“์„ ๋•Œ ๊ฒŒ์ž„ ์—”์ง„์ด ์ด๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

onKeyPress(Key key)์•„๋ฌด ํ‚ค๋‚˜ ๋ˆ„๋ฅผ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค . ๋ˆ„๋ฅธ ํ‚ค(๋˜๋Š” )์˜ ๊ฐ’์ด ๋ฉ”์„œ๋“œ์— ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค . ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์•ž์— ์ฃผ์„์„ ๋ฐฐ์น˜ํ•˜์—ฌ ์žฌ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .Key.UNKNOWNkey@Override

onKeyReleased(Key key)ํ‚ค๋ฅผ ๋†“์œผ๋ฉด ํ˜ธ์ถœ ๋ฉ๋‹ˆ๋‹ค . ํ•ด๋‹น ํ‚ค(๋˜๋Š” )์˜ ๊ฐ’์ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค . ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์•ž์— ์ฃผ์„์„ ๋ฐฐ์น˜ํ•˜์—ฌ ์žฌ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .Key.UNKNOWNkey@Override

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
   @Override
   public void initialize() {
      // Set the size of the playing field to 3x3
      setScreenSize(3, 3);

      // Paint the playing field white
      for (int x = 0; x < 3; x++) {
         for (int y = 0; y < 3; y++) {
            setCellColor(x, y, Color.WHITE);
         }
      }
   }

   @Override
   public void onKeyPress(Key key) {
      // When the spacebar is pressed, the center cell turns yellow
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.YELLOW);
      }
   }

   @Override
   public void onKeyReleased(Key key) {
      // When the spacebar is released, the center cell returns to white
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.WHITE);
      }
   }
}


4. ์ง€์›๋˜๋Š” ๋ชจ๋“  ํ‚ค ๋ชฉ๋ก

CodeGym ์—”์ง„์€ onKeyPress()๋ฐ onKeyReleased()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ˆŒ๋ฆฐ(ํ•ด์ œ๋œ) ํ‚ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด CodeGym ์—”์ง„์—๋Š” Key.

์—”์ง„์˜ ํ˜„์žฌ ๋ฒ„์ „์—์„œ Key์œ ํ˜•์€ ์ œํ•œ๋œ 9๊ฐœ ๊ฐ’ ์„ธํŠธ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ’ ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๋ฅธ ๊ฒƒ
Key.ENTER
์‚ฌ์šฉ์ž๊ฐ€ Enter ํ‚ค๋ฅผ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.
Key.ESCAPE
์‚ฌ์šฉ์ž๊ฐ€ Esc ํ‚ค๋ฅผ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.
Key.PAUSE
์‚ฌ์šฉ์ž๊ฐ€ ์ผ์‹œ ์ค‘์ง€ ํ‚ค๋ฅผ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.
Key.SPACE
์‚ฌ์šฉ์ž๊ฐ€ ์ŠคํŽ˜์ด์Šค ํ‚ค๋ฅผ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.
Key.LEFT
์‚ฌ์šฉ์ž๊ฐ€ ์™ผ์ชฝ ํ™”์‚ดํ‘œ ํ‚ค๋ฅผ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.
Key.RIGHT
์‚ฌ์šฉ์ž๊ฐ€ ์˜ค๋ฅธ์ชฝ ํ™”์‚ดํ‘œ ํ‚ค๋ฅผ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.
Key.UP
์‚ฌ์šฉ์ž๊ฐ€ ์œ„์ชฝ ํ™”์‚ดํ‘œ ํ‚ค๋ฅผ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.
Key.DOWN
์‚ฌ์šฉ์ž๊ฐ€ ์•„๋ž˜์ชฝ ํ™”์‚ดํ‘œ ํ‚ค๋ฅผ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.
Key.UNKNOWN
์œ„์— ๋‚˜์—ด๋œ ๊ฒƒ ์ด์™ธ์˜ ๋ชจ๋“  ํ‚ค

ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ŠคํŽ˜์ด์Šค๋ฐ”๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ฉ”์„œ๋“œ๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ onKeyPress()ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค . Key.SPACE์‚ฌ์šฉ์ž๊ฐ€ ์™ผ์ชฝ ํ™”์‚ดํ‘œ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค Key.LEFT. ์‚ฌ์šฉ์ž๊ฐ€ ์œ„ ๋ชฉ๋ก์— ์—†๋Š” ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ฉ”์„œ๋“œ๊ฐ€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ onKeyPress()ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค .Key.UNKNOWN

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ๊ธฐ์กด CodeGym ๊ฒŒ์ž„์ด ํœด๋Œ€ํฐ์—์„œ ์‹คํ–‰๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€ ํ‚ค๋ณด๋“œ ๋Œ€์‹  8๊ฐœ์˜ ๊ฐ€์ƒ ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


5. ํƒ€์ด๋จธ๋กœ ์ž‘์—…ํ•˜๊ธฐ

๋งŽ์€ ๊ฒŒ์ž„์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•„๋„ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๊ฒŒ์ž„์—์„œ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒŒ์ž„์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒŒ์ž„ ์—”์ง„์— ํƒ€์ด๋จธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํƒ€์ด๋จธ๋ฅผ ์ผœ๊ณ  ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 500ms์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ 0.5์ดˆ๋งˆ๋‹ค CodeGym ๊ฒŒ์ž„ ์—”์ง„์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค onTurn(). ๋ฌดํ•œํ•œ ํšŸ์ˆ˜ โ€” ํƒ€์ด๋จธ๊ฐ€ ๊บผ์งˆ ๋•Œ๊นŒ์ง€.

ํƒ€์ด๋จธ๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?

1. ํƒ€์ด๋จธ ์ผœ๊ธฐ

ํƒ€์ด๋จธ๋ฅผ ์ผœ๋Š” void setTurnTimer(int timeMs)๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ฝœ๋ฐฑ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ ๊ธฐ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ ๋˜๋Š” 1/1000์ดˆ)์„ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•˜๋ฉด ๊ฒŒ์ž„ ์—”์ง„์ด ๋ฐ€๋ฆฌ์ดˆ onTurn()๋งˆ๋‹ค ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค timeMs.

2. onTurn(int)๋ฉ”์„œ๋“œ ์žฌ์ •์˜

์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ํด๋ž˜์Šค void onTurn(int step)๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค Game. ๊ฒŒ์ž„ ์—”์ง„์€ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์—”์ง„์€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์‹๋ณ„ํ•˜๋Š” ์ผ๋ จ ๋ฒˆํ˜ธ( 1, 2, 3, ...)๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

3. ํƒ€์ด๋จธ๋ฅผ ๋•๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์ž„์„ ๋๋ƒˆ๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ด๋จธ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ํƒ€์ด๋จธ๋ฅผ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด stopTurnTimer()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

4 ํƒ€์ด๋จธ ๊ฐ€์†/๋ณ€๊ฒฝ

์ผ๋ถ€ ๊ฒŒ์ž„์—์„œ๋Š” ์ด๋ฒคํŠธ ๋นˆ๋„๊ฐ€ ์ •๊ธฐ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ํƒ€์ด๋จธ ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ, ์ฆ‰ ์ฝœ๋ฐฑ ์‚ฌ์ด์˜ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ณด๋‹ค ๋” ์‰ฌ์šธ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. setTurnTimer(int timeMs)์ƒˆ ๊ฐ’์œผ๋กœ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ์— ๋Œ€ํ•œ ํ˜ธ์ถœ ์‚ฌ์ด์˜ ์‹œ๊ฐ„์ด onTurn()๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
   ...
   @Override
   public void initialize() {
      // Create a 3x3 playing field
      setScreenSize(3, 3);
      showGrid(false);
      setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

      setTurnTimer(500); // Turn on the timer. The interval between callbacks is 500ms.
   }

   @Override
   public void onTurn(int step) {
      if (step == 100) {
         stopTurnTimer(); // If this is the 100th callback, then turn off the timer
      }

      if (step % 2 == 1) {
         // If this is an odd calllback, then set the cell background to red
         setCellColor(1, 1, Color.RED);
      } else {
         // If this is an even callback, then set the cell background to blue
         setCellColor(1, 1, Color.BLUE);
      }
   }
   ...
}

์ด ๊ฐ„๋‹จํ•œ ์˜ˆ์—์„œ๋Š” 3์…€ x 3์…€์ธ ํ•„๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. onTurn()๊ทธ๋Ÿฐ ๋‹ค์Œ 0.5์ดˆ๋งˆ๋‹ค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํƒ€์ด๋จธ๋ฅผ ์ผญ๋‹ˆ๋‹ค .

์—ฌ๊ธฐ์—์„œ ์ค‘์•™ ์…€์˜ ์ƒ‰์ƒ์€ 0.5์ดˆ๋งˆ๋‹ค ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์…€์˜ ํ…์ŠคํŠธ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 50์ดˆ(์ฝœ๋ฐฑ 100ํšŒ) ํ›„ ์ƒ‰์ƒ ๋ณ€๊ฒฝ์ด ์ค‘์ง€๋˜๊ณ  ํƒ€์ด๋จธ๊ฐ€ ๊บผ์ง‘๋‹ˆ๋‹ค.