diff --git a/generala/generala.xcodeproj/project.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate b/generala/generala.xcodeproj/project.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate index 94376b0..1be1b93 100644 Binary files a/generala/generala.xcodeproj/project.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate and b/generala/generala.xcodeproj/project.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/poker.zip b/poker.zip new file mode 100644 index 0000000..179a049 Binary files /dev/null and b/poker.zip differ diff --git a/poker/20200416_212700.pdf b/poker/20200416_212700.pdf new file mode 100644 index 0000000..6ad3a05 Binary files /dev/null and b/poker/20200416_212700.pdf differ diff --git a/poker/poker/poker.xcodeproj/project.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate b/poker/poker/poker.xcodeproj/project.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate index ad37da7..bb6eb10 100644 Binary files a/poker/poker/poker.xcodeproj/project.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate and b/poker/poker/poker.xcodeproj/project.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/poker/poker/poker/Base.lproj/Main.storyboard b/poker/poker/poker/Base.lproj/Main.storyboard index c2cc1b0..ff95eaf 100644 --- a/poker/poker/poker/Base.lproj/Main.storyboard +++ b/poker/poker/poker/Base.lproj/Main.storyboard @@ -1,6 +1,6 @@ - + @@ -12,26 +12,26 @@ - + - - + diff --git a/poker/poker/poker/Carta.swift b/poker/poker/poker/Carta.swift index d51e10a..a338557 100644 --- a/poker/poker/poker/Carta.swift +++ b/poker/poker/poker/Carta.swift @@ -2,86 +2,98 @@ // Carta.swift // poker // -// Created by Mobile Roshka on 4/13/20. +// Created by Julio Hermosa on 4/13/20. // Copyright © 2020 Mobile Roshka. All rights reserved. // import Foundation +enum Palo: Int{ + //se crean los palos posibles en poker (el valor de los mismos no tienen significancia en el juego) + case E = 1//espadas + case T = 2//tréboles + case C = 3//corazones + case D = 4//diamantes +} +enum Jugada: Int{ + //se crean las combinaciones posibles con un valor que sirve para saber cual es la mejor jugada + case EscaleraReal = 10 + case EscaleraColor = 9 + case Poker = 8 + case Full = 7 + case Color = 6 + case Escalera = 5 + case Trio = 4 + case ParDoble = 3 + case Par = 2 + case CartaAlta = 1 +} -struct Carta{ - var valor = Int() - //var nombre = String() - var palo = Palo.self - //var palo = String() - enum Palo: Int{ - case E = 1 - case T = 2 - case C = 3 - case D = 4 + +//se simula una baraja, que contiene hasta 52 cartas francesas +class Baraja{ + var cartas: [(Int, String)]? = [] + func crearBaraja(){ + for index1 in 1...13{ + for index2 in 1...4{ cartas!.append((index1,"\(Palo.init(rawValue: index2)!)")) + } + + } } - } -class Baraja{ - // var enMesa = [String]() - var valor = [Int]() +//se simula que se extraen 5 cartas de una baraja para cada jugador +class Manos{ + var cartasEnMano: [(Int, String)] = [] + var baraja: Baraja = Baraja() var valoresOrdenados = [Int]() var palo = [String]() var nombreCarta = [String]() - var nombreJugada = "Carta alta" - private let escalera: [Int] = [1, 10, 11, 12, 13] + var nombreJugada:Jugada = Jugada(rawValue: 1)! + + private let escaleraReal: [Int] = [1, 10, 11, 12, 13] //función para extraer 5 cartas y guardar la información en arrays con los valores, el palo y el nombre de la carta en caso de ser A, J, Q y K - func extraerCartas()/*->[String]*/{ - let carta = Carta.init() - - //recorremos un array de 5 elementos (cada una de las cartas extraídas) - for index in 0...4{ - //se elige al azar el palo segun el enum de palo - var paloCarta = carta.palo.init(rawValue: .random(in: 1...4)) - - //se guarda en el array los valores de la carta y el palo - valor.append(Int.random(in: 1...13)) - palo.append("\(paloCarta!)") - - //se recorre por los elementos anteriores para determinar si se repitió la carta y si es así escojemos otra - for i in 0..String{ + //devuelve el nombre de la jugada segun la combinación de cartas, el array con los valores ordenados y el mayor en caso de haber una combinación + func jugadas()->(Jugada, [Int], Int){ + var cartasOrdenadas = valoresOrdenados // copiamos su contenido para cambiar el orden en caso de tener ases, ya que los mismos tambien pueden valer 14 (se evalúa para cada caso) + var mayorCombinacion = 0 //se utiliza en caso de necesitar desempate entre pares, doblepares, tríos, full y poker + var contSecuencia = 1 //Para determinar si hay una escalera + var contPalosIguales = 1 // para determinar si hay color + var cantidad: [(Int, Int)] = [(1,0),(2,0),(3,0),(4,0),(5,0),(6,0),(7,0),(8,0),(9,0),(10,0),(11,0),(12,0),(13,0)] //se guarda el número de apariciones de cada valor, para determinar si hay pares, tríos o poker - var contSecuencia = 1 - var contPalosIguales = 1 - var diccionarioCantidad: [Int: Int] = [1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0] - diccionarioCantidad[valoresOrdenados[0]]! += 1 + cantidad[valoresOrdenados[0]].1 += 1 for index in 1...4{ if valoresOrdenados[index] == valoresOrdenados[index-1]+1{ contSecuencia += 1 @@ -89,54 +101,89 @@ class Baraja{ if palo[index] == palo[index-1]{ contPalosIguales += 1 } - if diccionarioCantidad[valoresOrdenados[index]] == 0{ - diccionarioCantidad[valoresOrdenados[index]]! += 1 + if cantidad[valoresOrdenados[index]-1].1 == 0{ + cantidad[valoresOrdenados[index]-1].1 += 1 } + if valoresOrdenados[index] == valoresOrdenados[index - 1]{ - diccionarioCantidad[valoresOrdenados[index]]! += 1 + cantidad[valoresOrdenados[index]-1].1 += 1 } + } if contPalosIguales == 5{ - nombreJugada = "Color" + nombreJugada = .Color + if valoresOrdenados.contains(1){ + cartasOrdenadas = cartasOrdenadas.filter { $0 > 1} + cartasOrdenadas.append(14) + } + } if contSecuencia == 5{ - nombreJugada = "Escalera" + nombreJugada = .Escalera } - if valoresOrdenados == escalera{ - nombreJugada = "Escalera" + if valoresOrdenados == escaleraReal{ + nombreJugada = .Escalera + if valoresOrdenados.contains(1){ + cartasOrdenadas = cartasOrdenadas.filter { $0 > 1} + cartasOrdenadas.append(14) + } + } + if nombreJugada == .Escalera && contPalosIguales == 5 { + nombreJugada = .EscaleraColor } - if nombreJugada == "Escalera" && contPalosIguales == 5 { - nombreJugada = "Escalera Color" + if valoresOrdenados == escaleraReal && contPalosIguales == 5 { + nombreJugada = .EscaleraReal + if valoresOrdenados.contains(1){ + cartasOrdenadas = cartasOrdenadas.filter { $0 > 1} + cartasOrdenadas.append(14) + } } - let poker = diccionarioCantidad.filter{ $0.value == 4} - let trio = diccionarioCantidad.filter{ $0.value == 3} - let par = diccionarioCantidad.filter{ $0.value == 2} + let poker = cantidad.filter{ $0.1 == 4} + let trio = cantidad.filter{ $0.1 == 3} + let par = cantidad.filter{ $0.1 == 2} if par.count == 1{ - nombreJugada = "Par" + nombreJugada = .Par + mayorCombinacion = par[0].0 } if par.count == 2{ - nombreJugada = "Par doble" + nombreJugada = .ParDoble + mayorCombinacion = par[1].0 } if trio.count == 1{ - nombreJugada = "Trio" + nombreJugada = .Trio + mayorCombinacion = trio[0].0 } if par.count == 1 && trio.count == 1{ - nombreJugada = "Full" + nombreJugada = .Full + mayorCombinacion = trio[0].0 } if poker.count == 1 { - nombreJugada = "Poker" + nombreJugada = .Poker + mayorCombinacion = poker[0].0 + } + if mayorCombinacion == 1{ + mayorCombinacion = 14 } - return nombreJugada + if nombreJugada == .CartaAlta{ + if valoresOrdenados.contains(1){ + cartasOrdenadas = cartasOrdenadas.filter { $0 > 1} + cartasOrdenadas.append(14) + } + } + + return (nombreJugada, cartasOrdenadas, mayorCombinacion) } + //eliminamos todas las modificaciones para empezar de nuevo el juego func barajarCartas(){ - valor.removeAll() + baraja.cartas?.removeAll() + cartasEnMano.removeAll() palo.removeAll() valoresOrdenados.removeAll() nombreCarta.removeAll() - nombreJugada = "Carta alta" + nombreJugada = .CartaAlta } diff --git a/poker/poker/poker/ViewController.swift b/poker/poker/poker/ViewController.swift index 2b2100d..6b5bd29 100644 --- a/poker/poker/poker/ViewController.swift +++ b/poker/poker/poker/ViewController.swift @@ -11,21 +11,38 @@ import UIKit class ViewController: UIViewController { //var carta:Carta = Carta.init() var baraja:Baraja = Baraja() + var mano1:Manos = Manos() + var mano2:Manos = Manos() + var resultado1: (Jugada, [Int], Int)? = nil + var resultado2: (Jugada, [Int], Int)? = nil + var ganador = String() - @IBOutlet weak var resultadoObtenido: UILabel! + @IBOutlet weak var resultadoObtenido1: UILabel! + + @IBOutlet weak var resultadoObtenido2: UILabel! @IBOutlet weak var valorCarta1: UILabel! @IBOutlet weak var valorCarta2: UILabel! @IBOutlet weak var valorCarta3: UILabel! @IBOutlet weak var valorCarta4: UILabel! @IBOutlet weak var valorCarta5: UILabel! + @IBOutlet weak var valorCarta6: UILabel! + @IBOutlet weak var valorCarta7: UILabel! + @IBOutlet weak var valorCarta8: UILabel! + @IBOutlet weak var valorCarta9: UILabel! + @IBOutlet weak var valorCarta10: UILabel! @IBOutlet weak var imagenCarta1: UIImageView! @IBOutlet weak var imagenCarta2: UIImageView! @IBOutlet weak var imagenCarta3: UIImageView! @IBOutlet weak var imagenCarta4: UIImageView! - @IBOutlet weak var imagenCarta5: UIImageView! + @IBOutlet weak var imagenCarta6: UIImageView! + @IBOutlet weak var imagenCarta7: UIImageView! + @IBOutlet weak var imagenCarta8: UIImageView! + @IBOutlet weak var imagenCarta9: UIImageView! + @IBOutlet weak var imagenCarta10: UIImageView! + @IBOutlet weak var jugarBtn: UIButton! @@ -33,29 +50,132 @@ class ViewController: UIViewController { jugar() } - //llamamos a las funciones relativas al juego de la clase baraja (extraer cartas, obtener la jugada y volver a barajar las cartas) + //llamamos a las funciones relativas al juego de la clase Manos (extraer cartas, obtener la jugada y volver a barajar las cartas) func jugar(){ - baraja.extraerCartas() - resultadoObtenido.text = baraja.jugadas() + baraja.crearBaraja()//creamos un mazo completo de 52 cartas + + mano1.extraerCartas(cartasDisponibles: baraja) + //se envia el array con las cartas aún disponibles + mano2.extraerCartas(cartasDisponibles: baraja) + + resultado1 = mano1.jugadas() + //se guardan los resultados obtenidos en variables resultadoN + resultado2 = mano2.jugadas() + + resultadoObtenido1.text = "\(mano1.jugadas().0)" + //se imprime en los labels el nombre de las jugadas para cada jugador + resultadoObtenido2.text = "\(mano2.jugadas().0)" + //cargamos los valores del array en los labels de las cartas - valorCarta1.text = baraja.nombreCarta[0] - valorCarta2.text = baraja.nombreCarta[1] - valorCarta3.text = baraja.nombreCarta[2] - valorCarta4.text = baraja.nombreCarta[3] - valorCarta5.text = baraja.nombreCarta[4] + valorCarta1.text = mano1.nombreCarta[0] + valorCarta2.text = mano1.nombreCarta[1] + valorCarta3.text = mano1.nombreCarta[2] + valorCarta4.text = mano1.nombreCarta[3] + valorCarta5.text = mano1.nombreCarta[4] + + valorCarta6.text = mano2.nombreCarta[0] + valorCarta7.text = mano2.nombreCarta[1] + valorCarta8.text = mano2.nombreCarta[2] + valorCarta9.text = mano2.nombreCarta[3] + valorCarta10.text = mano2.nombreCarta[4] //segun el nombre de la imagen mostramos su palo - imagenCarta1.image = UIImage(named: "poker-\(baraja.palo[0])") - imagenCarta2.image = UIImage(named: "poker-\(baraja.palo[1])") - imagenCarta3.image = UIImage(named: "poker-\(baraja.palo[2])") - imagenCarta4.image = UIImage(named: "poker-\(baraja.palo[3])") - imagenCarta5.image = UIImage(named: "poker-\(baraja.palo[4])") + imagenCarta1.image = UIImage(named: "poker-\(mano1.palo[0])") + imagenCarta2.image = UIImage(named: "poker-\(mano1.palo[1])") + imagenCarta3.image = UIImage(named: "poker-\(mano1.palo[2])") + imagenCarta4.image = UIImage(named: "poker-\(mano1.palo[3])") + imagenCarta5.image = UIImage(named: "poker-\(mano1.palo[4])") + imagenCarta6.image = UIImage(named: "poker-\(mano2.palo[0])") + imagenCarta7.image = UIImage(named: "poker-\(mano2.palo[1])") + imagenCarta8.image = UIImage(named: "poker-\(mano2.palo[2])") + imagenCarta9.image = UIImage(named: "poker-\(mano2.palo[3])") + imagenCarta10.image = UIImage(named: "poker-\(mano2.palo[4])") + + //llamamos a la función que se encarga de elegir al ganador + elegirGanador() + + mano1.barajarCartas() + //devolvemos las cartas al mazo + mano2.barajarCartas() + } + + func elegirGanador(){ + var valores1 = resultado1!.1 + var valores2 = resultado2!.1 + //comparamos las jugadas segun su ranking para elegir al ganador + if resultado1!.0.rawValue > resultado2!.0.rawValue { + ganador = "Jugador1" + } + if resultado2!.0.rawValue > resultado1!.0.rawValue{ + ganador = "Jugador2" + } + //si ambas jugadas son iguales, se procede al desempate + if resultado1!.0 == resultado2!.0 { + //como se aplican métodos de desempate similares para las escaleras, color y carta alta, se procede a comparar los valores de mayor a menor + if resultado1!.0 == .CartaAlta || resultado1!.0 == .Escalera || resultado1!.0 == .EscaleraColor || resultado1!.0 == .EscaleraReal || resultado1!.0 == .Color { + while valores1.last! == valores2.last!{ + valores1.removeLast() + valores2.removeLast() + } + if valores1.count > 0{ + if valores1.last! > valores2.last!{ + ganador = "Jugador1" + } else + if valores2.last! > valores1.last!{ + ganador = "Jugador2" + } + else{ + ganador = "Empate" + } + } + } + //para desempatar se elige la combinación mayor, en caso de haber empate se comparan con las cartas que no forman parte de la combinación + if resultado1!.0 == .Par || resultado1!.0 == .ParDoble || resultado1!.0 == .Trio || resultado1!.0 == .Full || resultado1!.0 == .Poker{ + + if resultado1!.2 > resultado2!.2{ + ganador = "Jugador1" + } + if resultado2!.2 > resultado1!.2{ + ganador = "Jugador2" + } + if resultado2!.2 == resultado1!.2{ + while valores1.last! == valores2.last!{ + valores1.removeLast() + valores2.removeLast() + } + if valores1.count > 0{ + if valores1.last! > valores2.last!{ + ganador = "Jugador1" + } else + if valores2.last! > valores1.last!{ + ganador = "Jugador2" + } + else{ + ganador = "Empate" + } + } + + } + + } + } - baraja.barajarCartas() + //se muestra en una alerta quien ganó o si es empate + if ganador == "Empate" { + mostrarGanador(mensaje: "\(ganador)") + }else{ + mostrarGanador(mensaje: "El ganador es: \(ganador)") + } } + //se crea la alerta, que muestra quien ganó o si es empate + private func mostrarGanador(mensaje: String){ + let alerta = UIAlertController(title: "Resultado Final", message:mensaje, preferredStyle: .alert) + alerta.addAction(UIAlertAction(title: "Aceptar", style: .default, handler: nil)) + present(alerta, animated:true, completion:nil) + } override func viewDidLoad() { super.viewDidLoad()