Monday, 4 January 2016

The Murder Mystery Game: create a Facilitator

The Murder Mystery Game is strictly low-tech and can be played without any real equipment.


But you do need a Facilitator, and this normally means one person setting the game up, but not playing the game themselves.


However, the role of the Facilitator can be replaced by a computer running a simple program.

Setting up the game with a human Facilitator


You typically need at least 8 players, plus someone to set the game up. The roles of the players can be determined by handing out pieces of paper, or you could use ordinary playing cards from a deck of 52.

For example, with 10 players you would select 10 cards from a deck as follows:-
  • two Jack (Knave) cards to represent the "killers"
  • one Queen card to represent the "witness"
  • seven ordinary numeric cards for the remaining 7 players

The cards are then shuffled by the Facilitator and dealt out to the players.

All players are then asked to shut their eyes. The facilitator asks the two Killers to open their eyes, so each Killer knows who the other Killer is.

The facilitator asks them to close their eyes, then asks the Witness to open his/her eyes. The facilitator then points out one of the killers to the witness.

So now the innocent guests do not know who witnessed the murder or who the killers are.
The killers know each other.
The witness knows the identity of one of the killers.

Playing the game


All players are Guests at a country house. During the night someone is murdered by two Killers. One player Witnessed the murder and was able to recognise one of the Killers. Unfortunately it was too dark to get a clear sighting of the second Killer.



The players now sit around, discussing the murder, possibly accusing other guests and generally watching their reactions. Clearly you won't know who is telling the truth and who is lying.

No one has to tell the truth. Even a player claiming to be the witness could be lying. Maybe you have 2 or 3 players in a game, all claiming to be the witness! Maybe the real witness is not prepared to reveal themselves early in the game.

When it appears that there may be a consensus, the facilitator calls for a vote. If there is a majority verdict, then the accused is sent to the gallows.

The hanged man or woman now has to answer truthfully: guilty or innocent? They play no further part in the game, cannot comment, cannot confirm or deny that (if innocent) they were the witness.

If the killers survive, they win. For example, it's a win for the killers if:-
  • only 3 players are left and no killers have been found
  • only 2 players are left and only one killer has been found

This game works best with a large group of adult friends (at least 8 players, more than 10 is even better). The entertainment is created by the interaction within the group. We usually play over the Christmas holidays when we have a large group of family and friends available.

Creating a Facilitator


It is generally better if everyone can take part as players. The role of the facilitator can be accomplished via a simple computer program where:-
  • players add their names to a list of players
  • the program randomly selects a Witness and 2 Killers
  • players select their name from a list to privately view their roles

I wrote a Facilitator program in Gambas to carry out these tasks, which we have used several times. However, I didn't have my laptop with me last Christmas, which has since prompted me to write a new program in Javascript.

This new program can be run on any device with a web browser and carried on a memory stick, or run remotely over the internet via an HTML file located on my home web server.

This is the program, which should be saved in a file with an html extension (e.g. mmf.html):-

<!DOCTYPE html>
<html>
<h1>Murder Mystery Facilitator</h1>
<h4 style="color:blue;"> Enter each players name and add to the list</h4>
<body>
<input id="player" type="text" required>
<button id="btn_AddPlayer" type="button" onclick="addPlayer()">Add player to list</button>
<br>
<p id="plist">you really need at least 8 players...</p>
<p id="pnumber">...zero Players listed</p>
<button id="btn_list" type="button" onclick="PlayerRoles()">OK, all players added</button><br>
<h4 style="color:blue;"><p id="txtSelectName">Select your name:</p></h4>
<select id="SelectPlayer"></select>
<button id="btn_ConfPlayer" type="button" onclick="displayRole()">You are a...</button>
<br><br><br><br>
<button id="btn_NewGame" type="button" onclick="NewGame()">Caution: This will start a NEW game</button>

<script>
var players = new Array();    //global array holds player names
var roles = new Array();    //global array holds player roles
var playerViews = 0;        //count players viewing their roles

var GameNumber = 1;         //counts games using the same player list
var Killer1 = 0;            //the array index for current Killer 1
var Killer2 = 0;            //the array index for current Killer 2

