Zufällige Quests temporär speichern

cola1

Mitglied
Hi,

stehe vor einer Aufgabe und hoffe dass Ihr mit helfen könnt, wie diese am besten angegangen werden soll.

Es geht um Aufgaben/Quests, welche täglich öfter absolviert werden können. Um das ganze etwas interessanter zu machen, soll jedes Mal zwischen drei Quests gewählt werden können um unter Anderem auch für den User eine passende (mehr Gold, mehr XP oder ausgewogen) Quests bereit zu stellen.

Zum Beispiel:

Rette die Katz
Beschreibung hier...
100 XP
12 Gold
10 Minuten

Verfolge die Spur
Beschreibung hier...
178 XP
2 Gold
5 Minuten

usw...

Ist es eine gute Lösung, diese zufällig generierten Werte in einer Session zu speichern und solange zu behalten, bis der User eine davon annimmt und erfolgreich beendet? Ist das maipulationssicher? Können die Werte aus der Session mit einem Button abgerufen in nach dem Countdown in die Datenbank geschrieben werden, ohne dass etwas durcheinader gerät?

Der Ablauf:
User öffnet Quest-Seite, erhält drei zufällig generierte Quests. Er entscheidet sich für eine davon, wartet bis der Countdown abgelaufen ist und wird anschließend auf seine Charakterseite oder so weitergeleitet. Bis dahin sollten die Werte schon eingetragen sein.

Wo sollen diese Daten generiert werden? Also die Gold- und XP-Belohnung müssen dem Level des Users angepasst und zufällig generiert werden. Die Beschreibung muss natürlich zum Namen der Quest Passen und eigentlich wäre es bestimmt nicht verkehrt, wenn eine längere Quests höhere Belohnung gibt... puh.

Vielleicht kennt jemand von euch ein Beispiel? Das wär klasse :)
 
Zuletzt bearbeitet:
Die Questen musst du natürlich vorher erstellen. Dabei solltest du dann darauf achten, dass Questname und Questbeschreibung zueinander passen. (Ich versteh deine Frage hierzu nicht?).
Dazu solltest du dann auch passende Belohnungen, Zeiten etc eintrage. Oder erwartest du das ein Script dir Questen generiert? Vielleicht solltest du noch ein paar Grundlagen aufarbeiten.
Um drei zufällige Questen aus der Datenbank auszulesen, verwende ORDER BY RAND() LIMIT 3
Lege eine extra Tabelle für aktive Questen an. Sessions verschwinden beim Schließen des Browserfenster womit deine Quest dann hinfällig wäre.

Für die Berechnungen kannst du dir überlegen, wie die Abhängingkeit zum Level des Users aussehen soll (linear, quadratisch, exponentiell, logarithmisch, ...)
 
Ich würde, wie schon von timestamp vorgeschlagen, die Quests in einer eigenen Tabelle speichern, ohne dabei absolute XP- oder Gold-Werte einzutragen, sondern eher deren Verhältnis zueinander oder zum User-Level. Daraus kannst du dann einfache Rechenwege erzeugen.

Die Frage wäre dann dabei, ob jeder User die gleichen Tagesquests zur Auswahl haben soll oder ob alle unterschiedliche Auswahlen haben sollen? Die Vorhaltung der Quests würde ich nicht in der Session realisieren, da diese ja beendet wird, sobald der Benutzer beispielsweise den Browser schließt. Generiere am besten die drei Quests beim ersten Seitenaufruf eines jeden Users am Tag und schreibe sie in eine Tabelle, die extra für diese temporäre Vorhaltung erstellt wird. Dabei solltest du dann dort aber die absoluten XP- und Gold-Werte eintragen, falls sich das Level im Laufe eines Tages ändert.

Grüße
 
Oh stimmt, dann wären die Daten in Sessions fehl am Platz.

Habe nun zwei neue Tabellen angelegt:
quests (mit questID, questName, questDescription) und
quest_types (mit questTypeID, questTypeName) für verschiedene Arten von Quests

In der Tabelle quests nun erstmal sechs Einträge. Diese werden wie vorgeschlagen mit order by rand() ausgegeben.

ABER... wie speichere ich diese in eine user-bezogene Tabelle, sodass diese bei Seitenaufruf nicht mehr neu generiert werden?

Screen: http://www.abload.de/img/randomquestso2j58.png

