For this critique, I got to try out an educational game in an area I’ve been curious about for a long time: programming education. The game I will critique is called CodeCombat and is playable on web browsers. The game is developed by the CodeCombat company, however it is also open source and has an active community behind it that develops levels. CodeCombat was first released in 2013, and has over twenty million players from over one hundred and ninety countries.

While the game is playable on browsers, it does have multiple paywalls. There is a subscription based premium version that costs $9.99 per month, and users can also purchase additional gems to acquire in-game items. The premium version includes more levels, characters and items for the player to choose from.

Learning Objectives

The overall goal of the game is to teach elements of programming from the basics all the way to advanced concepts. What I found interesting about CodeCombat is that it does not teach programming through a custom created language (e.g. Minecraft Education Edition’s scratch like language), but instead gives players the option to learn Python, JavaScript, or C++. The game is teaching general purpose programing languages that are widely used in the real world.

The prior knowledge required to play CodeCombat includes the following:

  1. Understanding of web interfaces and navigation
  2. Understanding of mathematics and computational literacy (recommended for ages 9 and up, but most players fall in the 13–16 age group)
  3. Debatable, but I think this game does require some previous exposure to coding. As you’ll see in my game analysis, I think there are some confusing elements that make it hard to recommend for people who have never coded (or never seen code) before.

With it’s emphasis on fostering programming expertise of general purpose programming languages, the game aims to increase fluency in the following areas:

  1. Basic elements of programming (syntax, arguments, variables, loops, strings)
  2. Boolean logic
  3. Functions and event handling
  4. Navigating documentation and commenting
  5. Debugging
  6. Web and game development

By playing CodeCombat, players of various skill levels can gain exposure to programming languages by writing code that will help their character level up.

According to the game’s website, CodeCombat has allowed students to learn programming “WAY faster”. I could not find any studies to validate this statement, however the game does seem to be quite popular.

Game Elements

Split screen interface in a CodeCombat level

(Sorry, I got a little long-winded about some overall thoughts before I got to the MDA part)

CodeCombat is a fantasy-themed RPG that has the player complete a collection of quests found in each world or dungeon. Each of these worlds has it’s own theme and set of learning goals. Kithgard Dungeon, for example, is the first world in the game and is focused on teaching the basics of programming. The Backwoods Forest is focused on boolean logic, relational operators, event handling, and functions. There are also worlds that are focused on specific platform development, such as web or game development.

The player can choose from multiple characters to be their playable hero. These characters have classes and attributes attached to them, and can be upgraded and customized with the levelling and inventory systems. On the surface, the game looks like a fantasy world with the expected features from an RPG. The code focus adds some interesting layers to the gameplay because certain inventory items result in the acquisition of new abilities that the player can use in their code, including attack functions or while loops. Also, along with choosing their playable character, players must also choose their programming language that they will learn.

In each level, the player will have a split screen interface. They must complete various tasks to get their character through the level, such as collecting gems or defeating enemies, but they can only affect the game through code. In order to get their character to do something, they must write code on the right hand side to execute the desired behavior. If their code does not run properly, or if the executed actions do not result in a win condition, players can revisit their code and retrace their steps to correct their mistakes and finish the level.

Something that I find interesting about CodeCombat is how it doesn’t really try to obscure the programming side of things. With DragonBox Algebra, the design metaphors obfuscated the algebra quite heavily, yet CodeCombat doesn’t resort to such intense design metaphors. Every world and level “clearly” (yes with quotes, I’ll explain in the next paragraph) explains what the learning outcomes are supposed to be, and there are features such as voice over tutorials, hints, and comments that do not shy away from the programming terminology.

On the one hand, I find this openness of the educational goals to be problematic in practice. I do not think the game does a great job of explaining the programming lingo, so even if a level introduces a new concept such as method parameters, it doesn’t do a great job of teaching what a method or a parameter is. The game wants to teach the practice of programming, but the theory and terminology is lacking. Yet on the other hand, part of me commends this openness and the certain confusion that comes with it. In traditional computer science education, there is always a little bit of a trial by fire at the start where it’s difficult to understand the terminology, let alone the practice of programming. In a way, the game is lessening the impact of that confusion and keeping things relatively accessible to newcomers, but the influx of new information is just a real world aspect that may be unavoidable.

Description of the educational goals before playing a level

