From 035e26b6ee0541ecdf471ba3545c68a32a76f79b Mon Sep 17 00:00:00 2001 From: LuisCorGon Date: Tue, 20 Feb 2024 16:43:13 +0100 Subject: [PATCH] <3 --- Cliente/cliente.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++ README.txt | 46 +++++++++++++++++++++++ Server/servidor.py | 52 ++++++++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 Cliente/cliente.py create mode 100644 README.txt create mode 100644 Server/servidor.py diff --git a/Cliente/cliente.py b/Cliente/cliente.py new file mode 100644 index 0000000..458db6f --- /dev/null +++ b/Cliente/cliente.py @@ -0,0 +1,91 @@ +import tkinter as tk +import socket +import ast + +# Creamos el socket una vez al inicio del cliente +client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +host = '127.0.0.1' +port = 12345 +client_socket.connect((host, port)) + +def recibir_casillas_especiales(): + try: + # Recibe las coordenadas de las casillas especiales del servidor + data = client_socket.recv(1024).decode() + return ast.literal_eval(data) + except Exception as e: + print(f"Error al recibir las casillas especiales: {e}") + return [] + +intentos = 0 + +def enviar_posicion(fila, columna): + global intentos + try: + if intentos < 20: + # Envía la posición al servidor + mensaje = f"{fila},{columna}" + client_socket.sendall(mensaje.encode()) + + # Recibe la respuesta del servidor + respuesta = client_socket.recv(1024).decode() + print(f"Respuesta del servidor: {respuesta}") + + # Actualiza el mensaje en la interfaz de usuario + lbl_estado.config(text=respuesta) + + # Cambia el color de la casilla si es especial + if respuesta == "¡HAS TOCADO!": + btn = botones[fila][columna] + btn.config(bg="red") + elif respuesta == "¡AGUA!": + pass + + intentos += 1 + + if intentos == 20: + lbl_estado_final.config(text="¡HAS AGOTADO TUS INTENTOS!") + root.after(2000, root.destroy) + + # Actualiza el número de intentos en la interfaz de usuario + lbl_intentos.config(text=f"Intentos: {intentos}/20") + except Exception as e: + print(f"Error al enviar la posición al servidor: {e}") + +def clic_casilla(fila, columna): + print(f"Posición clicada: ({fila}, {columna})") + enviar_posicion(fila, columna) + +def crear_cuadricula(root, filas, columnas): + global botones + botones = [] + for fila in range(filas): + fila_botones = [] + for columna in range(columnas): + cuadricula = tk.Button(root, width=4, height=2, bg="blue", command=lambda f=fila, c=columna: clic_casilla(f, c)) + cuadricula.grid(row=fila, column=columna) + fila_botones.append(cuadricula) + botones.append(fila_botones) + +# Crea una etiqueta para mostrar el estado del clic +root = tk.Tk() +root.title("Hundir la Flota - Cliente") +lbl_estado = tk.Label(root, text="") +lbl_estado.grid(row=10, columnspan=10) + +# Recibe las coordenadas de las casillas especiales +casillas_especiales = recibir_casillas_especiales() +print(f"Casillas especiales recibidas: {casillas_especiales}") + +# Crear la cuadrícula de juego +crear_cuadricula(root, 10, 10) + +# Etiqueta para mostrar el estado final del juego +lbl_estado_final = tk.Label(root, text="") +lbl_estado_final.grid(row=11, columnspan=10) + +# Etiqueta para mostrar el número de intentos +lbl_intentos = tk.Label(root, text="Intentos: 0/20") +lbl_intentos.grid(row=12, columnspan=10) + +root.mainloop() diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..1e3f2c0 --- /dev/null +++ b/README.txt @@ -0,0 +1,46 @@ +Juego Hundir la Flota - Cliente y Servidor + +Este es un juego de Hundir la Flota implementado en un entorno cliente-servidor. El juego permite a un jugador intentar hundir barcos en una cuadrícula especial de 10x10 con casillas especiales. + +|CLIENTE| + +Requisitos +- Python 3.x +- Biblioteca tkinter (incluida en la instalación estándar de Python) + +Ejecución +1. Ejecute el servidor antes de iniciar el cliente. +2. Abra una terminal y ejecute el script del cliente. + +1.El cliente establecerá una conexión con el servidor y mostrará una interfaz gráfica del juego. +Funcionalidades + +-El cliente tiene una cuadrícula de juego de 10x10. +-Puede hacer clic en las casillas para intentar hundir barcos. +-El juego le indicará si ha tocado un barco o si ha dado en el agua. +-El número de intentos está limitado a 20. + +|SERVIDOR| + +Requisitos +-Python 3.x + +Ejecución +1.Abra una terminal y ejecute el script del servidor. +python servidor.py + + +1. El servidor esperará conexiones entrantes. +Funcionalidades + +-El servidor gestiona la lógica del juego y las conexiones con los clientes. +-Define casillas especiales donde se encuentran los barcos. +-Envía las coordenadas de las casillas especiales al cliente al establecer la conexión. +-Recibe las coordenadas de los clics del cliente y envía la respuesta (tocaste o agua). +-Limita el número de intentos del cliente a 20. + +Importante + +-Asegúrese de tener permisos para ejecutar scripts y de que los puertos utilizados (predeterminadamente el 12345) estén disponibles. +-Se recomienda ejecutar el servidor en un terminal y el cliente en otro. +¡Disfrute del juego Hundir la Flota! \ No newline at end of file diff --git a/Server/servidor.py b/Server/servidor.py new file mode 100644 index 0000000..2b9d760 --- /dev/null +++ b/Server/servidor.py @@ -0,0 +1,52 @@ +import socket +import threading +import random + +# Define las coordenadas de casillas especiales +casillas_especiales = [(2, 5), (3, 3), (4, 7), (5, 2), (6, 0), + (6, 5), (7, 8), (8, 4), (9, 1), (9, 9)] + +def manejar_conexion(conn, addr): + print(f"Conexión establecida con {addr}") + + # Envía las coordenadas de las casillas especiales al cliente + conn.sendall(str(casillas_especiales).encode()) + + intentos = 0 + + while intentos < 20: + data = conn.recv(1024).decode() + if not data: + break + print(f"Mensaje recibido de {addr}: {data}") + + # Verifica si la casilla clicada es especial y envía la respuesta al cliente + fila, columna = map(int, data.split(',')) + if (fila, columna) in casillas_especiales: + respuesta = "¡HAS TOCADO!" + else: + respuesta = "¡AGUA!" + conn.sendall(respuesta.encode()) + + intentos += 1 + + print(f"Conexión cerrada con {addr}") + conn.close() + +def main(): + host = '127.0.0.1' + port = 12345 + + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_socket.bind((host, port)) + server_socket.listen(5) + + print("Servidor esperando conexiones...") + + while True: + conn, addr = server_socket.accept() + thread = threading.Thread(target=manejar_conexion, args=(conn, addr)) + thread.start() + +if __name__ == "__main__": + main()