Jetzt, wo Sie einen Spielgegenstand in Ihrer Tabelle haben, können Sie lernen, wie Sie einen Spieler simulieren können, der einen Zug in einem laufenden Spiel macht.
Es gibt zwei Möglichkeiten, wie Sie diesen Vorgang handhaben können. Bei der ersten rufen Sie das Element über die GetItem-API ab. Danach aktualisieren Sie den Spielgegenstand in Ihrer Anwendung entsprechend dem Zug des Spielers. Abschließend ersetzen Sie das vorhandene Element in DynamoDB unter Verwendung der PutItem-API. Obwohl diese Option funktioniert, erfordert sie mehrere Anfragen an Ihre DynamoDB-Tabelle und birgt das Risiko, dass alle Änderungen, die zwischen dem Abrufen und dem Neuschreiben Ihres Spielelements vorgenommen wurden, überschrieben werden.
Die zweite Möglichkeit, diesen Vorgang zu handhaben, ist die Verwendung des UpdateItem-API-Aufrufs in DynamoDB. Mit der UpdateItem-API können Sie Ihr vorhandenes DynamoDB-Element mit einer einzigen Anfrage aktualisieren. Sie geben das zu ändernde Element, die zu ändernden Attribute und die Bedingungen an, die für das Element geltend gemacht werden sollen. Dies ist die bevorzugte Art und Weise, eine Änderung an einem Gegenstand vorzunehmen, da es nicht erforderlich ist, Ihre Datenbank mehrfach aufzurufen.
Im Verzeichnis scripts/ gibt es eine Datei namens performMove.js, die den folgenden Inhalt besitzt:
const AWS = require('aws-sdk')
const documentClient = new AWS.DynamoDB.DocumentClient()
const performMove = async ({ gameId, user, changedHeap, changedHeapValue }) => {
if (changedHeapValue < 0 ) {
throw new Error('Cannot set heap value below 0')
}
const params = {
TableName: 'turn-based-game',
Key: {
gameId: gameId
},
UpdateExpression: `SET lastMoveBy = :user, ${changedHeap} = :changedHeapValue`,
ConditionExpression: `(user1 = :user OR user2 = :user) AND lastMoveBy <> :user AND ${changedHeap} > :changedHeapValue`,
ExpressionAttributeValues: {
':user': user,
':changedHeapValue': changedHeapValue,
},
ReturnValues: 'ALL_NEW'
}
try {
const resp = await documentClient.update(params).promise()
console.log('Updated game: ', resp.Attributes)
} catch (error) {
console.log('Error updating item: ', error.message)
}
}
performMove({ gameId: '5b5ee7d8', user: 'theseconduser', changedHeap: 'heap1', changedHeapValue: 3 })
Dieses Skript ist ein wenig kompliziert, also gehen wir es Schritt für Schritt durch.
Wie im vorherigen Skript importieren Sie das AWS SDK und erstellen eine DynamoDB Document Client-Instanz.
Danach definieren Sie eine Methode namens performMove. Diese Methode ähnelt einer internen Methode, die in Ihrer Anwendung verwendet werden würde, wenn ein Benutzer einen Umzug anfordert. Das Skript stellt die Parameter für einen UpdateItem-API-Aufruf zusammen. Zunächst werden zwei Attribute der Partie geändert: der letzte Benutzer, der einen Zug gemacht hat, sowie die Anzahl der Elemente im geänderten Haufen.
Die UpdateItem-API-Parameter machen anschließend einige Aussagen über den aktuellen Stand des Spiels. Die ConditionExpression wird vor der Aktualisierung des Elements ausgewertet, um zu bestätigen, dass sich das Element in dem von Ihnen gewünschten Zustand befindet. Sie stellen die folgenden drei Behauptungen in Ihrem Bedingungsausdruck auf:
- Dass der Benutzer, der einen Zug ausführen möchte, einer der beiden Benutzer in der Partie ist;
- Dass der aktuelle Zug dem Benutzer gehört, der den Zug ausführen möchte;
- Dass der zu ändernde Haufen einen höheren aktuellen Wert hat als der Wert, auf den er geändert wird.
Abschließend geben die Parameter einen ReturnValue von ALL_NEW an, was bedeutet, dass DynamoDB das gesamte Element zurückgibt, nachdem seine Werte aktualisiert wurden. Sobald Sie dies besitzen, kann Ihre Anwendung das Spiel auswerten, um einen möglichen Gewinner zu ermitteln.
Am Ende der Datei finden Sie ein Beispiel dafür, wie diese Methode in Ihrer Anwendung aufgerufen wird. Sie können das Skript mit dem folgenden Befehl ausführen:
Sie sollten die folgende Ausgabe in Ihrem Terminal sehen:
Updated game: { heap2: 4,
heap1: 3,
heap3: 5,
gameId: '5b5ee7d8',
user2: 'theseconduser',
user1: 'myfirstuser',
lastMoveBy: 'theseconduser' }
Sie können sehen, dass das Schreiben erfolgreich war und das Spiel aktualisiert wurde.
Versuchen Sie, das Skript erneut in Ihrem Terminal auszuführen. Sie sollten die folgende Ausgabe sehen:
Ihre bedingten Anforderungen sind diesmal gescheitert. Der anfordernde Benutzer – theseconduser – war der letzte Spieler, der sich bewegt hat. Außerdem hatte der geänderte Haufen – Heap1 – bereits einen Wert von 3, was bedeutet, dass der Benutzer keine Änderungen vorgenommen hat. Aus diesem Grund wurde die Anfrage abgelehnt.