public async Task CreateMovements(LogicBase ai) { try { using (var call = _client.CreateMovements()) { await call.RequestStream.WriteAsync(Mapping.ToGrpc(ai.CreateMove())); // Continuos bidirectional streaming var responseReaderTask = Task.Run((Func <Task>)(async() => { while (await call.ResponseStream.MoveNext(CancellationToken.None)) { var opponentMove = call.ResponseStream.Current; Logger.Log($"Received opponent move: {opponentMove.StartPosition} to {opponentMove.EndPosition}"); // Analyze opponent move ai.ReceiveMove(Mapping.ToCommon(opponentMove)); // Create own move await call.RequestStream.WriteAsync(Mapping.ToGrpc(ai.CreateMove())); } })); await responseReaderTask; await call.RequestStream.CompleteAsync(); } } catch (RpcException e) { Logger.Log(e.ToString()); } }
public async Task CreateMovements(LogicBase ai) { try { using (var call = _client.Act()) { await call.RequestStream.WriteAsync(Mapping.ToGrpc(ai.CreateMove())); // Continuos bidirectional streaming var responseReaderTask = Task.Run((Func <Task>)(async() => { while (await call.ResponseStream.MoveNext(CancellationToken.None)) { var opponentMove = call.ResponseStream.Current; if (opponentMove == null || opponentMove.Chess == null) { // Error or game end return; } else if (opponentMove.Chess.CheckMate) { // TODO should we trust this // TODO for now CheckMate also used to sign any game ending and errors return; } Logger.Log($"Received opponent move: {opponentMove.Chess.StartPosition} to {opponentMove.Chess.EndPosition}"); // Analyze opponent move ai.ReceiveMove(Mapping.ToCommon(opponentMove)); // Create own move await call.RequestStream.WriteAsync(Mapping.ToGrpc(ai.CreateMove())); } })); await responseReaderTask; await call.RequestStream.CompleteAsync(); } } catch (RpcException e) { Logger.Log($"DEBUG: {e.ToString()}"); throw new GameEndedException(e); } }