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

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