Die Dojo - Bot Hilfe

 Benötigst du Hilfe?

Du möchtest am Dojo-Bot teilnehmen, hast aber keine Ahnung wie oder womit du beginnen sollst? Hier wird dir geholfen!

 Eine Verbindung in JavaScript

Um mit JavaScript auf unseren Service zugreifen zu können gibt es mehrere Möglichkeiten, die einfachste ist mithilfe von XMLHttpRequest. Eine weitere Möglichkeit wäre die Fetch Funktion.

In diesem konkreten Beispiel wird auf den XMLHttpRequest näher eingegangen und dieser als Client für Anfragen an einen Server verwendet. Hier siehst du, wie du ein Spiel über einen AJAX-Aufruf startet kannst. Dieser AJAX-Aufruf wird danach mit einem Callback bearbeitet und auf das Ergebnis des Requests reagiert.


var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var json = JSON.parse(this.responseText);
      console.log(json);
    }
  };
  xhttp.open("POST", "https://game-dd.countit.at/api/game/{key}/create", true);
  xhttp.send();

Um den Spielstatus abzufragen ist ein GET Request notwendig.


var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var json = JSON.parse(this.responseText);
      if(json.running) {
        console.log("We found a running game using your api-key");
      }
    }
  };
  xhttp.open("GET", "https://game-dd.countit.at/api/game/{key}/status", true);
  xhttp.send();

Das Spiel wird geschlossen indem du den folgenden Code-Schnippsel ausführst.


var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var json = JSON.parse(this.responseText);
      if(!json.running) {
         console.log("your current game has been closed");
      }
    }
  };
  xhttp.open("POST", "https://game-dd.countit.at/api/game/{key}/close", true);
  xhttp.send();

Um mit deinem Avatar zu interagieren wird meist die POST Methode verwendet. In folgendem Code wird erklärt wie man mit der Hilfe von JavaScript seinen Spieler einen Block nach Osten laufen lassen kann.


var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var json = JSON.parse(this.responseText);
      if(json.move) {
        if(json.executed) {
            console.log("Your avatar has been moved");
        }else{
            console.log("You still have a cooldown on the move action");
        }
      }else{
         console.log("Your avatar is facing a wall");
      }
    }
  };
  xhttp.open("POST", "https://game-dd.countit.at/api/player/{key}/move/1", true);
  xhttp.send();

Hier noch zur Verdeutlichung ein Code-Snippet, um dieses auszuführen musst du zuerst noch deinen API - Key eingeben. Das Skript versucht ein neues Spiel zu starten, ist dies nicht möglich, läuft bereits ein Spiel und eine Nachricht wird ausgegeben. Danach läuft der Spieler einen Block nach Westen.


var xhttp = new XMLHttpRequest();
var baseurl = "https://game-dd.countit.at/api/"
var apikey = "";

function get(url, callback) {
  request("GET", url, callback);
}

function post(url, callback) {
  request("POST", url, callback);
}

function request(method, url, callback) {
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        var json = JSON.parse(this.responseText);
        if(json) {
          callback(json);
        }
      }
    };
  xhttp.open(method, (baseurl + url).replace("{key}", apikey), true);
  xhttp.send();  
}

function start() {
  post("game/{key}/create", function(json) {
    if(json.running) {
      //game started
    }
  });
}

function close() {
  post("game/{key}/close", function(json) {
    if(!json.running) {
      //game stoped
    }
  });
}

function status() {
  get("game/{key}/status", function(json) {
    if(json.running) {
      //game is still running
    }
  });
}

function move(direction) {
  post(("player/{key}/move/" + direction), function(json) {
    if(json.move) {
      if(json.executed) {
        //moved
      }else{
        //still cooldown
      }
    }else{
      if(json.error) {
        //error
      }else{
        //avatar facing a wall
      }
    }
  });
}

/***Execute***/
start();

move(1);

close();
       
       

 Eine Verbindung in Java

Java bietet wie JavaScript eine große Variation an Möglichkeiten, um einen GET oder POST Request an einen Server zu senden. Hier findest du die gängigsten Lösungen für diese Aufgabe.
Für dieses Java Beispiel wird die Library Json.org verwendet, falls es Probleme bei der Installation/Einbindung dieser Library gibt, kannst du dir hier Hilfe holen.

