I need to create an online game using solidity. The games have games within them with each game having their respective players. it can be likened to a battle royale on a FPS game where there are various battle royales going on simultaneously within the game with their respective participants. I tried using an array within a struct to keep record of the games. However, I have been facing error after error trying to do this.
The Struct:
struct Game {
address[] participants;
uint amountRequired;
uint Duration;
uint id;
bool ended;
uint createdTime;
}
The function to create the game:
function CreateGame(uint amountRequired, string memory timeoption) public restricted{
setGameDuration(timeoption);
gameid++;
Game memory newGame = Game({
participants: address[] participants,
amountRequired: amountRequired,
Duration: gametime,
id: gameid,
ended: false,
createdTime: block.timestamp
});
}
Advertisement
Answer
You need to initialize the array on a separate line, and then pass it to the struct. See the _participants
variable in the snippet:
pragma solidity ^0.8;
contract MyContract {
struct Game {
address[] participants;
uint amountRequired;
uint Duration;
uint id;
bool ended;
uint createdTime;
}
// create a storage mapping of value type `Game`
// id => Game
mapping(uint => Game) public games;
function CreateGame(uint amountRequired, string memory timeoption) public {
// dummy values
address[] memory _participants; // empty array by default
uint gametime = 1;
uint gameid = 1;
Game memory newGame = Game({
participants: _participants,
amountRequired: amountRequired,
Duration: gametime,
id: gameid,
ended: false,
createdTime: block.timestamp
});
// store the `memory` value into the `storage` mapping
games[gameid] = newGame;
}
function addParticipant(uint gameId, address participant) public {
require(games[gameId].createdTime > 0, "This game does not exist");
games[gameId].participants.push(participant);
}
}
If you want to set some participants in the code (not passed from an argument), working with dynamic array in memory is a bit tricky. See this answer for more info and an example.
Edit: To add participants to the array in a separate function, you need to store the Game
in a storage variable first. See the games
mapping in my update snippet. Then you can .push()
into the storage array from a separate function.