Entropia

Dokumentation

Aufgabenstellung

Es soll ein Programm geschrieben werden, welches Messungen in einer Datenbank speichert. Die Daten sollen hinterher online abrufbar sein.

Idee

Unsere Idee ist ein Spiel im "Bullet-Hell" Genre zu programmieren, welches für die Highscores eine Datenbank verwendet. "Gemessen" wird dabei das Talent des Spielers. Das Spiel wird in C++ mit Hilfe von OpenGL geschrieben. Für den Datenbankzugriff wird PHP verwendet.

Ziel des Spiels, wie in diesem Genre üblich, ist es möglichst nicht von gegnerischen Projektilen getroffen zu werden um möglichst lange am Leben zu bleiben.

Datenbank

Unsere Datenbank soll die Scores der Spieler abspeichern. Um unsere Datenbank zu erstellen wird folgender Code verwendet:

CREATE DATABASE IF NOT EXISTS 'entropia';
Use entropia;
CREATE TABLE IF NOT EXISTS `highscores` (
`ID` int(11) NOT NULL auto_increment,
`Name` varchar(256) NOT NULL,
`Info` varchar(256) NOT NULL,
`Score` int(11) NOT NULL,
`Timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Es werden Spalten für ID, Spielername, Spielzeit (oben Info), die Punktzahl (Score) und für das Datum (Timestamp) angelegt.

Verbindung mit Datenbank (PHP)

Die Verbindung zur Datenbank wird mit einem einfachen Befehl hergestellt. Dabei werden Datenbankort, Datenbankname und Passwort benötigt. Code:

<? $db = mysql_connect("localhost","Entropia","Password"); mysql_select_db("Entropia",$db); ?>

Abrufen des Datenbankinhaltes

Die Daten werden mit folgendem PHP script abgerufen. Mit mysql_fetch_assoc wird jeder vorher ausgewählte und sortierte Datensatz der Reihe nach Abgerufen und zwischen die HTML tags der Tabelle platziert. Genaueres ist aus den Kommentaren im Code zu entnehmen.

<html>
<table border="1px solid black">
<tr> <td>#</td> <td>Name</td> <td>Score</td> <td>Zeit</td><td>Datum</td> </tr><tr>
<?php
require_once('db_connect.php'); //Verbinden
$dbResult = mysql_query("SELECT * FROM highscores ORDER BY Score DESC LIMIT 100"); //Datensätze abrufen und nach Höhe der Punktzahl sotieren
if($dbResult && mysql_num_rows($dbResult)>0){ //Ausführen wenn Datensätze zur Bearbeitung vorhanden sind
$i = 0; //Zählvariable sowie Platzierung in Highscore
while ($db_score = mysql_fetch_assoc($dbResult)){ //Datensätze nacheinander abarbeiten; aufhöhren wenn keine Datensätze mehr vorhanden sind.
$i++;
echo "<td>".$i."</td><td>".$db_score["Name"]."</td><td>". $db_score["Score"]."</td><td>".$db_score["Info"]."</td><td>". $db_score["Timestamp"]."</td>"; // Einzelne Datenfelder werden zwischen den HTML tags der Tabelle platziert.
if (mysql_num_rows($dbResult)>$i) echo "</tr><tr>";}} //Hinzufügen einer Tabellenreihe,falls noch eine benötigt wird
?>
</td></tr>
</table>
</hmtl>

Hinzufügen eines Datensatzes

Ein Datensatz kann hinzugefügt werden, indem von unserem Spiel die Seite addscore.php aufgerufen wird. Dabei werden die Werte der Variablen einfach an die URL drangehangen. z.B addscore.php?name=Hans&info=15s&score=9001 Später wäre auch eine Verschlüsselung möglich um unrechtmäßiges manipulieren der Highscore zu unterbinden. Zur Zeit ist diese aber noch nicht nötig. Das ganze wird mit folgendem Code in die Tat umgesetzt:

<?php
require_once('db_connect.php'); //Verbinden
$sql = "INSERT INTO highscores (Name,Info,Score) VALUES ('".$_GET["name"]."','".$ _GET["info"]."',".$_GET["score"].")"; //Variablen aus URL in die Datenbank eintragen
$result = mysql_query($sql);
if (mysql_insert_id() > 0) {
echo "Success. ID = "; //Ausgabe ob Erfolgreich
echo mysql_insert_id();
} else {
echo "Failure"; }
?>

Aufruf innerhalb des Spiels

Die PHP seite wird innerhalb des Spiels mit folgendem Befehl abgerufen: HINSTANCE hInst = ShellExecute(0, "open", adresse,NULL, NULL ,SW_SHOWNORMAL); "adresse" wird dabei mit der URL der PHP seite ausgetauscht.

Programmstruktur

Erst wird auf Kollision überprüft, dann auf Tastendruck. Kollidiert der Spieler, verliert er ein Leben. Dann wird der Hintergrund in den Puffer gezeichnet, Gegnerpositionen, Projektilpositionen und Spielerposition berechnet und in den Puffer gezeichnet. Wurde alles berechnet und in den Puffer gezeichnet, so wird der Puffer gewechselt und der neue Frame wird angezeigt.Dieser Programmablauf wiederhohlt sich so lange bis der Spieler verloren hat. Hat der Spieler verloren wird dieser Kreislauf unterbrochen und seine Punktzahl an den Server gesendet.
Genaueres kann dem Quelltext und seinen Kommentaren entnommen werden.

Probleme

Ein relativ großes Problem war es Libraries zu finden welchen von ihren Lizenzbedingungen zu unserem Programm passen. Ausserdem traten des öfteren Syntax fehler auf. All diese Probleme haben sich mit Hilfe von Google und Foren lösen lassen, obwohl die Suche nach Lösungen doch des öfteren einige Zeit in Anspruch genommen hat. Ein weiteres Problem ist, dass der Jugendschutzfilter meinen Webspace sperrt.