Memory Match Game

Memory Match Game

Let’s create a simple memory game. Please download the following zip file.

You find the psd file and the two external code files in the zip


  1. create a group which contains photo layers
  2. make a variable to let the external code to know which photo is tapped.
  3. add a button to each photo. set the variable value with photo number and attach touchHandler.lua
  4. add memoryGame.lua as external code

1.create a group

Create a kwik project with iPad mini using the psd file in the

Project and pages > Create Groups

Insert all photo layers and group name is gp_photos that is referred in the external codes

2.Create a variable

project and pages > Create Variable

photoNum variable is created. It holds a same number for same photo. For example, photo1 and photo11 layers are same. So we assign 1 to the button of photo1 and photo11

3.Create buttons

Each photo layer is a button with photoNum and with the external code of touchHandler.lua

From Code, add Edit Variable and Add External Code. photo1 and photo11 are set with 1 for photoNum

touchHandler.lua is set

but_11 for photo11. photoNum is 1

but_2 is photo2 and photoNum is 2

but_22 is photo22 and photoNum is 2

Set photoNum and touchHandler.lua to photo3, photo33, photo4 and photo44 as well

4.1 Finally memoryGame.lua

add memoryGame.lua from project and pages > Add External Code

Insert the lua codes after buttons and actions.

that’s all. Publish and test it.

4.2 lua codes

touchHandler.lua is just one line


memoryGame.lua has two parts. showing photos randomly and hitTest function

local placeHolder = {}
for i=1, layer.gp_photos.numChildren do
  placeHolder[i] = {}
  placeHolder[i].x, placeHolder[i].y = layer.gp_photos[i].x, layer.gp_photos[i].y

for i=1, layer.gp_photos.numChildren do
  local ind = math.random(#placeHolder)
  layer.gp_photos[i].x, layer.gp_photos[i].y = placeHolder[ind].x, placeHolder[ind].y
  layer.gp_photos[i].alpha = 0.01
  layer.gp_photos[i].matched = false

local flips = 1
local flipped = {}

layer.hitTest= function(self)
  if self.matched  then return true end
  isHistTest = true
  if (flips == 1) then
    _K.trans.flipCard = self, {alpha=1, time=1000, delay=0})
    if flipped[1] ~= self then
      self.photoNum  = UI.photoNum
      flips = 2
  elseif flips == 2 then --second flip in the round
    if flipped[1] ~= self then
      self.photoNum  = UI.photoNum
      _K.trans.flipCard = self, {alpha=1, time=1000, delay=0})
      if (flipped[1].photoNum == flipped[2].photoNum) then
        flipped[1].matched = true
        flipped[2].matched = true
        flips = 1 -- returns the number of flips to 1
        flipped = {} --cleans the flipped table
        -- cards don’t match
        local card1, card2 = flipped[1],flipped[2]
        local function hideAgain()
          _K.trans.flipCard1 = card1, {alpha=0.01, time=1000, delay=0})
          _K.trans.flipCard2 = card2, {alpha=0.01, time=1000, delay=0})
        _K.timerStash.hideAgain = timer.performWithDelay( 2000, hideAgain, 1 ) --timer to block the cards again, with the cover image
        flips = 1
        flipped = {}
  return true