In this subsection, we'll discuss what data does the simulator generates and how it is stored on the server and in the Google Sheet.
We use Cloud FireStore to store all the data. Cloud Firestore is a scalable NoSQL Cloud Storage service by Firebase (A service by Google).
All the games played on the web or mobile simulator are pushed from Firestore to Google Sheets using a small service. This sheet is the Main sheet that holds information ready to be used for analysis.
Here is the Master IntuitiveAI Dataset (Uncleaned) Sheet:
We did some initial EDA of the IntuitiveAI Google Sheet above (https://docs.google.com/spreadsheets/d/1-9SaOmx2HAwQPbpjHVPw8OxMih1UH-NUVNxn4R2CyKI/edit?usp=sharing) on Google's CoLab and the explanation of the data is based on the cleaned version of this data. You can access that CoLab here: https://colab.research.google.com/drive/1rwPrzAS6J2lW0RVjqGaLpm4KaPwGGVdi?usp=sharing
The sheet consists of 15 columns and below we've shared what each of the columns represents. After this brief description, we have added a simple example to help you understand the dataset better.
- gameID Holds the path to a specific entry in our Database. Each entry must be unique in it.
- didUserFallInPit If the user falls in the Pit (🕳) we know it's a game lost and this will be true if that's the case.
- didUserFindGold If the user finds gold (💰) while playing the game this value will be true. As this is an optional encouraged behavior in the game so you'll see its value to be true even if the user falls in the pit in some cases.
- didUserFindMonster If the user finds the Monster (👹) this field will be true. If
didUserFallInPitis true then this value must always be false and vice versa.
- finalScore If the user falls in a pit that's a -1 score but if the user finds gold before falling in the pit that will be a 0 score and you'll see
didUserFindGoldboth be true in this case. If the user finds the monster that's a score of +1 and if the user finds gold before finding the monster that'll be the score of 2 and you'll find both
didUserFindMonsterwill be true. So, in conclusion, this column can only contain one of these values -1, 0, 1, or, 2.
- gameArrayPattern When a new game starts it'll randomize the entire grid. This column represents the graphical versions of what is on each index (0-15) on the board for example the first row of the grid will be the first four values of the array. All rows must have a total of 16 values.
- gameArrayPatternIndex These represent the same full game grid but on a non-graphical version. For example, wherever there will be 11 in the array you'll see the monster (👹) at the same index of
gameArrayPatterncolumn. All rows must have a total of 16 values.
- userGamePlayPattern When a new game starts one hint is revealed. The first value of the array represents that value. Then the rest of the values show which values use found as they played the game. If the game is lost you'll see a pit at the end of the array and just like that, you'll see .gold and monster in some games as well. This is the graphical representation of the user grid journey.
- userGamePlayPatternIndex These represent the index of the grid. Meaning here 11 will not mean Monster, it'll be the 11th index of the grid and you can see which value is on index 11 from
gameArrayPatternIndex. Refer to the image example given below for a clearer picture.
- logEntyDate Date and time of when the game entry was added to DB.
- userIP If the user is playing from the web simulator then we'll have the IP here. If the user is playing from the mobile app then this will contain the county from which the user is playing.
- userDevice This field contains if a user is playing the web or mobile app.
- dateCreated Same as log entry date.
- dateUpdated It'll be the same as the log entry date as well because once data is recorded it is ever changed.
- playedBy If the user is playing from the web or mobile app it'll be human, if the AI is playing (probably from python) the value will be the computer.
Consider this image below:
A sample game of IntuitiveAI Simulator
The RED index values are showing the real value of the grid (0-15 in a proper sequence) whereas, the BLUE index values are the ones that were generated when RED values were randomized (when a new game is started).
gameArrayPatternIndexwe look at the BLUE indexes. For
userGamePlayPatternIndexwe look at the RED indexes.
Now if the
userGamePlayPatternis: ❎,💨,💨,🕳️ you can say that when this game started the starting hint use got was ❎ and then the moved to 💨 and then again to 💨and finally fall in the pit and lost the game.
There is a problem with the above statement. We don't know which ❎was opened as we have two and also which 💨 did the use moved to? That's where
userGamePlayPatternIndexcomes to the rescue and makes the picture clear.
Let's say the values for
userGamePlayPatternIndexare: 3,7,2,9 now we can say with confidence that the ❎ which was opened was on RED index 3 and from there user opened index 7 which is 💨 and then index 2 and finally opened index 9 which was a pit and hence lost the game.
So this is how the data is stored. We tried to capture as much detail about a game played as possible.