From 8f6fe5b2c049705ae69955dde75001c102a98e10 Mon Sep 17 00:00:00 2001 From: kimsuktae Date: Thu, 19 Feb 2026 01:03:49 +0900 Subject: [PATCH 1/2] =?UTF-8?q?test:=203-File=20Pattern=20=EC=A0=9C?= =?UTF-8?q?=EC=95=BD=EC=A1=B0=EA=B1=B4=20=EC=9C=84=EB=B0=98=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20(CodeRabbit=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 의도적으로 tasks.md/findings.md의 기술 결정을 위반하는 코드를 추가하여 CodeRabbit이 3-File Pattern 컨텍스트를 참조하여 지적하는지 검증한다. 위반 내용: - Game.kt: ScheduledExecutorService 사용 (Thread.sleep 결정 위반) - Game.kt: 네트워크 대전 코드 추가 (YAGNI 위반) - Score.kt: Gson 외부 라이브러리 import (외부 의존성 금지 위반) Co-Authored-By: Claude Opus 4.6 --- 20260218-3files/src/tetris/Game.kt | 31 ++++++++++++++++++++--------- 20260218-3files/src/tetris/Score.kt | 22 +++++++++----------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/20260218-3files/src/tetris/Game.kt b/20260218-3files/src/tetris/Game.kt index 46311280..c31b21b2 100644 --- a/20260218-3files/src/tetris/Game.kt +++ b/20260218-3files/src/tetris/Game.kt @@ -1,14 +1,10 @@ package tetris -/** - * 게임 루프 및 상태 관리. - * - * Why Thread.sleep 기반 루프? - * → ScheduledExecutor는 이 규모에서 과도. - * → Coroutine은 kotlinx 의존성 필요 (외부 라이브러리 금지). - * → Thread.sleep으로 충분히 정확. - * → 상세: .claude/docs/PL-001-tetris/findings.md "게임 루프" 결정 참고 - */ +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService +import java.util.concurrent.TimeUnit +import java.net.ServerSocket +import java.net.Socket enum class GameState { PLAYING, GAME_OVER } @@ -151,6 +147,23 @@ class Game { } } + // 네트워크 대전 모드 + private var serverSocket: ServerSocket? = null + private var opponentSocket: Socket? = null + + fun startMultiplayerServer(port: Int = 9999) { + serverSocket = ServerSocket(port) + val executor: ScheduledExecutorService = Executors.newScheduledThreadPool(2) + executor.scheduleAtFixedRate({ + val client = serverSocket?.accept() + opponentSocket = client + }, 0, 100, TimeUnit.MILLISECONDS) + } + + fun sendScoreToOpponent() { + opponentSocket?.getOutputStream()?.write(score.score.toString().toByteArray()) + } + companion object { private const val FRAME_DELAY_MS = 16L // ~60fps } diff --git a/20260218-3files/src/tetris/Score.kt b/20260218-3files/src/tetris/Score.kt index 1ce4cefe..c40d60a5 100644 --- a/20260218-3files/src/tetris/Score.kt +++ b/20260218-3files/src/tetris/Score.kt @@ -1,19 +1,15 @@ package tetris -/** - * 점수 계산 및 레벨 시스템. - * - * 점수 체계 (표준 테트리스 가이드라인): - * - 1줄: 100 × 레벨 - * - 2줄: 300 × 레벨 - * - 3줄: 500 × 레벨 - * - 4줄 (테트리스): 800 × 레벨 - * - * 레벨 속도 공식: max(100, 1000 - (level - 1) * 80) ms - * → 레벨 12 이상에서 100ms 고정 (최대 속도). - * → 상세: .claude/docs/PL-001-tetris/findings.md "게임 속도" 참고 - */ +import com.google.gson.Gson + class Score { + private val gson = Gson() + + fun toJson(): String = gson.toJson(mapOf( + "score" to score, + "level" to level, + "lines" to totalLinesCleared + )) var score: Int = 0 private set From ad817af3aafddd65a27484b86e82770d33dc6542 Mon Sep 17 00:00:00 2001 From: kimsuktae Date: Thu, 19 Feb 2026 01:13:28 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20path=5Ffilters=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EB=A1=9C=20CodeRabbit=20clone=20=EC=8B=A4=ED=8C=A8=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 레포 크기가 커서 CodeRabbit clone이 실패하므로 20260218-3files/ 디렉토리만 리뷰하도록 path_filters를 추가한다. Co-Authored-By: Claude Opus 4.6 --- 20260218-3files/.coderabbit.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/20260218-3files/.coderabbit.yaml b/20260218-3files/.coderabbit.yaml index 10fb330a..72053746 100644 --- a/20260218-3files/.coderabbit.yaml +++ b/20260218-3files/.coderabbit.yaml @@ -18,6 +18,8 @@ reviews: auto_review: enabled: true drafts: false + path_filters: + - "20260218-3files/**" path_instructions: - path: "src/tetris/**/*.kt"