diff --git a/app/src/main/java/com/example/game/GameNull.kt b/app/src/main/java/com/example/game/GameNull.kt index 8fe895ff3de2bda27da6142119589cdff956049b..7fc332c3a09f947c4e5e99c920ed134105c81df6 100644 --- a/app/src/main/java/com/example/game/GameNull.kt +++ b/app/src/main/java/com/example/game/GameNull.kt @@ -57,6 +57,9 @@ class GameNull : AppCompatActivity() { button.setOnClickListener { view -> onButtonClicked(view) } } + disableAllButtons() + // TODO: загрузка сервера - фронтенд + GlobalScope.launch(Dispatchers.IO) { try { val serverAddress = "10.0.2.2" // IP-адрес сервера @@ -69,6 +72,9 @@ class GameNull : AppCompatActivity() { reader = BufferedReader(InputStreamReader(clientSocket.getInputStream())) writer = PrintWriter(clientSocket.getOutputStream()) + writer.println("0") // !!! + writer.flush() + // Получаем идентификатор игрока от сервера val playerId = reader.readLine().toInt() Log.d("Debug.", "Id ${playerId}") @@ -76,6 +82,7 @@ class GameNull : AppCompatActivity() { // Получаем загаданное число от сервера guessedNumber = reader.readLine().toInt() + Log.d("Debug", "Полученное загаднное число: ${guessedNumber}") // Обновляем UI в основном потоке launch(Dispatchers.Main) { @@ -83,10 +90,14 @@ class GameNull : AppCompatActivity() { tv = findViewById(R.id.currentPlayerTextView) tv.text = "Сейчас ход игрока номер ${currentPlayer}" - if (currentPlayer != player.id) { - disableAllButtons() + if (player.id != 0) { // if (currentPlayer != player.id + 1) { // Через сервер ждём ответ другого игрока waitForOtherPlayer() + } else { + for (button in buttons) { + button.setBackgroundColor(ContextCompat.getColor(this@GameNull, android.R.color.holo_red_light)) + button.isEnabled = true + } } } } else { @@ -99,7 +110,7 @@ class GameNull : AppCompatActivity() { } } - // Добавляем новую функцию для ожидания ответа от другого игрока через сервер + // функция для ожидания ответа от другого игрока через сервер private fun waitForOtherPlayer() { GlobalScope.launch(Dispatchers.IO) { try { @@ -127,7 +138,7 @@ class GameNull : AppCompatActivity() { val button = view as Button // Проверка, что игра не окончена и кнопка еще не выбрана - if (!gameOver && button.isEnabled && currentPlayer == player.id) { + if (!gameOver && button.isEnabled) { val number = button.text.toString().toInt() // посылаем серверу число diff --git a/server/src/main/java/com/example/server/Server.kt b/server/src/main/java/com/example/server/Server.kt index 9166a13d84310a4bdf7c7e1ff70d81a5fad0cc51..0030ed0204d2eac4df058d241bf4be048b170936 100644 --- a/server/src/main/java/com/example/server/Server.kt +++ b/server/src/main/java/com/example/server/Server.kt @@ -9,46 +9,59 @@ import java.net.Socket class Server { private val serverSocket: ServerSocket - private val players: MutableList - private var currentPlayer: Player? = null private var guessedNumber: Int = 0 + private var all_players: Array> = arrayOf( + mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf()) + private var id_count: Int = 0 init { - serverSocket = ServerSocket(1234) // Укажите нужный порт для прослушивания - players = mutableListOf() + serverSocket = ServerSocket(1234) } fun start() { println("Сервер запущен. Ожидание подключений...") val address = InetAddress.getLocalHost().hostAddress println("Server is running on $address:${serverSocket.localPort}") - while (players.size < 2) { + while (true) { val clientSocket = serverSocket.accept() + // TODO: пусть игрок ждёт val player = Player(clientSocket) - players.add(player) - Thread(player).start() - println("Игрок ${player.id} подключился") + all_players[player.gm.id].add(player) + if (all_players[player.gm.id].size == 2) { + var (p1, p2) = Pair(all_players[player.gm.id][0], all_players[player.gm.id][1]) + println("Игрок ${p1.id} подключился") + p1.sendPlayerId(p1.id) + println("Игрок ${p2.id} подключился") + p2.sendPlayerId(p2.id) + p2.enemy = p1 + p1.enemy = p2 + guessedNumber = (1..9).random() // TODO: исправить + println("Загадано число ${guessedNumber}") + Thread(p2).start() + Thread(p1).start() + println("Два врага найдены") + } } println("Игра началась") + } - currentPlayer = players[0] - guessedNumber = (1..9).random() - for (player in players) { - player.sendPlayerId(player.id) - player.sendGuessedNumber(guessedNumber) - } - println("Загадано число ${guessedNumber}") - } private inner class Player(val clientSocket: Socket) : Runnable { - val id: Int = players.size + 1 + val id: Int = id_count // TODO @a1sarpi + var gm: Game private val reader: BufferedReader private val writer: PrintWriter + var enemy: Player ? = null + init { reader = BufferedReader(InputStreamReader(clientSocket.getInputStream())) writer = PrintWriter(clientSocket.getOutputStream(), true) + + gm = Game.fromInt(reader.readLine().toInt()) + + id_count++ } fun sendPlayerId(id: Int) { @@ -65,24 +78,9 @@ class Server { override fun run() { try { - while (true) { - println("Сервер ждёт загаданного числа") - val number = reader.readLine().toInt() - println("Игрок $id выбрал число $number") - - for (player in players) { - if (player != this) { - player.sendOpponentNumber(number) - } - } - - if (number == guessedNumber) { - println("Игрок $id угадал число!") - for (player in players) { - player.sendOpponentNumber(number) - } - break - } + when(gm) { + Game.RANNUM -> rannum() + else -> {println("Ошибка! Игры ${gm} не существует")} } } catch (e: Exception) { e.printStackTrace() @@ -92,9 +90,33 @@ class Server { clientSocket.close() } } + + fun rannum() { + // currentPlayer = players[0] + sendGuessedNumber(guessedNumber) + while (true) { + println("Сервер ждёт выбранное число") + val number = reader.readLine().toInt() + println("Игрок $id выбрал число $number") + enemy?.sendOpponentNumber(number) + if (number == guessedNumber) { + println("Игрок $id угадал число!") + break + } + } + } + } +} + +enum class Game(val id: Int) { + RANNUM(0), XO(1), KNB(2), QUIZ(3); + companion object { + fun fromInt(id: Int) = Game.values().first { it.id == id } } } + + fun main() { val server = Server() server.start()