From d8736beacb82f1914ecf0e9443c9b5ee879f2fd6 Mon Sep 17 00:00:00 2001 From: Pierre FERREIRA Date: Mon, 24 Jun 2024 15:13:04 +0200 Subject: [PATCH] =?UTF-8?q?ajout=20de=20=C3=A9v=C3=A9nements=20(non=20fonc?= =?UTF-8?q?tionnel)=20:bento:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DouShouQiIOS/Class/GameScene.swift | 63 ++++---- DouShouQiIOS/DouShouQiIOS/Class/GameVM.swift | 145 ++++++++---------- 2 files changed, 98 insertions(+), 110 deletions(-) diff --git a/DouShouQiIOS/DouShouQiIOS/Class/GameScene.swift b/DouShouQiIOS/DouShouQiIOS/Class/GameScene.swift index 5a27ede..19d3bfb 100644 --- a/DouShouQiIOS/DouShouQiIOS/Class/GameScene.swift +++ b/DouShouQiIOS/DouShouQiIOS/Class/GameScene.swift @@ -12,7 +12,7 @@ import SwiftUI class GameScene : SKScene{ - @ObservedObject var gameVm : GameVM + // @ObservedObject var gameVm : GameVM let imgBoard : SKSpriteNode = SKSpriteNode(imageNamed: "BoardImg") let defaultSize : CGSize = CGSize(width: 120, height: 120) @@ -21,36 +21,37 @@ class GameScene : SKScene{ // andPlayer1: Player(withName: "Meruemu", andId: .player1)!, // andPlayer2: Player(withName: "Kumogi", andId: .player2)!) -// let pieces : [ Owner : [Animal : SpriteMeeple]] = -// [ -// .player1 : [ -// .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), -// .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), -// .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), -// .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), -// .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), -// .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), -// .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), -// .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), -// ], -// -// .player2: [ -// .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), -// .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), -// .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), -// .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), -// .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), -// .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), -// .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), -// .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), -// ] -// ] + let pieces : [ Owner : [Animal : SpriteMeeple]] = + [ + .player1 : [ + .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), + .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), + .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), + .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), + .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), + .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), + .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), + .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), + ], + + .player2: [ + .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), + .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), + .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), + .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), + .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), + .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), + .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), + .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), + ] + ] init(size s: CGSize, andVM gameVM : GameVM){ - self.gameVm = gameVM + //self.gameVm = gameVM super.init(size: s) + self.addChild(imgBoard) - self.displayBoard(gameVm.game.board) + //self.displayBoard(gameVm.game.board) self.scaleMode = .aspectFit self.anchorPoint = CGPoint(x: 0.5, y:0.5) @@ -60,17 +61,15 @@ class GameScene : SKScene{ for row in 0.. todelete) +// let player1 : Player +// let player2 : Player +// var pieces : [ Owner : [Animal : SpriteMeeple]] +// let actualRules : Rules ///Error @Published var hasError : Bool = false - //Message + ///Message @Published var displayMessage : String = "" - var game : Game + //On donne directement la scene et la game à la vm + public init(withGame _game : Game?, andScene _gameScene : GameScene) { + + self.game = _game + self.gameScene = _gameScene + + ///Abonnement aux événements + self.game?.addGameStartedListener(onGameStart) + self.game?.addPlayerNotifiedListener(onPlayerNotified) + self.game?.addMoveChosenCallbacksListener(onMoveChosen) + self.game?.addInvalidMoveCallbacksListener(onInvalidMove) + self.game?.addBoardChangedListener(onBoardChanged) + self.game?.addGameOverListener(onGameOver) + //self.game?.addGameChangedListener({}) - //? cas persistance + } - public init(withRules rules : Rules = ClassicRules(), andPlayer1 p1: Player, andPlayer2 p2 : Player?) { - self.player1 = p1 - - if let p2 { - self.player2 = p2 + + func onGameStart(board : Board){ + displayMessage = " ==>> 🎉 GAME STARTS! 🎉 <<== " + } + + func onPlayerNotified(board : Board, player : Player) async{ + if player is HumanPlayer { + displayMessage = "Player \(player.id == .player1 ? "🟡 1" : "🔴 2") - \(player.name), it's your turn!" } else { - self.player2 = RandomPlayer(withName: "Bobot", andId: .player2)! + do{ + _ = try await player.chooseMove(in: board, with: self.game!.rules) + } + catch{ + hasError = true + } } + } + + func onMoveChosen(board : Board, move : Move, player : Player){ + ///Récupération du Meeple : + let movedPiece = board.grid[move.rowOrigin][move.columnOrigin] + let meeples = gameScene.pieces[move.owner] - self.actualRules = rules - - self.game = try! Game(withRules: actualRules, andPlayer1: player1, andPlayer2: player2) - - //TODO recup les pieces de la game ? - self.pieces = - [ .player1 : [ - .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), - .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), - .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), - .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), - .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), - .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), - .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), - .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), - ], - - .player2: [ - .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), - .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), - .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), - .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), - .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), - .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), - .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), - .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), - ] - ] + let meeple = meeples?.first(where: { + $0.key == movedPiece.piece?.animal + }) + meeple?.value.cellPosition = CGPoint(x: move.rowDestination, y: move.columnDestination) } + ///Mouvement invalide + func onInvalidMove(board : Board, move : Move, player : Player, result : Bool){ + if result { ///* invalidité terminante + return + } + displayMessage = "⚠️⚠️⚠️⚠️ Invalid Move detected: \(move) by \(player.name) (\(player.id))" + } + + func onBoardChanged(board : Board){ + /// Bruit d'un placement de pion ? + } + + func onGameOver(board : Board, result : Result, winner : Player?){ + displayMessage = "Game Over!!!" + isGameOver = true ///Gestion par l'appelant + } + func readInt(withMessage message: String) -> Int { var temp: Int? @@ -96,42 +122,5 @@ class GameVM : ObservableObject, Identifiable { return Move(of: player.id, fromRow: originRow!, andFromColumn: originCol!, toRow: destRow!, andToColumn: destCol!) } - - - func startGame() async throws -> Int - { -// if (player1 == nil || player2 == nil){ -// //Affichage de l'erreur -// return 1 -// } - - for player in game.players { - if player.value is HumanPlayer { - let hp = player.value as! HumanPlayer - hp.changeInput(input: readMove) - } - } - - game.addGameStartedListener {_ in - self.displayMessage = "🎉 GAME STARTS! 🎉" - } - - game.addPlayerNotifiedListener({ board, player in - - self.displayMessage = "Player \(player.id == .player1 ? "🟡 1" : "🔴 2") - \(player.name), it's your turn!" - //try! await Persistance.saveGame(withName: "game", andGame: game2) - - _ = readLine() - - if player is HumanPlayer { - let move = self.readMove(from: player as! HumanPlayer) - try! await (player as! HumanPlayer).chooseMove(move) - } else { - _ = try! await player.chooseMove(in: board, with: self.game.rules) - } - }) - - return 0 - } }