Warning: include_once(/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php): failed to open stream: No such file or directory in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: include_once(): Failed opening '/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php' for inclusion (include_path='.:/opt/php/lib/php') in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/fields/dbp09/local/config.php:4) in /var/www/html/pmwiki-2.2.86/pmwiki.php on line 1250
Datenbankpraktikum SS 2009 - Gruppe 1 - Backend-allianzen

Allianzen

Kurzbeschreibung

Eine Allianz ist ein Zusammenschluss von mehreren Spielern. So bietet sich den Spielern die Möglichkeit sich aus einer Auswahl von verschiedenen Gruppierungen eine auszuwählen und sich dieser anzuschließen oder selbst eine zu gründen. Sie dienen im allgemeinen dazu untereinander leichter kommunizieren zu können und soll somit eine bessere Zusammenarbeit zwischen den Spielern bewirken.

Prinzip

Man kann selbst eine Allianz gründen oder sich bei einer bereits bestehenden bewerben. Diese Bewerbung wird vom Anführer der Allianz entweder angenommen oder abgelehnt. Der Anführer kann außerdem jedes Mitglied wieder aus der Allianz entfernen, neue User einladen, ein anderes Mitglied zum neuen Anführer ernennen oder die Allianz auflösen. Wenn man in einer Allianz vertreten ist kann man an die gesammte Allianz eine Rundmail schreiben und genießt unter allen Mitgliedern Immunität. Rundmails können zum Handel, zu Kriegsplanungen oder ähnlichem verwendet werden. Jedem User steht es frei die Allianz jederzeit wieder zu verlassen.

Umsetzung

Eine Allianz wurde in Form des Modells Alliance implementiert, welches über die Attribute name und leader_id verfügt. Es wird nur mit Hilfe von ActiveRecord über die Mitglieder verwaltet. Außerdem besitzt der User noch die Attribute applicant_id und alliance_id welche die Verbindung zu einer Allianz darstellt. Wir haben die Verbindung als uniq eingestuft, somit kann ein User nicht doppelt in einer Allianz auftreten, außerdem kann er immer nur in einer Allianz Mitglied sein. Die Assoziation im Allianzmodell wird durch die Beziehung has_many Users dargestellt und im Usermodell durch belongs_to Alliance. Da es sowohl eine Bewerberliste als auch eine Mitgliederliste geben sollte, wurden im Usermodell zwei Beziehungen eingefügt, sowohl für die Bewerber(applicants) als auch für die Mitglieder(members). Wenn man nun einen User einer Allianz hinzufügen möchte, muss man nur mit Hilfe des „<< - Operators“ den User zu der entsprechenden Allianz hinzufügen.

Alliance.find_by_name(„Meine Allianz“) << User.find_by_name(„Willi“)

Über den Befehl „Alliance.find_by_name(„Meine Allianz“).members“ konnten alle Allianzmitglieder ausgegeben werden, bzw. mit „Alliance.find_by_name(„Meine Allianz“).applicants“ alle Bewerber. Das entfernen geschieht analog über den Befehl „Alliance.find_by_name(„Meine Allianz“).delete(User.find_by_name(„Willi“).

Jedes Mitglied kann Rundmails innerhalb der Allianz verschicken. Dabei wird durch alle Mitglieder iteriert und jeweils eine Nachricht mit Hilfe des MessageControllers erzeugt.

Ein Beispiel: Willi will in die Allianz „Beispielallianz“(id=4) eintreten, welche von „Susi“ geführt wird. Dafür bewirbt Willi sich bei der Beispielallianz, somit kommt er in die Bewerberliste dieser Allianz und das Attribut applicant_id an seinem Usermodell wird auf "4" gesetzt. Daraufhin bekommt Susi eine automatisch generierte Nachricht mit der Bewerberinformation. Nun hat sie 2 Möglichkeiten: Sie kann ablehnen oder annehmen. Willi wird in beiden Fällen wieder aus der Bewerberliste entfernt und seine applicant_id wieder auf „nil“ gesetzt. Wenn sie ablehnt geschieht nichts weiter und alles ist wieder beim alten. Wenn sie die Bewerbung jedoch annimmt wird Willi zusätzlich in die Mitgliederliste geschrieben und das Attribut alliance_id wird auf "4" gesetzt. Er ist nun vollwertiges Mitglied.


Page last modified on August 23, 2009, at 03:52 PM