Ein Spiel wird mit der Hilfe von einem POST - Request gestartet, Rückgabewerte kannst du hier finden.

JSONObject json = http.request("https://game-dd.countit.at/api/game/{key}/create", "POST");

Um einen Spieler zu bewegen ist ein POST - Request notwendig, in diesem Fall läuft der Spieler einen Block nach rechts.

JSONObject json = http.request("https://game-dd.countit.at/api/player/{key}/move/1", "POST");

Unten findest du den gesamten Code welcher notwendig ist um einen Request zu senden, dies ist nur ein Beispiel. Es gibt möglicherweise bessere Wege um dies zu realisieren, jedoch möchten wir dir mit diesem Code Schnippsel eine Starthilfe geben.

package com.overwatch;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.URL;

public class Main {

    public static void main(String[] args) throws Exception {

        Main http = new Main();

        JSONObject json = http.request("https://game-dd.countit.at/api/game/{key}/status", "GET");

        if (json.get("running") != null && (boolean) json.get("running")) {
            System.out.println("Game is running");
        } else {
            json = http.request("https://game-dd.countit.at/api/game/{key}/create", "POST");
            if(json.get("running") != null && (boolean) json.get("running")) {
                System.out.println("Game has been created");
            }else{
                System.out.println("There was an error creating a new game");
            }
        }
    }

    public JSONObject request(String url, String method) throws Exception {
        URL obj = new URL(url);
        sun.net.www.protocol.http.HttpURLConnection con = (sun.net.www.protocol.http.HttpURLConnection) obj.openConnection();
        con.setRequestMethod(method);
        con.setDoOutput(true);

        if(method.equalsIgnoreCase("POST")) {
            DataOutputStream wr = new DataOutputStream(con.getOutputStream());
            wr.flush();
            wr.close();
        }
        if(con.getResponseCode() == 200) {
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();
            while ((inputLine = in.readLine()) != null)
                response.append(inputLine);
            in.close();
            return new JSONObject(response.toString());
        }else
            return null;
    }
}

 Eine Verbindung in .NET

In C# gibt es eine bereits vorgefertigte Klasse mit welcher man ganz einfach Post und Get Requests an eine bestimmte URL oder Server senden kann, nämlich die WebClient Klasse. Hier findest du ein Beispiel für die richtige Verwendung und nützliche Informationen.

Alle genauen Rückgabewerte sind hier aufgelistet.

Das folgende Beispiel basiert auf der WebClient Klasse in Kombination mit einem Json Parser.

Mit diesen einfache 2 Zeilen wird ein Spiel gestartet. Um auf bestimmte Fälle oder Werte zu reagieren bitte hier nachsehen.

WebClient client = new WebClient();
JObject jobj = JObject.Parse(client.UploadString("https://game-dd.countit.at/api/game/{KEY}/create", ""));

Um Resourcen zu sparen ist es sinnvoll nicht für jeden Aufruf eine neue Instanz von WebClient zu erzeugen, versuche wenn möglich, immer die selbe Instanz zu nutzen.

Wie kann ich wissen ob ein Spiel mit meinem API - Key gerade läuft?

JObject jobj = JObject.Parse(client.DownloadString("https://game-dd.countit.at/api/game/{KEY}/status"));
if (jobj["running"] != null && (bool)jobj["running"] == true)
 {
    //GAME IS RUNNING
 }

Um ein Spiel zu schließen, sind genau wie beim Starten eines Spiels nur wenige Zeilen Code notwendig:

JObject jobj = JObject.Parse(client.UploadString("https://game-dd.countit.at/api/game/{KEY}/close", ""));

Möchtest du mit deinem Avatar Aktionen ausführen und auf diese reagieren?

JObject jobj = JObject.Parse(client.UploadString("https://game-dd.countit.at/api/player/{KEY}/move/{direction}", ""));
if (jobj["move"] != null && (bool)jobj["move"] == true)
 {
    //YOUR AVATAR MOVED
 }

Hier noch zur Verdeutlichung ein Code-Snippet, um dieses auszuführen musst du zuerst noch deinen API - Key eingeben. Das Programm versucht ein neues Spiel zu starten, ist dies nicht möglich, läuft bereits ein Spiel und eine Nachricht wird ausgegeben. Danach läuft der Spieler einen Block nach Westen.

