public async override Task <PlayModel> Play(PlayLookupModel request, ServerCallContext context) { PlayModel output = new PlayModel(); // Obtemos o utilizador da base de dados com o ID de sessão, para depois obtermos o seu ID, se não existir é retornado o código // de erro para o cliente Models.User user = _context.User.FirstOrDefault(u => u.SessionID == request.SessionId); if (user == null) { output.Result = -1; return(await Task.FromResult(output)); } else if (user.GamesToPlay == 0) { output.Result = -2; return(await Task.FromResult(output)); } History h = _context.History.Include(i => i.User).FirstOrDefault(u => u.userId == user.Id); if (h == null) // No caso do utilizador nunca ter jogado, criamos uma linha na tabela de estatísticas para este { _context.Database.EnsureCreated(); h = new History { userId = user.Id, User = user }; _context.History.Add(h); _context.SaveChanges(); } // É gerada a jogada do servidor Random rnd = new Random(); int serverPlay = rnd.Next(1, 4); switch (request.Play) { case 1: // Pedra switch (serverPlay) { case 1: // Pedra output.ServerPlay = "Rock"; output.Result = 0; // Empate h.draw++; break; case 2: // Papel output.ServerPlay = "Paper"; output.Result = 2; // Servidor venceu h.lost++; break; case 3: // Tesoura output.ServerPlay = "Scissors"; output.Result = 1; // Utilizador venceu h.win++; string result = await APIServerCommunication.transactionFromServerToClient(user.Id, 1); if (!result.Contains("success")) { output.Result = -1; return(await Task.FromResult(output)); } break; default: break; } break; case 2: // Papel switch (serverPlay) { case 1: // Pedra output.ServerPlay = "Rock"; output.Result = 1; // Utilizador venceu h.win++; string result = await APIServerCommunication.transactionFromServerToClient(user.Id, 1); if (!result.Contains("success")) { output.Result = -1; return(await Task.FromResult(output)); } break; case 2: // Papel output.ServerPlay = "Paper"; output.Result = 0; // Empate h.draw++; break; case 3: // Tesoura output.ServerPlay = "Scissors"; output.Result = 2; // Servidor venceu h.lost++; break; default: break; } break; case 3: // Tesoura switch (serverPlay) { case 1: // Pedra output.ServerPlay = "Rock"; output.Result = 2; // Servidor venceu h.lost++; break; case 2: // Papel output.ServerPlay = "Paper"; output.Result = 1; // Utilizador venceu h.win++; string result = await APIServerCommunication.transactionFromServerToClient(user.Id, 1); if (!result.Contains("success")) { output.Result = -1; return(await Task.FromResult(output)); } break; case 3: // Tesoura output.ServerPlay = "Scissors"; output.Result = 0; // Empate h.draw++; break; default: break; } break; default: break; } user.GamesToPlay--; h.Games++; _context.SaveChanges(); return(await Task.FromResult(output)); }
static async Task Main(string[] args) { Boolean valido1 = false; String loginOuRegisto = ""; int userDBId = -1; while (!valido1) { Console.WriteLine("Antes de continuar, já tem conta ou não (Y/N)?\n"); loginOuRegisto = Console.ReadLine(); loginOuRegisto.ToUpper(); if ((loginOuRegisto.Equals("N") || loginOuRegisto.Equals("Y"))) { valido1 = true; } } String username, password, email, confirmacaoPassword; Boolean valido = false; loginOuRegisto.ToUpper(); while (!valido) { if (loginOuRegisto.Equals("Y")) { Console.WriteLine("\nUsername: "******"\nPassword: "******"https://localhost:5001"); var client = new User.UserClient(channel); var reply = await client.LoginAsync(clientRequest); valido = reply.Valid; // Caso a autenticação seja bem sucedida, o valor retornado é true. Quando o valor da variavel "valido" é true, a execução já não entrará novamente no ciclo while, passando para a nova fase. if (valido) { Console.WriteLine("\nEstás autenticado! "); userDBId = reply.UserId; } else { Console.WriteLine("\nNão estás autenticado! "); } } else if (loginOuRegisto.Equals("N")) { Console.WriteLine("\nUsername: "******"\nEmail: "); email = Console.ReadLine(); Console.WriteLine("\nPassword: "******"\nConfirmação da password: "******"\nO campo Pasword e o de confirmação de password não são iguais. Tente novamente."); continue; } // Verificar a existência destes valores na base de dados do servidor e registar o utilizador. var clientRequest = new UserRegistLookupModel { Username = username, Email = email, Password = password }; var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new User.UserClient(channel); var reply = await client.RegistAsync(clientRequest); valido = reply.Valid; // Caso o registo seja bem sucedida, o valor retornado é true. Quando o valor da variavel "valido" é true, a execução já não entrará novamente no ciclo while, passando para a nova fase. if (!valido) { Console.WriteLine("\nErro no registo! "); } else { valido = false; loginOuRegisto = "Y"; // Vai continuar no ciclo, mas desta vez para fazer a autenticação. } } } Console.WriteLine("Agora que está autenticado, vamos jogar!\n"); Console.WriteLine("Comandos possíveis:\n"); Console.WriteLine("\t -> play pedra: Jogada pedra;\n"); Console.WriteLine("\t -> play tesoura: jogada tesoura;\n"); Console.WriteLine("\t -> play papel: Jogada papel;\n"); Console.WriteLine("\t -> stats: Ver as suas estatísticas;\n"); Console.WriteLine("\t -> end: Finalizar o jogo;\n"); Console.WriteLine("\t -> help: Ver esta tabela novamente;\n"); bool validoJogo = true; while (validoJogo) { string input = Console.ReadLine(); var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new Game.GameClient(channel); if (input.Equals("play pedra")) { var clientRequest = new PlayLookupModel { UserId = userDBId, Play = 1 }; var reply = await client.PlayAsync(clientRequest); if (reply.Result == 1) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O cliente ganhou!\n\n"); } else if (reply.Result == 2) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O servidor ganhou!\n\n"); } else if (reply.Result == 0) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: Empate!\n\n"); } } else if (input.Equals("play papel")) { var clientRequest = new PlayLookupModel { UserId = userDBId, Play = 2 }; var reply = await client.PlayAsync(clientRequest); if (reply.Result == 1) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O cliente ganhou!\n\n"); } else if (reply.Result == 2) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O servidor ganhou!\n\n"); } else if (reply.Result == 0) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: Empate!\n\n"); } } else if (input.Equals("play tesoura")) { var clientRequest = new PlayLookupModel { UserId = userDBId, Play = 3 }; var reply = await client.PlayAsync(clientRequest); if (reply.Result == 1) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O cliente ganhou!\n\n"); } else if (reply.Result == 2) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O servidor ganhou!\n\n"); } else if (reply.Result == 0) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: Empate!\n\n"); } } else if (input.Equals("stats")) { if (userDBId != -1) { var clientRequest = new StatsLookupModel { UserId = userDBId }; var reply = await client.StatsAsync(clientRequest); Console.WriteLine("\nAs suas estatísticas:\n\t-> Jogos feitos: " + reply.GamesPlayed.ToString() + "\n\t->Ganhos: " + reply.Wins.ToString() + "\n\t->Perdidos: " + reply.Losts.ToString() + "\n\t->Empatados: " + reply.Draws.ToString() + "\n\n"); } } else if (input.Equals("end")) { // TODO: Fechar conexão com o gRPC validoJogo = false; } else if (input.Equals("help")) { Console.WriteLine("Comandos possíveis:\n"); Console.WriteLine("\t -> play rock: Jogada pedra;\n"); Console.WriteLine("\t -> play scissors: jogada tesoura;\n"); Console.WriteLine("\t -> play paper: Jogada papel;\n"); Console.WriteLine("\t -> stats: Ver as suas estatísicas;\n"); Console.WriteLine("\t -> end: Finalizar o jogo;\n"); Console.WriteLine("\t -> help: Ver esta tabela novamente;\n"); } else { Console.WriteLine("Comando inválido"); } } }
// Método usado para realizar uma jogada private async void Play(int play) { // Se o client estiver a null, significa que ocorreu algum erro, e é finalizada a conexão if (PlayClient == null) { Program.ConnectController.ConnectionError(); return; } try { PlayLookupModel playRequest = new PlayLookupModel { SessionId = Program.AuthUser.SessionID, Play = play }; var outcome = await PlayClient.PlayAsync(playRequest); if (outcome.Result == -2) { Program.PlayView.UnableToPlayDueToLackOfGames(); } Program.PlayView.ShowGameOutcome(outcome.Result, outcome.ServerPlay); } // No caso de a conexão falhar é apanhada a exceção respetiva, e é apresentada uma mensagem de erro na view catch (Grpc.Core.RpcException) { Program.PlayView.ResetAndHide(); Program.ConnectController.ConnectionError(); return; } catch (JsonException jsonEx) { Program.CreditBankMenurView.ShowMessageBox("Unable to play due to json parse exception:\n" + jsonEx + "\nPlayController: Play"); return; } catch (ArgumentNullException nullEx) { Program.CreditBankMenurView.ShowMessageBox("Unable to play due to null exception:\n" + nullEx + "\nPlayController: Play"); return; } catch (HttpRequestException httpEx) { Program.CreditBankMenurView.ShowMessageBox("Unable to play due to Http request exception:\n" + httpEx + "\nPlayController: Play"); return; } // Após ter sido feito o pedido para jogar, é feito o pedido para obter os stats do jogador, para serem mostrados // a medida que o utilizador vai jogando try { StatsLookupModel statsRequest = new StatsLookupModel { SessionId = Program.AuthUser.SessionID }; var outcome = await PlayClient.StatsAsync(statsRequest); Program.PlayView.ShowStats(outcome.GamesPlayed, outcome.Wins, outcome.Draws, outcome.Losts, outcome.GamesLeft); } // No caso de a conexão falhar catch (Grpc.Core.RpcException) { Program.PlayView.ResetAndHide(); Program.ConnectController.ConnectionError(); return; } }