From dadcf7cf2cff73f31f5e3e8ff8ae7696ef59a570 Mon Sep 17 00:00:00 2001 From: narim <0018823nmn@naver.com> Date: Mon, 10 Jun 2024 03:42:25 +0900 Subject: [PATCH 1/2] docs: add README.md --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 08a8c8a..f326bf3 100644 --- a/README.md +++ b/README.md @@ -1 +1,16 @@ -# android-omok-precourse \ No newline at end of file +# android-omok-precourse + +1. **게임 보드 초기화**: + - 15x15 크기의 게임 보드 + +2. **돌 놓기 기능**: + - 사용자가 클릭한 위치에 돌을 놓음 + - 흑돌과 백돌 + +3. **승리 조건 체크**: + - 가로, 세로, 대각선 방향으로 다섯 개 이상의 연속된 돌이 있는지 확인 + - 다섯 개 이상의 돌이 연속된 경우 해당 플레이어가 승리 + +4. **게임 재시작 기능**: + - 게임이 종료된 후 보드를 초기화하고 새로운 게임을 시작 + From 1c4b8bd33e52b0f6be908c886e44767f417f609b Mon Sep 17 00:00:00 2001 From: narim <0018823nmn@naver.com> Date: Mon, 10 Jun 2024 12:31:58 +0900 Subject: [PATCH 2/2] feat: add MainActivity --- app/src/main/AndroidManifest.xml | 10 ++- .../main/java/nextstep/omok/MainActivity.kt | 79 ++++++++++++++++++- 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 250f3db..404d5d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,4 +1,12 @@ - + + + + + + + + +mma diff --git a/app/src/main/java/nextstep/omok/MainActivity.kt b/app/src/main/java/nextstep/omok/MainActivity.kt index e6cc7b8..66a8c3f 100644 --- a/app/src/main/java/nextstep/omok/MainActivity.kt +++ b/app/src/main/java/nextstep/omok/MainActivity.kt @@ -6,8 +6,14 @@ import android.widget.TableLayout import android.widget.TableRow import androidx.appcompat.app.AppCompatActivity import androidx.core.view.children +import androidx.appcompat.app.AlertDialog class MainActivity : AppCompatActivity() { + + private val boardSize = 15 + private var currentPlayer = "black" + private val boardState = Array(boardSize) { Array(boardSize) { "" } } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -16,8 +22,75 @@ class MainActivity : AppCompatActivity() { board .children .filterIsInstance() - .flatMap { it.children } - .filterIsInstance() - .forEach { view -> view.setOnClickListener { view.setImageResource(R.drawable.black_stone) } } + .forEachIndexed { rowIndex, row -> + row.children.filterIsInstance().forEachIndexed { colIndex, imageView -> + imageView.setOnClickListener { + if (boardState[rowIndex][colIndex].isEmpty()) { + boardState[rowIndex][colIndex] = currentPlayer + imageView.setImageResource( + if (currentPlayer == "black") R.drawable.black_stone else R.drawable.white_stone + ) + if (checkWin(rowIndex, colIndex)) { + showGameOverDialog("$currentPlayer wins!") + } else { + currentPlayer = if (currentPlayer == "black") "white" else "black" + } + } + } + } + } + } + + private fun checkWin(row: Int, col: Int): Boolean { + val directions = listOf( + listOf(Pair(0, 1), Pair(0, -1)), // horizontal + listOf(Pair(1, 0), Pair(-1, 0)), // vertical + listOf(Pair(1, 1), Pair(-1, -1)), // diagonal down-right and up-left + listOf(Pair(1, -1), Pair(-1, 1)) // diagonal down-left and up-right + ) + + for (direction in directions) { + var count = 1 + for (dir in direction) { + var r = row + var c = col + while (true) { + r += dir.first + c += dir.second + if (r in 0 until boardSize && c in 0 until boardSize && boardState[r][c] == currentPlayer) { + count++ + if (count >= 5) return true + } else { + break + } + } + } + } + return false + } + + private fun showGameOverDialog(message: String) { + AlertDialog.Builder(this) + .setTitle("Game Over") + .setMessage(message) + .setPositiveButton("OK") { _, _ -> + resetBoard() + } + .show() + } + + private fun resetBoard() { + currentPlayer = "black" + for (i in 0 until boardSize) { + for (j in 0 until boardSize) { + boardState[i][j] = "" + } + } + val board = findViewById(R.id.board) + board.children.filterIsInstance().forEach { row -> + row.children.filterIsInstance().forEach { imageView -> + imageView.setImageResource(0) + } + } } }