Brauch man dazu eine Funktion die bei Seitenaufruf die drei Quests aus der DB wählt und direkt in eine Tabelle speichert und die Ausgabe im Frontend geschieht dann garnicht über order by rand, sondern gezielt die drei gespeicherten aus der user-Tabelle? Ich weiß nicht :(
 
Wie ist denn ein Quest mit einer QuestType verknüpft? Wahrscheinlich fehlt dir da noch eine Spalte in der quests-Tabelle (questTypeID als Fremdschlüssel).

Du kannst das auf verschiedene Arten machen, ich würde es wie gesagt mit einer extra Tabelle lösen. Cookies gingen auch, allerdings mag es eventuell tatsächlich den ein oder anderen User geben, der keine akzeptiert.
Code:
extra Tabelle quests_daily

+-----------------------+
| Spalte 1    `questID` | (sollte klar sein)
| Spalte 2    `userID`  | (die auch)
| Spalte 3    `day`     | (z.B. im Format 2012-07-18)
+-----------------------+

Du kannst diese Tabelle auch gleichzeitig dazu benutzen, um quasi eine Quest-History anzulegen. Pro UserID und Tag (Spalte `day`) legst du einfach drei neue Datensätze mit zufälligen QuestIDs an, sofern noch keine bestehen.
 
Ich frage mich grade wie man mit PHP zufällig ausgelesene Datensätze in einen Anderen schreibt.

Wie gesagt die Quests sind in der Datenbank und alle mit einem bestimmtem type (die Daylies) werden per order by rand() ausgegeben. Schön und gut, aber wie speichert man diese drei Quests so, dass der User diese drei nurnoch angezeigt bekommt solange keine davon abgeschlossen wurde und zusätzlich die Vergütung stattfindet?
 
Wie gesagt die Quests sind in der Datenbank und alle mit einem bestimmtem type (die Daylies) werden per order by rand() ausgegeben. Schön und gut, aber wie speichert man diese drei Quests so, dass der User diese drei nurnoch angezeigt bekommt solange keine davon abgeschlossen wurde und zusätzlich die Vergütung stattfindet?
kommt doch sehr auf die Struktur deiner DB an.

Eine neue Tabelle mit der user-id und der quest-id?
 
Ich denke da an die Tabelle:
`character_random_quests`(mit characterID, questID sowie dann halt noch Zeit, Gold, Erfahrung).

Spalte day könnte später in `character_main_quests` verwendung finden.

Hier ist ein relativ aktueller Screen von pMA http://www.abload.de/img/5jwjp0.png.
In `users` ist E-Mail, Pass usw. und in`characters` ist dann der Charaktername, Klasse, Level usw.

Deswegen denke ich, dass die zufälligen Quests in die Tabelle `character_random_quests` geschrieben und daraus dann ausgegeben werden, oder nicht?
 
Ich erwähnte es bereits, aber hier mal ein exemplarischer Ablauf:
- BenutzerXY betritt am Tag mit dem Datum DD.MM.YYYY die Webseite
- dein Script prüft: hat der User schon neue Quests für diesen Tag? (Query an die DB, ob schon mindestens ein Eintrag mit der UserID XY und dem Datum YYYY-MM-DD in der Tabelle quests_daily steht)
==> stehen drei Einträge drin: User hat noch die Wahl
==> steht ein Eintrag drin: User hat sich bereits entschieden [Eventuell hilft dir ein zusätzliches Flag (z.B. `quest_completed`) in der Tabelle quests_daily, die Quest als erledigt zu markieren]
==> steht kein Eintrag drin: User benötigt noch Quests für diesen Tag -> du lädst drei zufällige aus der quests-Tabelle und trägst sie mit der UserID und dem Datum in die Tabelle quests_daily ein

Jetzt könnten aber langsam Gedankensetzlinge keimen, oder?
 
Ich frage mich grade wie man mit PHP zufällig ausgelesene Datensätze in einen Anderen schreibt.
Vor der Anzeige mit Quests und deren Auswahl machst dein Select mmit RAND()
Kannst natürlich alle Quests hardcodiert ins PHP-Scricpt schreiben und von da aus mit rand() die neuen Tagesquests mitgeben. Speichern müsstest du dann nur $Text="Der Questtext"
$QuestNR=1-100

Anzeigen tust dann halt Quest<br> $Text usw

Wie gesagt die Quests sind in der Datenbank und alle mit einem bestimmtem type (die Daylies) werden per order by rand() ausgegeben. Schön und gut, aber wie speichert man diese drei Quests so, dass der User diese drei nurnoch angezeigt bekommt solange keine davon abgeschlossen wurde und zusätzlich die Vergütung stattfindet?

Speichern tust das in einer Tabelle TagesquestsUser oder sowas reinkommt die NR der rand erzeugten quest und ein Feld (tinyint oder bool) für Erledigt 1/0 ja nein. Sowie ebn was der User bekommen würde also Belohnung als Textfeld oder sowas.

Du müsstest dann lediglich jedesmal prüfen A) Gibt es noch eine Quest in TagesquestsUser dann zeige wieder die NR B) beim erledigen löschen und C) Neuer Tag angbrochen alte quests aus Tabelle löschen welche nicht erledigt sind oder so.

Edit: also fast das was Erik gesagt hat :)
 
Zurück