Add computer player interaction in PveController
A new section for adding a computer player has been implemented in PveController. This enhancement includes creating a challenge, letting the computer accept the challenge, and allowing the computer to respond to the player's move. Additionally, the delay for the UI update has been increased and a redirect to the game page is included.
This commit is contained in:
@@ -19,7 +19,11 @@ public class PveController(
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<IActionResult> New(Guid playerId)
|
public async Task<IActionResult> New(Guid playerId)
|
||||||
{
|
{
|
||||||
|
// Add a computer player
|
||||||
var computerId = Guid.NewGuid();
|
var computerId = Guid.NewGuid();
|
||||||
|
database.GetOrAddPlayer(computerId).NickName = "Computer";
|
||||||
|
|
||||||
|
// Create a challenge
|
||||||
var player = database.GetOrAddPlayer(playerId);
|
var player = database.GetOrAddPlayer(playerId);
|
||||||
var challenge = new Challenge(
|
var challenge = new Challenge(
|
||||||
creator: player,
|
creator: player,
|
||||||
@@ -29,9 +33,14 @@ public class PveController(
|
|||||||
permission: ChallengePermission.Public);
|
permission: ChallengePermission.Public);
|
||||||
var challengeId = counter.GetUniqueNo();
|
var challengeId = counter.GetUniqueNo();
|
||||||
database.CreateChallenge(challengeId, challenge);
|
database.CreateChallenge(challengeId, challenge);
|
||||||
database.GetOrAddPlayer(computerId).NickName = "Computer";
|
|
||||||
|
// Let the computer accept the challenge
|
||||||
await database.PatchChallengeAsAcceptedAsync(challengeId, computerId);
|
await database.PatchChallengeAsAcceptedAsync(challengeId, computerId);
|
||||||
|
|
||||||
|
// Get the accepted challenge
|
||||||
var acceptedChallenge = database.GetAcceptedChallenge(challengeId);
|
var acceptedChallenge = database.GetAcceptedChallenge(challengeId);
|
||||||
|
|
||||||
|
// Let computer respond to the player's move
|
||||||
await Task.Factory.StartNew(async () =>
|
await Task.Factory.StartNew(async () =>
|
||||||
{
|
{
|
||||||
ISubscription? subscription = null;
|
ISubscription? subscription = null;
|
||||||
@@ -43,9 +52,11 @@ public class PveController(
|
|||||||
var client = await webSocketEndpoint.ConnectAsWebSocketServer();
|
var client = await webSocketEndpoint.ConnectAsWebSocketServer();
|
||||||
subscription = client.Subscribe(async fen =>
|
subscription = client.Subscribe(async fen =>
|
||||||
{
|
{
|
||||||
|
// When fen changes, it means someone has made a move. If it's the computer's turn, let the computer respond.
|
||||||
if (acceptedChallenge?.GetTurnPlayer().Id == computerId)
|
if (acceptedChallenge?.GetTurnPlayer().Id == computerId)
|
||||||
{
|
{
|
||||||
await Task.Delay(200);
|
// Wait for the UI to update
|
||||||
|
await Task.Delay(300);
|
||||||
var bestMove = engine.GetBestMove(fen);
|
var bestMove = engine.GetBestMove(fen);
|
||||||
await client.Send(bestMove);
|
await client.Send(bestMove);
|
||||||
}
|
}
|
||||||
@@ -58,6 +69,7 @@ public class PveController(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Redirect to the game page
|
||||||
return RedirectToAction(nameof(GamesController.GetHtml), "Games", new { id = challengeId });
|
return RedirectToAction(nameof(GamesController.GetHtml), "Games", new { id = challengeId });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,7 @@ public class Startup : IWebStartup
|
|||||||
{
|
{
|
||||||
services.AddLibraryDependencies();
|
services.AddLibraryDependencies();
|
||||||
|
|
||||||
services.AddSingleton<ChessEngine>();
|
services.AddTransient<ChessEngine>();
|
||||||
|
|
||||||
services
|
services
|
||||||
.AddControllersWithViews()
|
.AddControllersWithViews()
|
||||||
|
|||||||
Reference in New Issue
Block a user