Even though I somewhat understand that some confusion for novices can be expected, I think the game’s scaffolding and overall design leaves a lot to be desired. I will discuss some of the finer details in the MDA breakdown, but the game doesn’t have a proper introduction to its world or systems for players experiencing it for the first time. There is a level of hand-waviness in the design of the game (maybe due to the open source nature of the project) that makes it hard to play at the start. Even if this wasn’t an educational game at all, this criticism still stands; as a first time player, I had no idea what character to choose (or why I was choosing one in the first place) how to navigate the world, or what the game is about. The game is also incredibly tedious; I normally plan on finishing the entire game before doing a critique, but each world has dozens of levels that are not incredibly interesting, and so I was not able to get to the finish line for this critique. Side note: this linearity of world design is interesting considering it is supposed to be RPG-like; are players expected to go through hundreds of boring levels before getting to the content or world they are interested in?

Using Zubeck’s updated MDA framework, the game elements can be broken down as follows:

Mechanics — The game is an isometric single player game with a split screen view; on the left, there is the game view where the entire map can be seen; on the right is the code editor view where players can write and run code. There are over ten worlds in the game with a number of levels in them ranging from twenty to approximately one hundred levels per world. The interface is navigated using the mouse like a normal web application, however the bulk of the gameplay happens by using the keyboard to write code. Some gameplay mechanics like purchasing and equipping inventory, character customization and the scrub bar to view executed moves rely on the mouse rather than the keyboard.

There are a number of commands and abilities available to the player that they can unlock throughout the game, starting from basic abilities (which are programming functions) like moving in four directions, attacking or speaking to NPCs to advanced ones such as ally commands. Intuitively, the game seems like a turn based RPG where each line of code is a turn, however the mechanics are actually more real-time. For example, if there is an enemy in front of the player, the enemy will not wait until the next time the player hits the Run key to attack; they will keep attacking until the player does something (i.e. type a new line and run it). The game doesn’t have a “game over” screen, but it allows players to undo their moves by erasing their code and running it again.

Systems — Number of systems are employed here. The main system is the program execution system to which all in-level actions are tied to. There is also a character selection and personalization system, levelling system, in-game economy, inventory system, and achievement system implemented. The inventory system is particularly interesting because, like in other RPGs, different items give the player perks or abilities to use. Some abilities can add extra attack damage or health, but many allow the player to unlock different programming functions that they can use to their advantage. The ability to speak to NPCs for example is unlocked through equipped inventory. Two help systems are available to the player: the voice over tutorial system and the hints/documentation system. The voice over tutorial is simply a narrator that outright tells the player what programming tools they should use to overcome the level. The hints system is essentially a form of documentation for the player to access. This hints system is a bit strange, as it is where the bulk of the terminology is explained (e.g. what a string is). It’s not very game-like, and makes the experience feel like any other coding tutorial online. There is also a community-based system that is part of the overall project, which includes a forum and “clans” that the player can join.

Dynamics — The game enables a few different behaviors from the player. One of the most salient is how the design of the game enables player experimentation with various programming approaches. There is no game over screen, and the ease of deleting and rewriting code means players can play around with different solutions to get to the level completion. This mirrors programming in real-life, where part of the joy and expertise comes from experimenting with code to see what the outcome is. Another behavior the game enables is that of chaining together lines of code. The game is not turn based, and if the player enters one line of code at a time to run, they can get killed by an enemy before they can write and run another line. This induces the player to chain together various lines of code before executing to overcome obstacles, which can contribute to increased computational thinking ability.

One behavior the game enforces poorly is the use of equipment to overcome levels. The game does not scaffold the player properly at the start of the experience to actually purchase new equipment using the in-game currency. The need to purchase equipment was only revealed to me halfway through the first world where I lost to an ogre due to weak armor. Another behavior that is not well accounted for is help seeking. The hints system either tells the player the exact programming steps that are needed or offers tedious definitions of programming concepts. This can interfere with the player’s skill development and can result in an over-reliance on the hints system.

Aesthetics — Visually, this game is very much a medieval fantasy role playing game. The use of music and user interface elements from RPGs help support this theme as well. I have previously commented on the game being quite tedious, which can result in feelings of boredom for the player. I feel that the narrative aspects of this game are a missed opportunity to help motivate the player. The game visually feels like a fantasy epic, but there is no coherent narrative thread for the player to follow from level to level, there are only typical archetypes of ogres and wizards to be found in the game. The presence of a coherent narrative could have helped with motivation.

Learning Principles

The levels in each world are well segmented and self-contained, and the level design enables experimentation can help support self-paced learning. The kind of feedback available to players, however, is not immediate. Players must write their code, run it, and see the outcome before the game suggests if their input was correct or incorrect.

The sheer number of levels available in the game enable worked example learning and allows learners to get lots of practice with their skills (Gee’s learning principles). As a multimedia experience, the game does not execute some of the learning principles well (although the segmenting isn’t too bad). In particular, the interface can sometimes overload the visual channels and has some redundancy in it’s presentation. It is also hard to follow what element or gameplay hint the voice over tutorial suggests at times.

Overall Critique