Tipps und Tricks für das Dojo Game gesucht?


Du möchtest am Dojo Game teilnehmen, jedoch hast du noch technische Fragen?

Hier findest du Tipps und Tricks, die dir bestimmt weiterhelfen!

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();
text/x-csharp

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();
text/x-csharp

Das Spiel wird geschlossen indem du den folgenden Code-Schnipsel 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();
text/x-csharp

Um mit deinem Ritter zu interagieren wird meist die POST Methode verwendet. In folgendem Code wird erklärt wie man mit der Hilfe von JavaScript seinen Ritter 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();
text/x-csharp

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 dein Ritter 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();
text/x-csharp

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");
text/x-csharp

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

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

Unten findest du den gesamten Code, der notwendig ist, um einen Request zu senden. Dies dient nur als Beispiel. Es gibt möglicherweise bessere Wege um dies zu realisieren. Mit diesem Code-Snippet möchten wir dir 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; } }
text/x-csharp

Eine Verbindung in .NET

In C# gibt es eine bereits vorgefertigte Klasse mit der 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 2 einfachen Zeilen wird ein Spiel gestartet:

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

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 erfahre ich, 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 }
text/x-csharp

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", ""));
text/x-csharp

Möchtest du mit deinem Ritter 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 }
text/x-csharp

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, so läuft bereits ein Spiel und eine Nachricht wird ausgegeben. Danach läuft der Ritter 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", "")); } } }
text/x-csharp

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, beim Implementieren von Spieler*innen 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-Typs. Das bedeutet, es wird z.B. GET verwendet obwohl der Befehl vom Typ POST ist.

500 Bad Request

Der Statuscode 500 wird zurück geliefert, 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-Key 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. Läuft bereits ein Spiel mit deinem Schlüssel, kannst du auch kein neues Spiel erstellen - du musst zuerst das alte Spiel schließen.

Aktion kann nicht ausgeführt werden

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

Bist du bereit?

Beweise dich im Dojo Game und setz dich an die Spitze des Leaderboards!

Besiege unseren Bot
Dojo - virtueller Übungsraum

Löse die Dojo-Aufgaben und werde Programmier-Profi!

Gib uns Feedback!

Wir kümmern uns um deine Fragen, versuchen deine Wünsche zu erfüllen und freuen uns über Anregungen.

Ultimative Coding-Roadmap

Unsere Roadmap weist dir den Weg zum Coding-Profi!

Über Digital Dojo

Das Digital Dojo ist der virtuelle Übungsraum von COUNT IT.

Angehende Programmierer*innen, Code-Neulinge, Wiedereinsteiger*innen und Fortgeschrittene finden hier das nötige Rüstzeug für ihre Karriere.

Du möchtest deine Lehre bei COUNT IT starten? Dann bist du hier richtig - besiege deine Gegner im Dojo Game und sichere dir deine Lehrstelle!

Inspire your career.

Newsletter abonnieren

Der COUNT IT Newsletter liefert viermal jährlich interessante Neuigkeiten über das Unternehmen. Gleich anfordern!