Habilitada OportunidadWin

master
Araozu 2020-10-20 12:59:09 -05:00
parent 3e193a71a6
commit 6d066140ce
4 changed files with 57 additions and 154 deletions

View File

@ -1,6 +0,0 @@
package dev.araozu
data class OportunidadesJuego (
val tipos: ArrayList<String>,
val cartaDescartada: Int
)

View File

@ -1,102 +0,0 @@
package dev.araozu
/*
122334
112233
*/
fun obtSeq(arrl: ArrayList<Int>): ArrayList<ArrayList<Int>> {
val arrlR = arrayListOf<ArrayList<Int>>()
var i = 0
while (i < arrl.size) {
val primerElem = arrl[i]
if (arrl.contains(primerElem + 1) && arrl.contains(primerElem + 2)) {
arrl.remove(primerElem)
arrl.remove(primerElem + 1)
arrl.remove(primerElem + 2)
arrlR.add(arrayListOf(primerElem, primerElem + 1, primerElem + 2))
} else {
i++
}
}
return arrlR
}
fun obtSeqInv(arrl: ArrayList<Int>): ArrayList<ArrayList<Int>> {
val arrlR = arrayListOf<ArrayList<Int>>()
var i = arrl.size - 1
while (i >= 0) {
val primerElem = arrl[i]
if (arrl.contains(primerElem - 1) && arrl.contains(primerElem - 2)) {
arrl.remove(primerElem)
arrl.remove(primerElem - 1)
arrl.remove(primerElem - 2)
i -= 3
arrlR.add(arrayListOf(primerElem, primerElem - 1, primerElem - 2))
} else {
i--
}
}
return arrlR
}
fun obtTri(arrl: ArrayList<Int>): ArrayList<ArrayList<Int>> {
val arrlR = arrayListOf<ArrayList<Int>>()
var i = 0
while (i + 2 < arrl.size) {
val primerElem = arrl[i]
if (primerElem == arrl[i + 1] && primerElem == arrl[i + 2]) {
arrl.remove(primerElem)
arrl.remove(primerElem)
arrl.remove(primerElem)
arrlR.add(arrayListOf(primerElem, primerElem, primerElem))
} else {
i++
}
}
return arrlR
}
fun obtPar(arrl: ArrayList<Int>): ArrayList<ArrayList<Int>> {
val arrlR = arrayListOf<ArrayList<Int>>()
var i = 0
while (i + 1 < arrl.size) {
val primerElem = arrl[i]
if (primerElem == arrl[i + 1]) {
arrl.remove(primerElem)
arrl.remove(primerElem)
arrlR.add(arrayListOf(primerElem, primerElem))
} else {
i++
}
}
return arrlR
}
fun main() {
val cartas = arrayListOf(2, 2, 2, 3, 3, 4, 4)
val cartas2 = arrayListOf(2, 2, 2, 3, 3, 4, 4)
val arrlR = obtSeq(cartas)
val arrlT = obtTri(cartas)
val arrlP = obtPar(cartas)
println("-------------------")
println(arrlR)
println(arrlT)
println(arrlP)
println(cartas)
val arrlR2 = obtSeqInv(cartas2)
val arrlT2 = obtTri(cartas2)
val arrlP2 = obtPar(cartas2)
println("-------------------")
println(arrlR2)
println(arrlT2)
println(arrlP2)
println(cartas2)
}

View File

