diff options
author | Hector Martinez <hectorsantacruz@hotmail.com> | 2013-01-27 02:01:02 (GMT) |
---|---|---|
committer | Hector Martinez <hectorsantacruz@hotmail.com> | 2013-01-27 02:01:02 (GMT) |
commit | d1dcb38b682fee6395efe4b65c2bd278d2b8bfe5 (patch) | |
tree | fa2a204e033cf3eefc791710d0fca7ee2aa49b14 | |
parent | 1ddd8bf98b0b2fb123dbf6f64c710cd4289f90c5 (diff) |
Implementacion de calculo correcto de puntaje
-rw-r--r-- | activity.py | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/activity.py b/activity.py index 53d5555..478148d 100644 --- a/activity.py +++ b/activity.py @@ -39,6 +39,8 @@ DELAY = 5 DELTA = 1 WIDTH = 453 HEIGHT = 453 +#Array que contiene los puntajes asignados a los sectores de la diana de fondo +POINTS_ARRAY = [6, 13, 4, 18, 1, 20, 5, 12, 9, 14, 11, 8, 16, 7, 19, 3, 17, 2, 15, 10, 6] class LanzarActivity(activity.Activity): """LanzarActivity class as specified in activity.info""" @@ -143,7 +145,6 @@ class LanzarActivity(activity.Activity): def __expose_cb(self, drawing_area, data=None): x, y, width, height = data.area - context = drawing_area.get_style().fg_gc[gtk.STATE_NORMAL] canvas = drawing_area.window @@ -169,7 +170,7 @@ class LanzarActivity(activity.Activity): #Utilizado para dibujar objetos en el pixmap cr = self.pixmap.cairo_create() - # Dibujar una linea vertical cuya altura ocupe toda la pantalla y sea de + # Dibujar una linea que ocupe toda la pantalla y sea de # color blanco para contrastarlo con la diana cr.set_source_rgb(255, 255, 255) @@ -240,8 +241,6 @@ class LanzarActivity(activity.Activity): self._selected_y = self._y gobject.timeout_add(DELAY, self.__draw_dart, drawing_area) else: - # TO-DO: Calcular el puntaje de acuerdo a _selected_x y _selected_y - # TO-DO: Mostrar el puntaje self.restart_game(drawing_area) def __draw_dart(self, drawing_area): @@ -258,8 +257,8 @@ class LanzarActivity(activity.Activity): self.draw_background(drawing_area) self.draw_line(drawing_area, "HORIZONTAL", self._selected_y) self.draw_line(drawing_area, "VERTICAL", self._selected_x) -# self.pixmap.draw_pixbuf(None, self.dart_pixbuf, 0, 0, x, y, -1, -1, -# gtk.gdk.RGB_DITHER_NONE, 0, 0) + self.pixmap.draw_pixbuf(None, self.dart_pixbuf, 0, 0, x, y, -1, -1, + gtk.gdk.RGB_DITHER_NONE, 0, 0) def restart_game(self, drawing_area): self._x = self._y = 0 @@ -274,37 +273,55 @@ class LanzarActivity(activity.Activity): score = 0 distance = 0 rho = 0 + option_index = 0 #Variables dependientes de la imagen de fondo (dartboard.png) center_x = 226 center_y = 227 radius_bullseye = 7 radius_bull = 16 - radius_dartboard = 170 + radius_begin_triple = 98 + radius_end_triple = 107 + radius_begin_double = 161 + radius_end_double = 170 #Calculo de la distancia euclidea del punto "seleccionado" respecto al centro distance = math.sqrt(math.pow(abs(x - center_x),2) + math.pow(abs(y - center_y),2)) - #Intento de cambiar coordenadas cartesianas a coordenadas polares + #Transformar x e y para que origen de coordenadas esten en el centro del bullseye displaced_x = x - center_x displaced_y = center_y - y -# rho = math.atan((displaced_y / displaced_x)) - #Version inicial de calculo de puntaje de acuerdo a distancia al centro + #Obtener el angulo respecto al eje de las abscisas + rho = math.degrees(math.atan2(displaced_y, displaced_x)) + if rho < 0: + rho = 360 + rho + + #Obtener indice de sector (que tiene asignado un puntaje en el tablero) + #Existen 20 puntajes posibles, en un circulo de 360 grados, por lo que + #cada puntaje "ocupa" 360/20=18 grados, y los sectores de puntajes estan + #desplazados 9 grados, por lo que matematicamente se puede hallarlo + #segun la ecuacion que sigue + point_index = int(math.floor(((rho - 9) / 18) + 1)) + + #Calculo exacto de puntaje de acuerdo a reglas de juego de dardos + score = POINTS_ARRAY[point_index] if distance < radius_bullseye: - score = 10000 - distance * 10 + score = 50 elif distance < radius_bull: - score = 7500 - distance * 20 - elif distance < radius_dartboard: - score = 5100 - distance * 30 - else: + score = 25 + elif distance >= radius_begin_triple and distance <= radius_end_triple: + score = score * 3 + elif distance >= radius_begin_double and distance <= radius_end_double: + score = score * 2 + elif distance > radius_end_double: score = 0 #Impresiones para depurar valores utiles en el calculo de puntaje logging.debug("X: " + str(x) + " Y: " + str(y)) logging.debug("__X: " + str(displaced_x) + " __Y: " + str(displaced_y)) logging.debug("DISTANCE: "+str(distance) + " RHO: "+str(rho)) - logging.debug("SCORE: "+str(int(score))) + logging.debug("SCORE: "+str(int(score))+" SCORE2: "+str(POINTS_ARRAY[point_index])) return int(score) |