Cuando creamos un juego, nos topamos con una curiosa problemática si mas de una persona decide jugarlo, y es con el guardar los puntajes.
Imaginemos un hipotético juego donde han logrado 1000 puntos, ¿Donde los guardamos?
- Código: Seleccionar todo
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import pygame
from pygame import *
def load_image(name, colorkey=False):
#crea una ruta a la carpeta de datos
#al escribirlo de esa forma, nos aseguramos
#de que pueda abrir en todos los S.O.
#donde este instalado python
fullname = os.path.join(name)
#comprobamos si existe la imagen
try:
image = pygame.image.load(fullname)
except pygame.error, message:
print 'No se puede cargar la imagen: ', fullname
raise SystemExit, message
#combierte la imagen para que pygame la pueda usar
image = image.convert()
#En este punto asignamos el colorkey
#es decir, un color de base al que se
#borrara dejando solo el canal alfa (transparencia)
if colorkey:
colorkey = image.get_at((0, 0))
image.set_colorkey(colorkey, RLEACCEL)
#devuelve la imagen y la recta de la imagen
return (image, image.get_rect())
"""Mira, el objeto con el que se remplaza el "ratón"..."""
class Mira(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
(self.image, self.rect) = load_image('mira.png', True)
def update(self):
posicion = pygame.mouse.get_pos()
self.rect.center = posicion
# Evita que la mira salga del rango permitido.
if self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > 450:
self.rect.right = 450
if self.rect.top <= 0:
self.rect.top = 0
elif self.rect.bottom >= 450:
self.rect.bottom = 450
""" Creamos una clase para el botton"""
class OKButton(pygame.sprite.Sprite):
def __init__(self, initialpos):
(self.initialx, self.initialy)=initialpos
pygame.sprite.Sprite.__init__(self)
(self.image, self.rect) = load_image('Ok.png', True)
def update(self):
posicion= self.initialx, self.initialy
self.rect.center = posicion
"""Clase para guardar"""
class SaveGame():
def __init__(self):
pass
""" Esta seción es una reutilización de código
def Abrir(self, nombre):
self.nombre = nombre
self.archivo = open((self.nombre), "r")
self.lectura = (self.archivo).readline()
self.diccionario = ast.literal_eval((self.lectura))
(self.archivo).close()
return self.diccionario
"""
def Guardar(self, nombre, diccionario):
self.nombre = nombre
self.diccionario = diccionario
self.texto = str(self.diccionario)
self.archivo = open((self.nombre), "w")
self.escribir = (self.archivo).write((self.texto))
(self.archivo).close()
print "Puntaje salvado"
def Info(self):
print """
Este es el modulo encargado de leer y guardar los archivos durante el juego,
"Abrir" se defie como nombre_clase.Abrir("nombredel.archivo")
"Guardar" se define como nombre_clase.Guardar("Nombre del archivo", diccionario_de_datos)
supongo que no tengo que decir que si se guardara otro tipo de dato seria...desastroso"""
class Escritura():
def __init__(self):
self.line = 0
self.strings = ['',]
#self.font = pygame.font.Font('dejavu.ttf', 12) #(*1)
self.font = pygame.font.Font(None, 28)
self.dist = 20
self.ipos_x = 50
self.ipos_y = 50
def update(self, events):
for event in events:
if event.type == KEYDOWN:
if event.key == K_RETURN:
self.strings.append('')
self.line += 1
print self.line
elif event.key == K_ESCAPE:
sys.exit()
elif event.key == K_BACKSPACE:
if self.strings[self.line] == '' and self.line > 0:
self.strings = self.strings[0:-1]
self.line -= 1
else:
self.strings[self.line] = self.strings[self.line][0:-1]
else:
self.strings[self.line] = str(self.strings[self.line] + event.unicode)
def draw(self, screen):
#print self.strings, self.line
screen.fill((0, 0, 0))
for line in range(len(self.strings)):
img_line = self.font.render(self.strings[line], 1, (255, 255, 255))
screen.blit(img_line, (self.ipos_x, self.ipos_y + self.dist * line))
def que_escribio(self):
return self.strings[0]#Esto es para salvar solo la primera linea del nombre
def main():
pygame.init()
screen = pygame.display.set_mode((450, 450))
pygame.display.set_caption("Guardar Puntos; Escribe tu nombre")
#pygame.mouse.set_visible(False)
sprites = pygame.sprite.RenderClear()
boton = OKButton((400,400))
pygame.init()
mira=Mira()
sprites.add(mira)
sprites.add(boton)
salvar = SaveGame()
escritura = Escritura()
salir = False
while salir == False:
events = pygame.event.get()
for event in events:
if event.type == QUIT:
salir = True
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
if pygame.sprite.collide_rect(mira, boton):
#Aqui es donde guardamos y salimos
salvar.Guardar("Arch.txt",{"Nombre":escritura.que_escribio(),"Puntaje" :1000})
salir = True
escritura.draw(screen)
sprites.draw(screen)
escritura.update(events)
display.update()
sprites.update()
pygame.display.flip()
if __name__ == '__main__':
main()
Bueno, lo que hace es escribir un archivo llamado Arch.txt una linea con
{"Nombre":Barajas,"Puntaje" :1000}
Se que esta muy "verde", pero creo que puede mejorarse.
Subo el archivo con todo y las imágenes que utilice.
Mi duda es:
¿Si puede mejorarse, como?
¿Hay forma de poder incluir la ñ?
¿Existe una mejor forma de mostrar los puntajes y guardarlos?
Si existe, ¿Cual es?
¿Dejare de hacer preguntas

Gracias de antemano

P.D. Utilice como base el código de endaramis en esta misma pagina=
viewtopic.php?t=353