//hide controls until ready to display
document.getElementById("btn_ConfPlayer").style.visibility = "hidden";
document.getElementById("btn_list").style.visibility = "hidden";
document.getElementById("SelectPlayer").style.visibility = "hidden";
document.getElementById("txtSelectName").style.visibility = "hidden";
document.getElementById("btn_NewGame").style.visibility = "hidden";

function addPlayer() {        //add each player to the array, and list on the page
    var index;
    var text = "<ul>";

    if (document.getElementById("player").value != "") {
        players.push (document.getElementById("player").value);
        for    (index = 0; index < players.length; index++) {
        text += "<li>" + players[index] + "</li>";
        }
        text += "</ul>";
        document.getElementById("plist").innerHTML = text;
        document.getElementById("player").value = "";
        document.getElementById("pnumber").innerHTML = "Game: " + GameNumber + ", players: " + players.length;
        if (players.length < 3) {   
            document.getElementById("btn_list").style.visibility = "hidden"; }
        else {        //display OK button
            document.getElementById("btn_list").style.visibility = "visible";
        }
    }
}

function PlayerRoles() {
    var index = 0;
    var iFound = 0;
    var iPlayer = 0;
    var text = "<ul>";

    //initially make all players Guests (innocent)
    for    (index = 0; index < players.length; index++) {
        roles[index] = "GUEST";
    }

    do {    //randomly pick a Witness
        iPlayer = Math.floor((Math.random() * players.length));
        if (roles[iPlayer] == "GUEST") {
            iFound = 1;
            roles[iPlayer] = "WITNESS";
        }
    }
    while (iFound < 1);
    iFound = 0;
    do {        //randomly pick 2 Killers
        iPlayer = Math.floor((Math.random() * players.length));
        if (roles[iPlayer] == "GUEST") {
            iFound = iFound + 1;
            roles[iPlayer] = "KILLER" + iFound;

            if (iFound == 1) {
                Killer1 = iPlayer;}
            else {
                Killer2 = iPlayer;}
            }
        }
    while (iFound < 2);
    //hide & show required controls
    document.getElementById("btn_AddPlayer").style.visibility = "hidden";
    document.getElementById("player").style.visibility = "hidden";
    document.getElementById("btn_list").style.visibility = "hidden";
    //add players to a list box   
    for    (index = 0; index < players.length; index++) {
        var Entry = document.createElement("option");
        Entry.text = players[index];
        SelectPlayer.add(Entry ,null);
        }
    document.getElementById("btn_ConfPlayer").style.visibility = "visible";
    document.getElementById("txtSelectName").style.visibility = "visible";
    document.getElementById("SelectPlayer").style.visibility = "visible";
}

function displayRole()  { 

//display individual players roles (Guest, Witness, Killer)
    var message = "";
   
    switch (roles[document.getElementById("SelectPlayer").selectedIndex]) {
        case "WITNESS":
            message = "you are the WITNESS are you saw " + players[Killer1]
            break;
        case "KILLER1":
            message = "you and " + players[Killer2] + " are the KILLERS"
            break;
        case "KILLER2":
            message = "you and " + players[Killer1] + " are the KILLERS"
            break;
        default:
            message = "you are INNOCENT"
    }
    alert(message);

    playerViews += 1;
    if (players.length <= playerViews) {
        document.getElementById("btn_NewGame").style.visibility = "visible";
        document.body.style.backgroundColor = "#ffbbbb";
        }
}

function NewGame()  {
    //start a new game with the same players. Basically create new player roles.
    var x = document.getElementById("SelectPlayer");
    do {
        x.remove(x.length-1);
    }
    while (x.length >0);
    playerViews = 0;
    document.getElementById("btn_NewGame").style.visibility = "hidden";
    GameNumber += 1;
    document.getElementById("pnumber").innerHTML = "Game: " + GameNumber + ", players: " + players.length;
    document.body.style.backgroundColor = "#ffffff";
    PlayerRoles();
}
</script>

</body>
</html>


Even better


I may add a few more enhancements when I get time.

We played a "commercial" version of this game recently where new characters with special powers where added in during subsequent rounds/games (e.g. a Guardian Angel, a Witch & so on).

I think it would also be useful if the device "said" the name of the player, when a player is checking his/her role, just so they are not tempted to cheat!

...well, you just can't trust anyone in this game!


Use my MMF link


You can run the Murder Mystery Facilitator from my MMF page.

No comments:

Post a Comment