@ -129,62 +129,69 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
}
suspend fun manejarDescarte(idUsuario: String, carta: Int) {
if (ordenJugadores[turnoActual] == idUsuario) {
val m = manos[idUsuario]!!
if (ordenJugadores[turnoActual] != idUsuario) return
val m = manos[idUsuario]!!
if (m.sigCarta == carta) {
m.sigCarta = -1
} else {
val posCarta = m.cartas.indexOf(carta)
if (posCarta != -1) {
m.cartas.removeAt(posCarta)
// Tras llamar un Seq/Tri el jugador no tiene una carta adicional en su mano.
if (m.sigCarta != -1) m.cartas.add(m.sigCarta)
if (m.sigCarta == carta) {
m.sigCarta = -1
} else {
val posCarta = m.cartas.indexOf(carta)
if (posCarta != -1) {
m.cartas.removeAt(posCarta)
// Tras llamar un Seq/Tri el jugador no tiene una carta adicional en su mano.
if (m.sigCarta != -1) m.cartas.add(m.sigCarta)
m.sigCarta = -1
} else {
return
}
return
}
}
m.descartes.add(carta)
m.descartes.add(carta)
// Verificar seq/tri/quad/win
var hayOportunidades = false
for ((idUsuarioActual, mano) in manos) {
// No buscar oportunidades en el usuario que acaba de descartar.
if (idUsuarioActual == idUsuario) continue
// Verificar seq/tri/quad/win
var hayOportunidades = false
for ((idUsuarioActual, mano) in manos) {
// No buscar oportunidades en el usuario que acaba de descartar.
if (idUsuarioActual == idUsuario) continue
// Solo verificar seq en el jugador a la derecha del que descarto
if (esUsuarioIzq(idUsuario, idUsuarioActual)) {
val oportunidadSeq = OportunidadSeq.verificar(carta, mano.cartas)
if (oportunidadSeq != null) {
hayOportunidades = true
mano.oportunidades.add(oportunidadSeq)
}
}
// Oportunidades tri
val oportunidadTri = OportunidadTri.verificar(carta, mano.cartas)
if (oportunidadTri != null) {
// Solo verificar seq en el jugador a la derecha del que descarto
if (esUsuarioIzq(idUsuario, idUsuarioActual)) {
val oportunidadSeq = OportunidadSeq.verificar(carta, mano.cartas)
if (oportunidadSeq != null) {
hayOportunidades = true
mano.oportunidades.add(oportunidadTri)
mano.oportunidades.add(oportunidadSeq)
}
}
if (hayOportunidades) {
// Enviar datos
enviarDatosATodos()
} else {
cambiarTurnoSigJugadorConsecutivo()
// Actualizar dora
gestorDora!!.actualizarDoraCerrado()
// Enviar datos
enviarDatosATodos()
// Oportunidades tri
val oportunidadTri = OportunidadTri.verificar(carta, mano.cartas)
if (oportunidadTri != null) {
hayOportunidades = true
mano.oportunidades.add(oportunidadTri)
}
// Oportunidades win
val oportunidadWin = OportunidadWin.verificar(carta, mano.cartas)
if (oportunidadWin != null) {
hayOportunidades = true
mano.oportunidades.add(oportunidadWin)
}
}
if (hayOportunidades) {
// Enviar datos
enviarDatosATodos()
} else {
cambiarTurnoSigJugadorConsecutivo()
// Actualizar dora
gestorDora!!.actualizarDoraCerrado()
// Enviar datos
enviarDatosATodos()
}
}

View File

@ -145,7 +145,7 @@ class OportunidadWin(override val cartaDescartada: Int) : Oportunidad {
return if (valorCont1 > valorCont2) contenedor1 else contenedor2
}
fun verificar(valorCarta: Int, cartasMano: ArrayList<Int>) {
fun verificar(valorCarta: Int, cartasMano: ArrayList<Int>): OportunidadWin? {
val narrl = ArrayList<Int>(cartasMano.size + 1)
narrl.addAll(cartasMano)
narrl.add(valorCarta)
@ -165,7 +165,11 @@ class OportunidadWin(override val cartaDescartada: Int) : Oportunidad {
contenedorGrupos.agregarDesdeContenedor(obtenerContenedorCartasNumero(cartasRojo))
contenedorGrupos.agregarDesdeContenedor(obtenerContenedorCartasNumero(cartasNegro))
return if (contenedorGrupos.estaListo()) {
OportunidadWin(valorCarta)
} else {
null
}
}
}