You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Bot.java 3.0KB

1 year ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.net.Socket;
  6. import java.net.InetSocketAddress;
  7. public abstract class Bot {
  8. // Ein Bot ist ein Programm, das sich mit einem Server verbindet und
  9. // mit diesem kommuniziert. Der Server sendet dem Bot eine Zeichenkette,
  10. // die das Spielfeld repräsentiert. Der Bot sendet dem Server ein Zeichen,
  11. // das die nächste Bewegung des Bots repräsentiert.
  12. private final String host; // Hostname oder IP-Adresse des Servers
  13. private final int port; // Port des Servers
  14. protected Bot(String[] args) {
  15. host = args.length > 0 ? args[0] : "localhost";
  16. port = args.length > 1 ? Integer.parseInt(args[1]) : 63187;
  17. }
  18. // Diese Methode stellt die Verbindung zum Server her und startet die
  19. // Kommunikation mit dem Server. Die Methode wird von der main-Methode
  20. // aufgerufen.
  21. protected void run() {
  22. try (Socket socket = new Socket()) {
  23. socket.connect(new InetSocketAddress(host, port));
  24. OutputStream out = socket.getOutputStream();
  25. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  26. View view = new View();
  27. while (true) {
  28. view.read(in);
  29. view.print();
  30. try {
  31. char ch = nextMove(view);
  32. out.write(ch);
  33. }
  34. catch (Exception e) { break; }
  35. }
  36. socket.close();
  37. } catch (IOException e) {
  38. System.err.println("Error: " + e.getMessage());
  39. }
  40. }
  41. // Diese Methode ermittelt den nächsten Zug des Bots. Sie wird von der
  42. // run-Methode aufgerufen, nachdem der Server das Spielfeld gesendet hat.
  43. // Subklassen müssen diese Methode implementieren.
  44. abstract protected char nextMove(View view) throws Exception;
  45. // Diese Klasse repräsentiert das Spielfeld. Sie wird von der run-Methode
  46. // verwendet, um das Spielfeld zu lesen und auszugeben.
  47. // Subklassen können diese Klasse verwenden, um das Spielfeld zu analysieren.
  48. public static class View {
  49. protected String data;
  50. protected int width;
  51. // Diese Methode liest das Spielfeld vom Server.
  52. private void read(BufferedReader in) throws IOException {
  53. StringBuilder sb = new StringBuilder();
  54. data = in.readLine();
  55. if (data == null) {
  56. return;
  57. }
  58. sb.append(data);
  59. width = data.length();
  60. for (int i = 1; i < width; ++i) {
  61. sb.append(in.readLine());
  62. }
  63. data = sb.toString();
  64. }
  65. // Diese Methode gibt das Spielfeld aus.
  66. protected void print() {
  67. if (data == null || width < 1) {
  68. return;
  69. }
  70. for (int i = 0, len = data.length(); i < len; i += width) {
  71. System.out.println(data.substring(i, i + width));
  72. }
  73. }
  74. }
  75. }