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.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 implements Runnable {
  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. public 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. print(view);
  30. try {
  31. char ch = nextMove(view);
  32. out.write(ch);
  33. }
  34. catch (Exception e) { break; }
  35. }
  36. } catch (IOException e) {
  37. System.err.println("Error: " + e.getMessage());
  38. }
  39. }
  40. protected void print(View view) {
  41. view.print();
  42. System.out.println();
  43. }
  44. // Diese Methode ermittelt den nächsten Zug des Bots. Sie wird von der
  45. // run-Methode aufgerufen, nachdem der Server das Spielfeld gesendet hat.
  46. // Subklassen müssen diese Methode implementieren.
  47. abstract protected char nextMove(View view) throws Exception;
  48. // Diese Klasse repräsentiert das Spielfeld. Sie wird von der run-Methode
  49. // verwendet, um das Spielfeld zu lesen und auszugeben.
  50. // Subklassen können diese Klasse verwenden, um das Spielfeld zu analysieren.
  51. public static class View {
  52. protected String data;
  53. protected int width;
  54. // Diese Methode liest das Spielfeld vom Server.
  55. private void read(BufferedReader in) throws IOException {
  56. StringBuilder sb = new StringBuilder();
  57. data = in.readLine();
  58. if (data == null) {
  59. return;
  60. }
  61. sb.append(data);
  62. width = data.length();
  63. for (int i = 1; i < width; ++i) {
  64. sb.append(in.readLine());
  65. }
  66. data = sb.toString();
  67. }
  68. // Diese Methode gibt das Spielfeld aus.
  69. protected void print() {
  70. if (data == null || width < 1) {
  71. return;
  72. }
  73. for (int i = 0, len = data.length(); i < len; i += width) {
  74. System.out.println(data.substring(i, i + width));
  75. }
  76. }
  77. }
  78. }