Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHector Martinez <hectorsantacruz@hotmail.com>2013-01-27 02:01:02 (GMT)
committer Hector Martinez <hectorsantacruz@hotmail.com>2013-01-27 02:01:02 (GMT)
commitd1dcb38b682fee6395efe4b65c2bd278d2b8bfe5 (patch)
treefa2a204e033cf3eefc791710d0fca7ee2aa49b14
parent1ddd8bf98b0b2fb123dbf6f64c710cd4289f90c5 (diff)
Implementacion de calculo correcto de puntaje
-rw-r--r--activity.py49
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)