Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

ArServer.cs 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System;
  2. using Microsoft.Extensions.Options;
  3. using System.IO.Pipes;
  4. using System.Threading;
  5. using uqac_ia_aspirobot.Extensions;
  6. using uqac_ia_aspirobot.Interfaces;
  7. namespace uqac_ia_aspirobot.Common
  8. {
  9. public class ArServer
  10. {
  11. private readonly IEnvironment _environment;
  12. public enum ArCommands
  13. {
  14. EnvGetWidth,
  15. EnvGetHeight,
  16. RoomGetState,
  17. RoomRemoveDust,
  18. RoomRemoveJewel
  19. }
  20. private readonly ArConfig _options;
  21. private Thread[] _servers;
  22. public ArServer(IOptions<ArConfig> options, IEnvironment environment)
  23. {
  24. _environment = environment;
  25. _options = options.Value;
  26. }
  27. public void Setup()
  28. {
  29. _servers = new Thread[_options.ServerThreadCount];
  30. for (var i = 0; i < _servers.Length; i++)
  31. {
  32. _servers[i] = new Thread(ServerThread)
  33. {
  34. Name = $"ArServer-{i}"
  35. };
  36. _servers[i].Start();
  37. }
  38. }
  39. private void ServerThread()
  40. {
  41. var server = new NamedPipeServerStream(_options.PipeName, PipeDirection.InOut, _servers.Length);
  42. server.WaitForConnection();
  43. var stream = new ArStreamString(server);
  44. while (true)
  45. {
  46. var command = stream.ReadEnum<ArCommands>();
  47. if (command == ArCommands.EnvGetWidth)
  48. {
  49. stream.Write(_environment.GetWidth());
  50. }
  51. else if (command == ArCommands.EnvGetHeight)
  52. {
  53. stream.Write(_environment.GetHeight());
  54. }
  55. else if (command == ArCommands.RoomGetState)
  56. {
  57. var x = stream.ReadInt();
  58. var y = stream.ReadInt();
  59. stream.Write(_environment.GetRoomState(x, y));
  60. }
  61. else if (command == ArCommands.RoomRemoveDust)
  62. {
  63. var x = stream.ReadInt();
  64. var y = stream.ReadInt();
  65. _environment.GetRoom(x, y).RemoveDust();
  66. }
  67. else if (command == ArCommands.RoomRemoveJewel)
  68. {
  69. var x = stream.ReadInt();
  70. var y = stream.ReadInt();
  71. _environment.GetRoom(x, y).RemoveJewel();
  72. }
  73. }
  74. }
  75. }
  76. }