¡Advertencia!
Este tema no ha tenido respuestas en más de un mes. Recuerda que si deseas añadir una nueva debes cumplir con las normas de la web.
Traigo para los interesados un trabajo que he tenido que hacer para final de trimestre, el juego Pong hecho con Python. Como no puedo subir archivos aquí ni nada por el estilo me limitare a enseñároslo con pantallazos (si lo queréis probar vosotros mismo os puedo pasar el programa con los archivos por Skype, por ejemplo).
Primero de todo, aquí tenéis el código del programa ya comentado:
Y el juego quedaría tal que así:
1. Antes de iniciar el juego:
2. Jugando:
3. Al finalizar el juego:
PD: si queréis podéis sugerirme cualquier otra cosa que le pueda añadir, revisarme el código, etc.
Primero de todo, aquí tenéis el código del programa ya comentado:
from tkinter import *
import random
import time
import pygame
from pygame.locals import *
pygame.init() #Inicializa pygame
tk = Tk() #Objeto de la clase tkinter
tk.title("Pong") #Titulo de la ventana
tk.resizable(0, 0) #Le da a la ventana un tamaño fijo
tk.wm_attributes("-topmost", 1) #La ventana siempre aparece por encima de cualquier otra
#Medidas de la ventana
canvas = Canvas(tk, width=600, height=450, bd=0, highlightthickness=0)
canvas.pack()
#Fondo del juego
filename = PhotoImage(file = "finduto.png")
canvas.create_image(0, 0, image = filename, anchor = NW)
tk.update() #Inicializa tkinter
#Sonidos del juego
sonido_pierdes = pygame.mixer.Sound("pacman_death.wav")
sonido_rebote = pygame.mixer.Sound("rebote.wav")
#Creando la Pelota --------------------------------------------------------
class Pelota:
def __init__(self, canvas, raqueta, puntuacion, color):
self.canvas = canvas #Variable del objeto canvas
self.raqueta = raqueta
self.puntuacion = puntuacion
#Creando la Pelota (borde superior izquierdo, borde inferior derecho)
self.id= canvas.create_oval(10, 10, 25, 25, fill=color)
#Mueve la pelota (posicion inicial en el canvas)
self.canvas.move(self.id, 290, 100)
empezar = [-3, -2, -1, 1, 2, 3] #Posiciones de la pelota en el canvas
random.shuffle(empezar) #Crea las posiciones aleatoriamente
self.x = empezar[0]
self.y = -3
self.canvas_height = self.canvas.winfo_height() # Nos dice el largo del canvas
self.canvas_width = self.canvas.winfo_width() # Nos dice el ancho del canvas
self.golpea_fondo = False #Si golpea el suelo la pelota deja de moverse
#Almacena las coordenadas de la pelota al golpear la raqueta
def golpea_raqueta(self, pos):
raqueta_pos = self.canvas.coords(self.raqueta.id)
if pos[2] >= raqueta_pos[0] and pos[0] <= raqueta_pos[2]:
if pos[3] >= raqueta_pos[1] and pos[3] <= raqueta_pos[3]:
self.x += self.raqueta.x
self.puntuacion.tanto() #Cuando la pelota toca la raqueta, suma un punto
return True
return False
#Crea el movimiento de la pelota
def dibujar(self):
self.canvas.move(self.id, self.x, self.y)
pos = self.canvas.coords(self.id) #Devuelve las coordenadas de la pelota
#Controla el rebote de la pelota dentro del canvas, el rebote
if pos[1] <= 0:
self.y = 2.5 #Velocidad de la pelota
if pos[3] >= self.canvas_height:
self.golpea_fondo = True #Si golpea el suelo, termina el juego
if self.golpea_raqueta(pos) == True: #Si golpea la raqueta, rebota
self.y = -2.5 #Velocidad de la pelota
if pos[0] <= 0:
self.x = 2.5 #Velocidad de la pelota
if pos[2] >= self.canvas_width:
self.x = -2.5 #Velocidad de la pelota
#Creando la raqueta ------------------------------------------------------
class Raqueta:
def __init__(self, canvas, color):
self.canvas = canvas
self.id= canvas.create_rectangle(0, 0, 100, 10, fill=color)
self.canvas.move(self.id, 260, 350) #Mueve la raqueta
self.x = 0
self.canvas_width = self.canvas.winfo_width()
self.empezado = False
#Hace posible mover el objeto raqueta con las teclas
self.canvas.bind_all('<KeyPress-Left>', self.ir_izq) #bibd_all() incluye una acción a ejecutar y un evento que la activa
self.canvas.bind_all('<KeyPress-Right>', self.ir_der)
#Inica el juego cuando hagamos click en el juego
self.canvas.bind_all('<Button-1>', self.empezar_juego)
#Crea el movimiento de la raqueta
def dibujar(self):
self.canvas.move(self.id, self.x, 0)
pos = self.canvas.coords(self.id)
if pos[0] == 0:
self.x = 0 #Detiene el movimiento de la raqueta al chocar con la pared izquierda
elif pos[0] < 0:
self.x = 2 #Velocidad de la raqueta al rebotar (a partir de 3 la raqueta rebota)
elif pos[2] == self.canvas_width:
self.x = 0 #Detiene el movimiento de la raqueta al chocar con la pared derecha
elif pos[2] > self.canvas_width:
self.x = -2 #Velocidad de la raqueta al rebotar (a partir de -3 la raqueta rebota)
#------------------------------------------------------------------------------
#Variables para usar las teclas para mover la raqueta
def ir_izq(self, evt):
self.x = -2
def ir_der(self, evt):
self.x = 2
#Variable para iniciar el juego con un click derecho del ratón
def empezar_juego(self, evt):
self.empezado = True
#Oculta el texto de inicio al comenzar el juego
canvas.itemconfig(texto_inicio_juego, state='hidden')
canvas.itemconfig(texto_inicio_juego2, state='hidden')
#Creando la puntuación -----------------------------------------------------
class Puntuacion:
def __init__(self, canvas, color):
self.puntuacion = 0
self.canvas = canvas
self.id = canvas.create_text(570, 25, font=("Fixedsys",30), text=self.puntuacion, fill=color)
def tanto(self):
self.puntuacion += 1
self.canvas.itemconfig(self.id, text=self.puntuacion)
sonido_rebote.play()
#---------------------------------------------------------------------------
puntuacion = Puntuacion(canvas, 'orange') #Instancia la puntuación
raqueta = Raqueta(canvas,'white') #Instancia la raqueta
pelota = Pelota(canvas, raqueta, puntuacion, 'red') #Instancia la pelota
#Muestra un texto al finalizar el juego
texto_fin_juego = canvas.create_text(300, 140, font=("Fixedsys",60), text='GAME OVER', state='hidden', fill='orange')
texto_fin_juego2 = canvas.create_text(300, 280, font=("Fixedsys",20), text='¡Gracias por jugar!', state='hidden', fill='orange')
texto_fin_juego3 = canvas.create_text(160, 15, font=("Fixedsys",15), text='Realizado por: Rafael Yuste', state='hidden', fill='white')
#Muestra un texto antes de empezar el juego
texto_inicio_juego = canvas.create_text(300, 165, font=("Fixedsys",20), text='PULSA CLICK IZQUIERDO', fill='orange')
texto_inicio_juego2 = canvas.create_text(300, 280, font=("Fixedsys",20), text='PARA COMENZAR', fill='orange')
#Loop main (administra el fujo del juego) -----------------------------------
while 1:
if pelota.golpea_fondo == False and raqueta.empezado == True:
pelota.dibujar() #Mueve la pelota
raqueta.dibujar() #Mueve la raqueta
#Detiene el juego
if pelota.golpea_fondo == True:
time.sleep(0.3)
canvas.itemconfig(texto_fin_juego, state='normal')
canvas.itemconfig(texto_fin_juego2, state='normal')
canvas.itemconfig(texto_fin_juego3, state='normal')
sonido_pierdes.play()
sys.exit(1)
#Redibuja la pantalla constantemente
tk.update_idletasks()
tk.update()
time.sleep(0.01) #Descansa entre cada bucle del loop una centésima de segundo
import random
import time
import pygame
from pygame.locals import *
pygame.init() #Inicializa pygame
tk = Tk() #Objeto de la clase tkinter
tk.title("Pong") #Titulo de la ventana
tk.resizable(0, 0) #Le da a la ventana un tamaño fijo
tk.wm_attributes("-topmost", 1) #La ventana siempre aparece por encima de cualquier otra
#Medidas de la ventana
canvas = Canvas(tk, width=600, height=450, bd=0, highlightthickness=0)
canvas.pack()
#Fondo del juego
filename = PhotoImage(file = "finduto.png")
canvas.create_image(0, 0, image = filename, anchor = NW)
tk.update() #Inicializa tkinter
#Sonidos del juego
sonido_pierdes = pygame.mixer.Sound("pacman_death.wav")
sonido_rebote = pygame.mixer.Sound("rebote.wav")
#Creando la Pelota --------------------------------------------------------
class Pelota:
def __init__(self, canvas, raqueta, puntuacion, color):
self.canvas = canvas #Variable del objeto canvas
self.raqueta = raqueta
self.puntuacion = puntuacion
#Creando la Pelota (borde superior izquierdo, borde inferior derecho)
self.id= canvas.create_oval(10, 10, 25, 25, fill=color)
#Mueve la pelota (posicion inicial en el canvas)
self.canvas.move(self.id, 290, 100)
empezar = [-3, -2, -1, 1, 2, 3] #Posiciones de la pelota en el canvas
random.shuffle(empezar) #Crea las posiciones aleatoriamente
self.x = empezar[0]
self.y = -3
self.canvas_height = self.canvas.winfo_height() # Nos dice el largo del canvas
self.canvas_width = self.canvas.winfo_width() # Nos dice el ancho del canvas
self.golpea_fondo = False #Si golpea el suelo la pelota deja de moverse
#Almacena las coordenadas de la pelota al golpear la raqueta
def golpea_raqueta(self, pos):
raqueta_pos = self.canvas.coords(self.raqueta.id)
if pos[2] >= raqueta_pos[0] and pos[0] <= raqueta_pos[2]:
if pos[3] >= raqueta_pos[1] and pos[3] <= raqueta_pos[3]:
self.x += self.raqueta.x
self.puntuacion.tanto() #Cuando la pelota toca la raqueta, suma un punto
return True
return False
#Crea el movimiento de la pelota
def dibujar(self):
self.canvas.move(self.id, self.x, self.y)
pos = self.canvas.coords(self.id) #Devuelve las coordenadas de la pelota
#Controla el rebote de la pelota dentro del canvas, el rebote
if pos[1] <= 0:
self.y = 2.5 #Velocidad de la pelota
if pos[3] >= self.canvas_height:
self.golpea_fondo = True #Si golpea el suelo, termina el juego
if self.golpea_raqueta(pos) == True: #Si golpea la raqueta, rebota
self.y = -2.5 #Velocidad de la pelota
if pos[0] <= 0:
self.x = 2.5 #Velocidad de la pelota
if pos[2] >= self.canvas_width:
self.x = -2.5 #Velocidad de la pelota
#Creando la raqueta ------------------------------------------------------
class Raqueta:
def __init__(self, canvas, color):
self.canvas = canvas
self.id= canvas.create_rectangle(0, 0, 100, 10, fill=color)
self.canvas.move(self.id, 260, 350) #Mueve la raqueta
self.x = 0
self.canvas_width = self.canvas.winfo_width()
self.empezado = False
#Hace posible mover el objeto raqueta con las teclas
self.canvas.bind_all('<KeyPress-Left>', self.ir_izq) #bibd_all() incluye una acción a ejecutar y un evento que la activa
self.canvas.bind_all('<KeyPress-Right>', self.ir_der)
#Inica el juego cuando hagamos click en el juego
self.canvas.bind_all('<Button-1>', self.empezar_juego)
#Crea el movimiento de la raqueta
def dibujar(self):
self.canvas.move(self.id, self.x, 0)
pos = self.canvas.coords(self.id)
if pos[0] == 0:
self.x = 0 #Detiene el movimiento de la raqueta al chocar con la pared izquierda
elif pos[0] < 0:
self.x = 2 #Velocidad de la raqueta al rebotar (a partir de 3 la raqueta rebota)
elif pos[2] == self.canvas_width:
self.x = 0 #Detiene el movimiento de la raqueta al chocar con la pared derecha
elif pos[2] > self.canvas_width:
self.x = -2 #Velocidad de la raqueta al rebotar (a partir de -3 la raqueta rebota)
#------------------------------------------------------------------------------
#Variables para usar las teclas para mover la raqueta
def ir_izq(self, evt):
self.x = -2
def ir_der(self, evt):
self.x = 2
#Variable para iniciar el juego con un click derecho del ratón
def empezar_juego(self, evt):
self.empezado = True
#Oculta el texto de inicio al comenzar el juego
canvas.itemconfig(texto_inicio_juego, state='hidden')
canvas.itemconfig(texto_inicio_juego2, state='hidden')
#Creando la puntuación -----------------------------------------------------
class Puntuacion:
def __init__(self, canvas, color):
self.puntuacion = 0
self.canvas = canvas
self.id = canvas.create_text(570, 25, font=("Fixedsys",30), text=self.puntuacion, fill=color)
def tanto(self):
self.puntuacion += 1
self.canvas.itemconfig(self.id, text=self.puntuacion)
sonido_rebote.play()
#---------------------------------------------------------------------------
puntuacion = Puntuacion(canvas, 'orange') #Instancia la puntuación
raqueta = Raqueta(canvas,'white') #Instancia la raqueta
pelota = Pelota(canvas, raqueta, puntuacion, 'red') #Instancia la pelota
#Muestra un texto al finalizar el juego
texto_fin_juego = canvas.create_text(300, 140, font=("Fixedsys",60), text='GAME OVER', state='hidden', fill='orange')
texto_fin_juego2 = canvas.create_text(300, 280, font=("Fixedsys",20), text='¡Gracias por jugar!', state='hidden', fill='orange')
texto_fin_juego3 = canvas.create_text(160, 15, font=("Fixedsys",15), text='Realizado por: Rafael Yuste', state='hidden', fill='white')
#Muestra un texto antes de empezar el juego
texto_inicio_juego = canvas.create_text(300, 165, font=("Fixedsys",20), text='PULSA CLICK IZQUIERDO', fill='orange')
texto_inicio_juego2 = canvas.create_text(300, 280, font=("Fixedsys",20), text='PARA COMENZAR', fill='orange')
#Loop main (administra el fujo del juego) -----------------------------------
while 1:
if pelota.golpea_fondo == False and raqueta.empezado == True:
pelota.dibujar() #Mueve la pelota
raqueta.dibujar() #Mueve la raqueta
#Detiene el juego
if pelota.golpea_fondo == True:
time.sleep(0.3)
canvas.itemconfig(texto_fin_juego, state='normal')
canvas.itemconfig(texto_fin_juego2, state='normal')
canvas.itemconfig(texto_fin_juego3, state='normal')
sonido_pierdes.play()
sys.exit(1)
#Redibuja la pantalla constantemente
tk.update_idletasks()
tk.update()
time.sleep(0.01) #Descansa entre cada bucle del loop una centésima de segundo
Y el juego quedaría tal que así:
1. Antes de iniciar el juego:
2. Jugando:
3. Al finalizar el juego:
PD: si queréis podéis sugerirme cualquier otra cosa que le pueda añadir, revisarme el código, etc.
"Vive alegre y a lo loco que lo bueno dura poco".
Dat Fixedsys font
Podrías subir el código y el resto de archivos a un repositorio git público para compartir el código, como por ejemplo en GitHub.
Podrías subir el código y el resto de archivos a un repositorio git público para compartir el código, como por ejemplo en GitHub.
Perro viejo de Habbo y de HabboStium. Y lo mismo en la vida real, pero sin el "perro".
Dat Fixedsys font
Podrías subir el código y el resto de archivos a un repositorio git público para compartir el código, como por ejemplo en GitHub.
Si, lo he pensado pero.... mehg! (ya me entiendes).
"Vive alegre y a lo loco que lo bueno dura poco".
Muy chulo! La verdad que la programación de juegos no me llama nada, pero tiene buena pinta.
Sí, yo lo subiría a Github y así tienes un portfolio que mostrar en el futuro!
Sí, yo lo subiría a Github y así tienes un portfolio que mostrar en el futuro!