# Video casino game example

Here is an example of how closures can be used in the context of a video casino game:

```javascript
function createSlotMachine() {
  let credits = 0;

  return {
    insertCoin: function() {
      credits++;
    },
    play: function() {
      if (credits > 0) {
        // generate random number and determine winnings
        let winnings = Math.floor(Math.random() * 50);
        credits += winnings;
        console.log(`Congratulations, you won ${winnings} credits!`);
      } else {
        console.log('You must insert a coin before you can play.');
      }
    },
    getCredits: function() {
      return credits;
    }
  }
}

let slotMachine = createSlotMachine();
slotMachine.insertCoin();
slotMachine.play(); // may output "Congratulations, you won X credits!"
console.log(slotMachine.getCredits()); // displays the number of credits the player has
```

In this example, the `createSlotMachine` function creates a new slot machine object with three methods: `insertCoin`, `play`, and `getCredits`. The `insertCoin` and `play` methods are closures that maintain a reference to the `credits` variable, which is defined in the outer function. This allows the `insertCoin` and `play` methods to access and modify the `credits` variable even after the `createSlotMachine` function has returned.

The `getCredits` method returns the value of the `credits` variable. This method is not a closure, since it does not reference any variables from the outer function.

When the `slotMachine` object is created, the player can insert coins, play the slot machine, and check their credits using the `insertCoin`, `play`, and `getCredits` methods. The `credits` variable is private to the slot machine object and cannot be accessed or modified directly from outside the object. This use of a closure helps to encapsulate the state of the slot machine and protect it from tampering.
