def jugar_partida(config, partida={}):
    """Juega la partida tanto la nueva partica como una cargada."""
    def iniciar(nombre):
        """Elige aleatoriamente para comenzar entre el jugador y la maquina."""
        x = random.randint(0, 1)
        if x == 0:
            sg.popup_ok("Comienza el jugador: " + nombre)
            return True, nombre
        else:
            sg.popup_ok("Comienza a jugar la maquina")
            return True, "maquina"

    def abrir_partida(partida, window):
        """Usa los componentes de la partida guardada."""
        try:
            tablero = partida["tablero"]
            for i in tablero.keys():
                window[i].Update(tablero[i])
            un_jugador = list(partida["puntos_jugador"].keys())[0]
            bolsa = Bolsa(un_ABC=partida["letras_bolsa"])
            guido = Maquina(unas_letras=partida["letras_M"],
                            un_nivel=partida["dificultad"],
                            filas=partida["filas"],
                            columnas=partida["columnas"])
            jugador = Jugador(un_jugador, partida["letras_J"],
                              partida["dificultad"], partida["filas"],
                              partida["columnas"])
            juez = Juez(partida["dificultad"], partida["tabla_puntajes"],
                        config["tablero"], un_jugador, partida["turno"])
            letras_j = partida["letras_J"]
            for clave, valor in letras_j.items():
                window[clave].Update(valor)
            return True, guido, jugador, juez
        except FileNotFoundError or KeyError:
            sg.Popup("Ha ocurrido un error abriendo la partida.")
            return False, [], [], []

    def guardar_partida():
        try:
            with open('partida.json', 'w') as file:
                partida = {}
                tablero = config["tablero"]
                multiplicador = config["tablero"]
                coordenadas = list(map(str, multiplicador.keys()))
                valores = multiplicador.values()
                multiplicador = dict(zip(coordenadas, valores))
                for i in list(tablero.keys()):
                    tablero[i] = window[i].GetText()
                coordenadas = list(map(str, tablero.keys()))
                valores = tablero.values()
                tablero = dict(zip(coordenadas, valores))
                partida["tablero"] = tablero
                partida["turno"] = juez.turno
                partida["letras_M"] = guido.letras
                partida["letras_J"] = jugador.letras
                partida["tabla_puntajes"] = juez.tabla_puntaje
                partida["multiplicadores"] = multiplicador
                partida["puntos_jugador"] = juez.jugadores
                partida["letras_bolsa"] = bolsa.ABC
                partida["dificultad"] = config["dificultad"]
                partida["filas"] = config["Filas"]
                partida["columnas"] = config["Columnas"]
                partida["tiempo"] = config["tiempo"]
                json.dump(partida, file)
                return True
        except FileNotFoundError or KeyError:
            sg.Popup("Ha ocurrido un error.")
            return False

    w, h = sg.Window.get_screen_size()
    window = sg.Window(
        "SCRABBLE",
        crear.crear_partida(config),
        finalize=True,
        size=(w, h),
        resizable=True,
        element_justification="c",
        background_color="#143430",
    )
    window.Maximize()
    bolsa = Bolsa(un_ABC=config["cant_letras"])
    letras_jugador = bolsa.sacar_letras(7)
    letras_maquina = bolsa.sacar_letras(7)
    # window.Maximize()
    claves = []
    for j in range(7):
        clave = "letra" + str(j)
        window[clave].Update(letras_jugador[j])
        claves.append(clave)
    mis_letras = dict(zip(claves, letras_jugador))
    comenzo = False
    final = False
    abri = False
    while not final:
        if partida:
            abri, guido, jugador, juez = abrir_partida(partida, window)
            comenzo = abri
        event, values = window.Read()
        if event == None or event == "fin-partida":
            valor = sg.popup_yes_no("¿Desea guardar la partida?")
            if valor == "Yes":
                if comenzo:
                    guardado = guardar_partida()
                    if guardado:
                        sg.Popup(
                            "La partida se ha guardado exitosamente. Saliendo del juego"
                        )
                        break
                    else:
                        sg.Popup("No se ha podido guardar la partida.")
                else:
                    sg.Popup("El juego aun no ha comenzado.")
            final = True
            break
        elif event == "Referencias":
            window2 = sg.Window(
                "Referencias",
                crear.crear_lyt(event),
                finalize=True,
                resizable=True,
                element_justification="c",
                background_color="#143430",
            )
            event, values = window2.Read()
            while not (event == None or event == "cerrar_referencias"):
                None
            window2.close()
        elif event == "guardar":
            if comenzo:
                guardado = guardar_partida()
                if guardado:
                    sg.Popup(
                        "La partida se ha guardado exitosamente. Saliendo del juego"
                    )
                    break
                    final = True
                else:
                    sg.Popup("No se ha podido guardar la partida.")
            else:
                sg.Popup("El juego aun no ha comenzado.")
        elif event == "iniciar" and not comenzo:
            nombre = sg.popup_get_text("Ingrese su nombre: ")
            window["nombre_player"].update(nombre + ": ")
            comenzo, primero = iniciar(nombre)
            guido = Maquina(unas_letras=letras_maquina,
                            un_nivel=config["dificultad"],
                            filas=config["Filas"],
                            columnas=config["Columnas"])
            jugador = Jugador(nombre, mis_letras, config["dificultad"],
                              config["Filas"], config["Columnas"])
            juez = Juez(config["dificultad"], config['valores_letras'],
                        config["tablero"], nombre, primero)
        elif not comenzo:
            sg.popup_ok("Para comenzar oprima el boton iniciar")
        if comenzo and not final:
            if abri:
                sg.Popup("Ahora es el turno de " + str(juez.turno))
                nombre = jugador.nombre
            if (juez.turno == nombre):
                jugador.jugar(window, juez, bolsa)
                agregue = jugador._agregar_letras(window, bolsa)
                if not agregue:
                    sg.Popup("No se pudo agregar letras.")
                    sg.Popup("Termino la partida, porque no hay mas letras.")
                    final = True
                else:
                    window["puntaje_player"].update(juez.jugadores[nombre])
            elif (juez.turno == "maquina"):
                jugue, motivo = guido._jugar(window, juez, config)
                if not jugue:
                    if motivo == "no hay espacios":
                        final = True
                        sg.Popup(
                            "Termino la partida por la maquina no encontro espacio."
                        )
                    elif motivo == "no hay palabras validas":
                        juez.turno = nombre
                        sg.Popup("La maquina no pudo formar palabras")
                else:
                    guido.agregar_letras(
                        bolsa.sacar_letras(7 - len(guido.letras)))
                    juez.turno = nombre
                    window["puntaje_maquina"].update(juez.jugadores["maquina"])
                    sg.Popup("Es el turno de: " + str(nombre))
    if comenzo and final:
        podio = juez._determinar_ganador()
        if 0 in podio.keys():
            sg.Popup("Hubo un empate con: " + str(podio[0][0][1]) + " puntos.")
        else:
            sg.Popup("El ganador es: " + str(podio[1][0]) + " con " +
                     str(podio[1][1]) + " puntos.")
            with open('mejores.json', 'r') as file:
                top = json.load(file)
            with open('mejores.json', 'w') as file:
                top = dict(top)
                nuevo_top = dict()
                top["nuevo"] = [
                    jugador.nombre, juez.jugadores[nombre], juez.nivel
                ]
                mejores = list(
                    sorted(top.values(), key=lambda x: x[1], reverse=True))
                for i in range(len(mejores)):
                    nuevo_top[i + 1] = mejores[i]
                    if i == 9:
                        break
                json.dump(nuevo_top, file)
    window.Close()