UploadString wird für POST Requests verwendet und DownloadString für GET Requests.

using Newtonsoft.Json.Linq;
using System;
using System.Net;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            WebClient client = new WebClient();

            string key = "XXXXXXXXXXXXXXX";

            JObject jobj = JObject.Parse(client.UploadString("https://game-dd.countit.at/api/game/" + key + "/create", ""));

            if(jobj["running"] != null && (bool)jobj["running"] == true)
            {
                Console.WriteLine("There is already a running game, close it or continue playing.");
            }

            //Direction = 1 (West)
            jobj = JObject.Parse(client.UploadString("https://game-dd.countit.at/api/player/" + key + "/move/1", ""));

            if(jobj["move"] != null && (bool)jobj["executed"] == true)
            {
                if((bool)jobj["move"] == true)
                {
                    //The avatar moved
                }
                else
                {
                    //You can't move in this direction because of the map's border
                }
            }
            else
            {
                if((bool)jobj["executed"] == false)
                {
                    //You can't move now because of the cooldown
                }
            }


            //At the end the game is being closed
            jobj = JObject.Parse(client.UploadString("https://game-dd.countit.at/api/game/" + key + "/close", ""));
        }
    }
}

 Genutzte Technologien

Hier werden einige der verwendeten Technologien aufgezählt und Fachbegriffe erklärt.

 Was ist JSON?

JSON bietet einen einfachen Standard für die strukturierte Kodierung von Daten in Form von menschenlesbarem Text. Dies bietet Vorteile bei einer automatisierten Weiterverarbeitung, macht sie aber auch einer manuellen Inspektion und Überarbeitung besser zugänglich. Hier findest du weitere Informationen zum Thema JSON.

 Was ist eine REST API?

REST steht für Representational State Transfer, API für Application Programming Interface. Gemeint ist damit ein Programmierschnittstelle, die sich an den Paradigmen und Verhalten des World Wide Web (WWW) orientiert und einen Ansatz für die Kommunikation zwischen Client und Server in Netzwerken beschreibt. Weitere Details gibt es hier ...

 Was ist ein Bot?

Bots sind ebenfalls Avatare wie dein Spieler jedoch werden diese nicht von einem Menschen oder einem von Menschendhand erschaffenen Algorithmus gesteuert sondern vom Computer.

 Häufige Fehler

Hier sind mehrere Fehler mit ihren Lösungen aufgelistet welche beim Implementieren eines Spielers auftreten können.

  404 Page Not Found

Wenn du beim Aufrufen eines Befehls einen 404 Fehler erhältst, liegt das meistens an der Verwendung des falschen Request - Types. Das bedeutet, es wird z.B. GET verwendet obwohl der Befehl vom Type POST ist.

  500 Bad Request

Der Statuscode 500 wird zurückgeliefert, wenn wir intern auf ein Problem stoßen, welches von deinem Request ausging. Du erhältst diese Fehlermeldung, wenn du nicht berechtigt bist diesen bestimmten Request auszuführen oder dein API - Schlüssel nicht verfügbar ist. 

  Fehler beim Erstellen eines Spiels

Falls das Erstellen eines Spiels nicht möglich ist, liegt es entweder daran, dass die maximale Anzahl an Spielinstanzen erreicht ist oder ein falscher API - Key verwendet wird. Falls bereits ein Spiel mit deinem Schlüssel läuft, kannst du auch kein neues Spiel erstellen - du musst zuerst das alte Spiel schließen.

  Aktion kann nicht ausgeführt werden

Ist gibt mehrere Möglichkeiten, warum eine Aktion nicht ausgeführt werden kann. Die häufigste ist jedoch, dass du bestimmte Aktionen nur in bestimmten Zeitabständen ausführen darfst. Ein anderer Grund kann sein, dass beim Move der Spieler am Rand des Spielfelds steht und deswegen nicht weiter in diese Richtung laufen darf.

 Gib uns Feedback

Stehst du vor einem Problem auf Digital Dojo, möchtest deine Anregungen mitteilen oder uns erzählen, was dir auf der Seite gefällt? Dann lass es uns wissen und schreib uns ein kurzes Feedback! Hast du einen Fehler gefunden, welche du gerne melden würdest, eine Anregung welche Features wir als nächstes implementieren sollten oder einfach nur ein Lob auszusprechen? Hier bist du richtig!