Some backstory: one of my teachers at sixth form was an Only Connect contestant who thought that running our own Only Connect would be cool. So, I wrote software and created buzzers for our own version! This was made in February 2015, although at the time of writing this post I'm rewriting some of the code to prove I have improved and do know how to use a for loop.
The application is written LÖVE 2d, a library for making games in Lua, and also the only thing I knew how to make graphical applications in at the time. Whoops. Needless to say, for making GUIs, this is a mistake. But anyway, a few nice things came out of it. This application can run an entire Only Connect show including tiebreakers and can be controlled with just your keyboard rather than fancy special hardware (more on that later). It features nice animations, a way to read sets of questions from file and a host console that tells the host what the scores are and who should go next (which is just a bunch of
The animations are done by defining linear tweens that can be used throughout the code. A tween is stored as a Lua table containing its start value, end value, length and how much time has elapsed. When updated with
updateTween(tween), this internal count of how much time has elapsed is updated. When getting the current value of the tween with
val(tween), it just does
start + (end-start)*(time/total_time), as you would expect from a linear transition.
These are used throughout the program to make things glide across the screen rather than teleport. It is also used to fade between colours, for example when a hieroglyph is selected, it fades to and from the new colour with three tweens - red, green and blue value.
Reading Questions from File
| round 2 Toy Story Movies~Toy Story;Toy Story 2;Toy Story 3;Toy Story 4 (Coming Soon!) Rainbow~Red;Orange;Yellow;Green Composite Numbers~20;21;22;24 *Grades In Some Rythmn Games~C (about 60%);B (about 70%);A (about 80%);S (about 90%+) Noble Gases~Argon;Krypton;Xenon;Radon Note Lengths~Crotchet;Minim;Semibreve;Breve | round 3 #1 Types of Netrunner Card~Operation;Hardware;Program;Resource Cold~Ice;Snow;Wind;Shoulder Synonyms for Situation~Problem;Predic -ament;Situation;Event Gifts~Present;Offering;Sacrifice;Delivery | round 3 #2 Programming Languages~Go;C;Python;Java Action Words~Stop;Wait;Run;Hop Letters~B;A;D;E Snakes~Cobra;Adder;Anaconda;Milk
Here is part of an Only Connect question file. In
importer.lua, we import this as the questions by putting them in the relevant Lua tables and splitting up the clues. The format is pretty simple:
| starts a comment,
~ splits a question and answer and
; separates answers. We also have
$ prefixes which mark the picture and music rounds respectively, which look for the pictures and music files present in the folder shared with this questions file. The code for converting these is mostly just multiple applications of
string.gmatch, so is uninteresting. But the format itself is quite nice.
Actually Displaying Things
This isn't very special, and mostly just involves drawing things at certain positions on screen. It does account for changing the size of the screen, however: a scale variable is defined based on the height of the window, and everything is multiplied by that scale. This meant that everything could be tested at one screen size and would automatically work for others. A second scale variable is also defined that works out how much wider it is, so that even if you just change the width and not the height, the elements will move to centre, such as on a particularly wide screen.
The hardware, despite looking like a mess of wires, is relatively simple. We have some arcade buttons attached to a MakeyMakey, which converts electrical input into keypresses. There are four total boxes - two with just a single button that acts as a buzzer for each team, one to house the MakeyMakey and one for the host. The host box has three buttons - one to say the team was correct, one to say the team was incorrect and one to move the question on (reveal new clues, move to the next question etc). The MakeyMakey could easily be replaced by an Arduino, but that would require an Arduino capable of simulating keypresses.