def move(request): # Author: David Cabornero if request.method == 'POST': form = MoveForm(data=request.POST) # Comprobamos si el movimiento es válido en cuanto a rango de valores if form.is_valid(): move = form.save(commit=False) move.player = request.user # Comprobamos si hay un juego seleccionado try: pk = request.session[constants.GAME_SELECTED_SESSION_ID] game = Game.objects.get(pk=pk) except KeyError: return JsonResponse({'valid': 0, 'winner': None}) move.game = game # Comprobamos si el movimiento es completamente válido en cuanto # a modelo y lógica try: move.save() except ValidationError: return JsonResponse({'valid': 0, 'winner': None}) return JsonResponse({'valid': 1, 'winner': Game.finish(game)}) else: # Imprimimos los errores del formulario return JsonResponse({'valid': 0, 'winner': None}) # No debería ser posible acceder a esta función mediante un método distinto # de POST. En caso de que ocurra, hacemos como que no lo hemos visto else: return JsonResponse({'valid': 0, 'winner': None})
def test1(self): """ Situaciones en las que gana el ratón por pasar a los 4 gatos """ games = [] games.append(Game(cat_user=self.users[0], mouse_user=self.users[1], cat1=25, cat2=43, cat3=29, cat4=47, mouse=9, status=GameStatus.ACTIVE)) games.append(Game(cat_user=self.users[0], mouse_user=self.users[1], cat1=9, cat2=18, cat3=13, cat4=29, mouse=4, status=GameStatus.ACTIVE)) games.append(Game(cat_user=self.users[0], mouse_user=self.users[1], cat1=47, cat2=61, cat3=59, cat4=57, mouse=36, status=GameStatus.ACTIVE)) for game in games: game.full_clean() game.save() self.assertEqual(game.status, GameStatus.FINISHED) self.assertEqual(Game.finish(game), "mouse")
def test3(self): """ Situaciones en las que ganan los gatos\ (el ratón queda acorralado) """ games = [] games.append(Game(cat_user=self.users[0], mouse_user=self.users[1], cat1=48, cat2=50, cat3=20, cat4=36, mouse=57, status=GameStatus.ACTIVE)) games.append(Game(cat_user=self.users[0], mouse_user=self.users[1], cat1=25, cat2=41, cat3=36, cat4=52, mouse=32, status=GameStatus.ACTIVE)) games.append(Game(cat_user=self.users[0], mouse_user=self.users[1], cat1=27, cat2=29, cat3=43, cat4=45, mouse=36, status=GameStatus.ACTIVE)) for game in games: game.full_clean() game.save() self.assertEqual(game.status, GameStatus.FINISHED) self.assertEqual(Game.finish(game), "cat")
def test2(self): """ Situaciones en las que gana el ratón porque\ los gatos se quedan sin movimientos """ games = [] games.append(Game(cat_user=self.users[0], mouse_user=self.users[1], cat1=57, cat2=59, cat3=48, cat4=50, mouse=63, status=GameStatus.ACTIVE)) games.append(Game(cat_user=self.users[0], mouse_user=self.users[1], cat1=63, cat2=61, cat3=54, cat4=47, mouse=45, status=GameStatus.ACTIVE)) games.append(Game(cat_user=self.users[0], mouse_user=self.users[1], cat1=57, cat2=59, cat3=61, cat4=50, mouse=52, status=GameStatus.ACTIVE)) for game in games: game.full_clean() game.save() self.assertEqual(game.status, GameStatus.FINISHED) self.assertEqual(Game.finish(game), "mouse")
def current_move(request): # Author: David Cabornero # Si el método es POST, página de error if request.method != 'POST': return errorHTTP(request, "GET not allowed") # Obtenemos los movimientos del juego ordenados por fecha game_id = request.session[constants.GAME_SELECTED_SESSION_ID] moves = Move.objects.filter(game__id=game_id).order_by('-date') # Si la lista es vacía es que no ha habido ningún movimiento, devolvemos # un JSON que indica eso if len(list(moves)) == 0: ret_json = { 'origin': 0, 'target': 0, 'last_move': 'None', 'winner': 'None' } return JsonResponse(ret_json) # Obtenemos el último movimiento curr_move = list(moves)[0] # Miramos quien ha hecho el último movimiento if curr_move.game.cat_turn is True: last_player = 'mouse' else: last_player = 'cat' # Miramos si ha acabado la partida if curr_move.game.status == GameStatus.FINISHED: winner = Game.finish(curr_move.game) else: winner = 'None' # Devolvemos el JSON con la información para ser procesada por AJAX ret_json = { 'origin': curr_move.origin, 'target': curr_move.target, 'last_move': last_player, 'winner': winner } return JsonResponse(ret_json)