Skip to content

Dokumentation Jonathan Schwab

JDev2001 edited this page Oct 5, 2021 · 8 revisions

Zuständigkeit

  • Architektur
    • Factory
    • Schnittstellen
  • Businesslogik
    • Highscore-Verwaltung
    • Cooperative-Tile-Creator

Module - Architektur

Das Projekt 2048 besteht aus den drei Modulen

• Controller

• ControllerTest

• UI

Es gibt eine unidirektionale Abhängigkeit vom UI-Modul zum Controller-Modul. Die Erzeugungsabhängigkeiten hiervon werden in der Factory Klasse "ComponentFaktory" mittels Schnittstellen entkoppelt.

Das Module ControllerTest ist für UnitTests vorgesehen.

Cooperative-Tile-Creator (CooperativeTileCreator.java)

Beim Cooperative Tile Creator wird mit den Standardwahrscheinlichkeiten von "2048" ein Stein mit einer 2 bzw. 4 erzeugt. Dieser Stein wird nun so platziert, dass er möglichst beim nächsten Zug mit einem bereits vorhandenen Stein mit selben Wert "verschmolzen" werden kann.

Highscore-Verwaltung (Package Highscore im Controller)

Der Highscore eines Players wird local (Serialisierung in eine Datei) und Global (über eine Rest API) auf einem Backend Server gespeichert. Eine Liste aller Globalen Highscores ist über den Menü-Punkt "Highscores" einzusehen. Globale Highscores zählen nur bei dem Standardspielmodus ("Random").

Einfacher NodeJs Express WebServer (Backend):

var express = require('express');
var app = express();
var fs = require("fs");
var scores = [];
var fs = require('fs');

try
{
scores = JSON.parse(fs.readFileSync("scores.json")); //Score aus lokaler Datei laden
}
catch(e)
{
}
var bodyParser = require('body-parser');
const { S_IFREG } = require('constants');
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 
app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

app.post('/get', function (req, res) 
{
    
      res.end(JSON.stringify(scores));
})
app.post('/submitHighscore', function (req, res) 
{
      var token = req.body.token;
      var _score = req.body.score;
      var _name = req.body.name;
      var _dimensions = req.body.dimensions;
      if(token!="a$dfjveÖS3ir_§2") res.end("invalid token");

      console.log("newScore: "+ _score+ " name: "+_name);
      const scoreObj = {name:_name, score: _score, dimensions:_dimensions};
      var match = scores.find(e=>e.name==_name);
      if(match==null)
      {
            scores.push(scoreObj);
      }
      else
      {
            var index = scores.indexOf(match);
            if(scores[index]<_score)
            {
               scores[index] = scoreObj;
            }
            try
		   {
               fs.writeFileSync("scores.json",JSON.stringify(scores)); //Score in eine lokale Datei schreiben
            }
            catch(e)
            {
			  console.log(e);
		   }
      }
      scores.sort(function(a, b)  //Scores sortieren
      {
            return a.score-b.score;
      });
      res.end("success");
})


var server = app.listen(3001, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Webserver läuft", host, port)
})