#### Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

# Ludo

edited May 2012 Posts: 65

This is a well known multiplayer board game. Can be played from 2 to 4 players. Rules are as follows:

1. At the start of the game, the player's four pieces are placed in the start area of their colour.

2. Players take it in turn to throw a die. A player must first throw a six to be able to move piece from the starting area onto the starting square.

3. In each subsequent turn the player moves a piece forward 1 to 6 squares as indicated by the die.

4. When a player throws a 6 the player may bring a new piece onto the starting square, or may choose to move a piece already in play.

5. The player is also granted another turn as a bonus, but if a 6 is rolled three times in a row it is counted as a foul and the player therefore loses their turn.

6. If a player's piece lands on a square containing an opponent's piece, the opponent's piece is captured and returns to the starting area. A piece may not land on a square that already contains a piece of the same colour.

7. Once a piece has completed a circuit of the board it moves up the home column of its own colour. The player must throw the exact number to advance to the home square. The winner is the first to get all four of their pieces onto the home square.

Here is the link for the demo:

I have used a customized sprite for the dice. I am not sure how to upload that sprite pack (Dice.spritepack) to this site. Once downloaded It can be copied to User Applications/Codea/SpritePacks/. i used "i-FunBox" for windows to access file system.

I will post the code as well soon.

Tagged:

• Posts: 65

Here is the code.

# Main

``````-- Use this function to perform your initial setup
function setup()
supportedOrientations(LANDSCAPE_ANY)
displayMode(FULLSCREEN)
board = Board()
dice = Dice()
activePlayer = red
the3DViewMatrix = viewMatrix()
tok =nil

numberOfPlayer = 0
Angle = 0
Size = 50
currentRoll = 0
currentPlayer = 0
numberOfMove = 1
players = {1,2,3,4}
allTokensTried = 0
occupiedToken = 0
sixCount = 0
win = 1

flag = false
face = false
redFlag = false
greenFlag = false
blueFlag = false
yellowFlag = false
diceRolled = false
moveFlag = false
gameOver = false

gameMsg = ""
gameOverMsg = ""
inGameMsg = ""
winMsg1 = ""
winMsg2 = ""
winMsg3 = ""
winMsg4 = ""

end

-- This function gets called once every frame
function draw()
font("Noteworthy-Bold")
fontSize(20)
fill(64, 64, 64, 255)
text(gameMsg,WIDTH/2,HEIGHT-HEIGHT*0.9)
else
if win == numberOfPlayer then
gameOver = true
end
perspective(10, WIDTH/HEIGHT)
-- Position the camera up and back, look at origin
camera(0,1000,-300, 130,120,0, 0,1,0)

background(220, 220, 220, 255)
if diceRolled and not gameOver then
if numberOfMove > 0 and numberOfMove < 4 then
rotateDice()
end
end
if numberOfMove == 0 or activePlayer.tokensAtHome == 4 then
numberOfMove = 1
sixCount = 0
changePlayer()
end
dice:draw()
-- Restore orthographic projection
ortho()
-- Restore the view matrix to the identity
viewMatrix(matrix())

board:draw()
if redFlag then
red:draw()
end
if greenFlag then
green:draw()
end
if blueFlag then
blue:draw()
end
if yellowFlag then
yellow:draw()
end

-- Draw a label at the top of the screen
fill(0, 0, 0, 255)
font("Zapfino")
fontSize(25)
text(dice:name(), board.x, board.y)

font("AmericanTypewriter-Condensed")
fontSize(22)
textWrapWidth(200)
gameMsg = "Turn for "..activePlayer.playerName
text(gameMsg,WIDTH-120, HEIGHT-HEIGHT*0.15)
text(winMsg1,WIDTH-120, HEIGHT-HEIGHT*0.35)
text(winMsg2,WIDTH-120, HEIGHT-HEIGHT*0.37)
text(winMsg3,WIDTH-120, HEIGHT-HEIGHT*0.39)
text(winMsg4,WIDTH-120, HEIGHT-HEIGHT*0.41)
fontSize(16)
text(inGameMsg, WIDTH-120, HEIGHT-HEIGHT*0.26)

if gameOver then
fill(0, 0, 0, 141)
font("Futura-CondensedExtraBold")
fontSize(150)
textWrapWidth(1000)
text("Game Over", board.x, board.y)
end
fill(255)
end
end

function touched (touch)

else
dice:touched(touch)
board:touched(touch)
end

if redFlag and currentPlayer == 1 and moveFlag then
if allTokensTried < 4 then
red:touched(touch)
else
moveFlag = false
changePlayer()
end
end
if greenFlag and currentPlayer == 2 and moveFlag then
if allTokensTried < 4 then
green:touched(touch)
else
moveFlag = false
changePlayer()
end
end
if blueFlag and currentPlayer == 3 and moveFlag then
if allTokensTried < 4 then
blue:touched(touch)
else
moveFlag = false
changePlayer()
end
end
if yellowFlag and currentPlayer == 4 and moveFlag then
if allTokensTried < 4 then
yellow:touched(touch)
else
moveFlag = false
changePlayer()
end
end
end
``````
• Posts: 65

``````Menu = class()

-- you can accept and set parameters here
self.title = "Ludo"

end

redFlag = false
greenFlag = false
blueFlag = false
yellowFlag = false
gameOver = false
red = nil
green = nil
blue = nil
yellow = nil

gameMsg = ""
inGameMsg = ""
winMsg1 = ""
winMsg2 = ""
winMsg3 = ""
winMsg4 = ""

win = 1

end

-- Codea does not automatically call this method
background(134, 145, 147, 255)
rectMode(CENTER)
strokeWidth(10)
stroke(255, 255, 255, 255)
fill(255, 0, 0, 155)
rect(WIDTH/3, HEIGHT - HEIGHT/3,300,200)
fill(25,156,44,155)
rect(WIDTH - WIDTH/3, HEIGHT - HEIGHT/3,300,200)
fill(10,67,222,155)
rect(WIDTH/3, HEIGHT/3,300,200)
fill(244,255,0,155)
rect(WIDTH - WIDTH/3, HEIGHT/3,300,200)

fill(86, 31, 81, 255)
noStroke()
rect(WIDTH-40,40,50,50)
fontSize(30)
fill(255, 255, 255, 255)
text("X",WIDTH-40,40)

ellipseMode(CENTER)
fill(239, 239, 239, 102)
noStroke()
ellipse(WIDTH/2,HEIGHT/2,300,300)
fill(198, 214, 225, 126)
ellipse(WIDTH/2,HEIGHT/2,500,500)

font("HelveticaNeue-CondensedBold")
fontSize(50)
fill(0, 0, 0, 201)
text("1 Player", WIDTH/3, HEIGHT - HEIGHT/3)
text("2 Player", WIDTH - WIDTH/3, HEIGHT - HEIGHT/3)
text("3 Player", WIDTH/3, HEIGHT/3)
text("4 Player", WIDTH - WIDTH/3, HEIGHT/3)
font("MarkerFelt-Wide")
fill(50, 66, 90, 255)
fontSize(60)
text("LUDO",WIDTH/2,HEIGHT-80)
fill(196, 198, 201, 255)
text("LUDO",WIDTH/2-5,HEIGHT-75)
end

if touch.state == ENDED then
if touch.x > WIDTH/3-150 and touch.x < WIDTH/3+150 and
touch.y > HEIGHT-HEIGHT/3-100 and touch.y < HEIGHT-HEIGHT/3+100 then
--numberOfPlayer = 2
--currentPlayer = 1

--red = Tokens(board.x-250, board.y+250,"red")
--green = Tokens(board.x+250, board.y-250,"green")

--redFlag = true
--greenFlag = true
textWrapWidth(500)
gameMsg = "Single Player vs CPU is not available yet"

elseif touch.x > WIDTH/3-150 and touch.x < WIDTH/3+150 and
touch.y > HEIGHT/3-100 and touch.y < HEIGHT/3+100 then
numberOfPlayer = 3
currentPlayer = 1

red = Tokens(board.x-250, board.y+250,"red")
green = Tokens(board.x+250, board.y-250,"green")
blue = Tokens(board.x+250,board.y+250,"blue")

redFlag = true
greenFlag = true
blueFlag = true

elseif touch.x > WIDTH - WIDTH/3-150 and touch.x < WIDTH - WIDTH/3+150 and
touch.y > HEIGHT-HEIGHT/3-100 and touch.y < HEIGHT-HEIGHT/3+100 then
numberOfPlayer = 2
currentPlayer = 1
red = Tokens(board.x-250, board.y+250,"red")
green = Tokens(board.x+250, board.y-250,"green")

redFlag = true
greenFlag = true

elseif touch.x > WIDTH - WIDTH/3-150 and touch.x < WIDTH - WIDTH/3+150 and
touch.y > HEIGHT/3-100 and touch.y < HEIGHT/3+100 then
numberOfPlayer = 4
currentPlayer = 1

red = Tokens(board.x-250, board.y+250,"red")
green = Tokens(board.x+250, board.y-250,"green")
blue = Tokens(board.x+250,board.y+250,"blue")
yellow = Tokens(board.x-250,board.y-250,"yellow")

redFlag = true
greenFlag = true
blueFlag = true
yellowFlag = true

elseif touch.x > WIDTH - 60 and touch.x < WIDTH - 20 and touch.y > 20 and touch.y < 60 then
close()
end

activePlayer = red
end
-- Codea does not automatically call this method
end

``````
• Posts: 65

# Board

``````Board = class()

function Board:init(x)
-- you can accept and set parameters here
self.x = WIDTH/2-100
self.y = HEIGHT/2
end

function Board:draw()
-- Codea does not automatically call this method
rectMode(CENTER)
smooth()
fill(99, 110, 133, 255)
noStroke()
rect(self.x,self.y,765,765)
fill(255, 255, 255, 255)
rect(self.x,self.y,750,750)

lineCapMode(SQUARE)
stroke(0, 0, 0, 255)
strokeWidth(2)
line(self.x-125,self.y-375,self.x-125,self.y+375)
line(self.x+125,self.y-375,self.x+125,self.y+375)
line(self.x-375,self.y-125,self.x+375,self.y-125)
line(self.x-375,self.y+125,self.x+375,self.y+125)
--strokeWidth(7)

line(self.x-125,self.y-41.5,self.x-41.5,self.y-125)
line(self.x+125,self.y-41.5,self.x+41.5,self.y-125)
line(self.x-125,self.y+41.5,self.x-41.5,self.y+125)
line(self.x+125,self.y+41.5,self.x+41.5,self.y+125)

dy = 21
dx = 83.3
side=125
y=41.5
w=86
h=43

for i= 1,2 do
if i==1 then
fill(255, 0, 0, 255)
elseif i == 2 then
fill(25, 156, 44, 255)
end
local r,g,b,a = fill()

for j=1,6 do
fill(255, 255, 255, 255)
rect(self.x-dx, self.y+side+dy, w, h)
rect(self.x+dx, self.y+side+dy, w, h)
if j==6 then
rect(self.x, self.y+side+dy, w, h)
fill(r,g,b,a)
rect(self.x, self.y+side+dy, w-15, h-15)
ellipseMode(CENTER)
if i == 1 then
ellipse(self.x-dx,self.y+side+dy,40,40)
rect(self.x,self.y+dx,w,dx)
fill(r,g,b,a-150)
rect(self.x-250,self.y+250,120,220)
rect(self.x-250,self.y+250,220,120)
else
ellipse(self.x+dx+1,self.y+side+dy,40,40)
rect(self.x,self.y-dx,w,dx)
fill(r,g,b,a-150)
rect(self.x+250,self.y-250,120,220)
rect(self.x+250,self.y-250,220,120)
end
else
fill(r,g,b,a)
rect(self.x, self.y+side+dy, w, h)
end
dy=dy+y
end

dy=-dy
y=-y
end

dx = 21
dy = 83.3
side=125
x=41.5
h=86
w=43

for i= 1,2 do
if i==1 then
fill(10, 67, 222, 255)
elseif i == 2 then
fill(244, 255, 0, 255)
end
local r,g,b,a = fill()

for j=1,6 do
fill(255, 255, 255, 255)
rect(self.x+side+dx, self.y-dy, w, h)
rect(self.x+side+dx, self.y+dy, w, h)
if j==6 then
rect(self.x+side+dx, self.y, w, h)
fill(r,g,b,a)
rect(self.x+side+dx, self.y, w-15, h-15)
ellipseMode(CENTER)
if i ==1 then
ellipse(self.x+side+dx, self.y+dy, 40, 40)
rect(self.x+dy,self.y,dy,h)
fill(r,g,b,a-150)
rect(self.x+250,self.y+250,120,220)
rect(self.x+250,self.y+250,220,120)
else
ellipse(self.x+side+dx, self.y-dy, 40, 40)
rect(self.x-dy,self.y,dy,h)
fill(r,g,b,a-150)
rect(self.x-250,self.y-250,120,220)
rect(self.x-250,self.y-250,220,120)
end
else
fill(r,g,b,a)
rect(self.x+side+dx, self.y, w, h)
end

dx=dx+x
end
dx=-dx
x=-x
end
markCurrentPlayer(self.x,self.y)
fill(255, 255, 255, 204)
noStroke()
rect(WIDTH-120,HEIGHT-HEIGHT*0.04,200,40)
fill(79, 83, 111, 255)
font("HelveticaNeue-CondensedBlack")
fontSize(30)

fill(129, 127, 127, 134)
rect(WIDTH-120,HEIGHT-HEIGHT*0.3,200,300)
fill(255, 255, 255, 255)
font("HelveticaNeue-CondensedBlack")
end

function Board:touched(touch)
if touch.state == ENDED then
if touch.x > WIDTH-220 and touch.x < WIDTH-20 and
touch.y > HEIGHT-HEIGHT*0.04-20 and touch.y < HEIGHT-HEIGHT*0.04+20 then
end
end
-- Codea does not automatically call this method
end

``````
• Posts: 65

# Dice

``````Dice = class()

function Dice:name()
return "Ludo"
end

function Dice:init()
-- all the unique vertices that make up a cube
local vertices = {
vec3(-0.3, -0.3,  0.3), -- Left  bottom front
vec3( 0.3, -0.3,  0.3), -- Right bottom front
vec3( 0.3,  0.3,  0.3), -- Right top    front
vec3(-0.3,  0.3,  0.3), -- Left  top    front
vec3(-0.3, -0.3, -0.3), -- Left  bottom back
vec3( 0.3, -0.3, -0.3), -- Right bottom back
vec3( 0.3,  0.3, -0.3), -- Right top    back
vec3(-0.3,  0.3, -0.3), -- Left  top    back
}

local faceverts = { vertices, vertices, vertices,
vertices, vertices, vertices }
local cube = {}
-- now construct a cube out of the vertices above
local cubeverts = {
-- Front
vertices, vertices, vertices,
vertices, vertices, vertices,
-- Right
vertices, vertices, vertices,
vertices, vertices, vertices,
-- Back
vertices, vertices, vertices,
vertices, vertices, vertices,
-- Left
vertices, vertices, vertices,
vertices, vertices, vertices,
-- Top
vertices, vertices, vertices,
vertices, vertices, vertices,
-- Bottom
vertices, vertices, vertices,
vertices, vertices, vertices,
}

-- all the unique texture positions needed
local texvertices = { vec2(0.0,1), vec2(0.33,1), vec2(0.66,1),vec2(1,1),
vec2(0.0,0.5), vec2(0.33,0.5), vec2(0.66,0.5), vec2(1,0.5),
vec2(0.0,0.0), vec2(0.33,0.0), vec2(0.66,0,0), vec2(1,0.0)}

-- apply the texture coordinates to each triangle
local cubetexCoords = {
-- Front
texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices,
--Right
texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices,
-- Back
texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices,
-- Left
texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices,
-- Top
texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices,
-- Bottom
texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices
}

local one = { texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices}
local two = { texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices}
local three = { texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices}
local four = { texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices}
local five = { texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices}
local six = { texvertices, texvertices, texvertices,
texvertices, texvertices, texvertices}

faceCoords = {one,two,three,four,five,six}

--[[local x=1
for i = 1,6 do
for j =1,6 do
cube[x] = faceCoords[i][j]
x = x + 1
end
end--]]

-- now we make our 3 different block types
self.ms = mesh()
self.ms.vertices = cubeverts
self.ms.texture = "Dice:Dice"
--self.ms.texture = img
self.ms.texCoords = cubetexCoords
self.ms:setColors(180,180,180,255)
--color(210, 209, 209, 255)

self.fs = mesh()
self.fs.vertices = faceverts
self.fs.texture = "Dice:Dice"
self.fs.setColors(255,255,255,255)
end

function Dice:draw()
pushMatrix()
pushStyle()

-- apply each transform  need - rotate, scale, translate to the correct place
resetMatrix()
rotate(Angle,1,1,0)
local s = Size*0.5
scale(s,s,s)
translate(1,1,0)
self.ms:draw()

if face then
self.fs.texCoords = faceCoords[currentRoll]
self.fs:draw()
end
popStyle()
popMatrix()
end

function Dice:touched(touch)
-- Codea does not automatically call this method

if CurrentTouch.state == ENDED  then
if touch.x > WIDTH-130 and touch.x<WIDTH-20 and touch.y > 0 and touch.y< 110 then
flag = true
diceRolled=true
end
end
end

``````
• Posts: 65

# Tokens

``````Tokens = class()

function Tokens:init(x,y,col)
-- you can accept and set parameters here

self.token1origin = vec2(x-35,y+35)
self.token2origin = vec2(x+35,y+35)
self.token3origin = vec2(x-35,y-35)
self.token4origin = vec2(x+35,y-35)

self.token1pos = self.token1origin
self.token2pos = self.token2origin
self.token3pos = self.token3origin
self.token4pos = self.token4origin

self.tokensAtStart = 4
self.tokensOnBoard = 0
self.tokensAtHome = 0
self.position = {}
self.token1index = 0
self.token2index = 0
self.token3index = 0
self.token4index = 0

if col == "red" then
self.playerName = "Player 1"
fill(139, 43, 35, 255)
self.position = vec2(board.x-83.3,board.y+125+21*10.9)
elseif col == "green" then
self.playerName = "Player 2"
fill(64, 127, 46, 255)
self.position = vec2(board.x+83.3,board.y-125-21*10.9)
elseif col == "blue" then
self.playerName = "Player 3"
fill(48, 65, 112, 255)
self.position = vec2(board.x+125+21*10.9,board.y+83.3)
elseif col == "yellow" then
self.playerName = "Player 4"
fill(143, 140, 34, 255)
self.position = vec2(board.x-125-21*10.9,board.y-83.3)
end

self.tokenName = col
self.r, self.g,self.b,self.a = fill()
self:setPosition()
end

function Tokens:setPosition()
if self.tokenName == "red" then
a = 41.5 b = 61.5 c = 84.5
d=0 f=0 g=1
elseif self.tokenName == "green" then
a=-41.5 b=-61.5 c=-84.5
d=0 f=0 g=1
elseif self.tokenName == "yellow" then
a=0 b=-61.5 c=0
d=-41.5 f=43 g=-1
elseif self.tokenName == "blue" then
a=0 b=61.5 c=0
d=41.5 f=-43 g=-1
end

for i = 2,58 do
if i>1 and i<7 or i>20 and i<26 then
table.insert(self.position,i,vec2(self.position[i-1].x-d,self.position[i-1].y-a))
elseif i == 7 then
table.insert(self.position,i,vec2(self.position[i-1].x-b,self.position[i-1].y-b*g))
elseif i>7 and i < 13 or i>40 and i<46 then
table.insert(self.position,i,vec2(self.position[i-1].x-a,self.position[i-1].y+d))
elseif i==13 or i==14 then
table.insert(self.position,i,vec2(self.position[i-1].x-d+f,self.position[i-1].y-c))
elseif i>14 and i<20 or i>33 and i<39 then
table.insert(self.position,i,vec2(self.position[i-1].x+a*g,self.position[i-1].y-d))
elseif i == 20 then
table.insert(self.position,i,vec2(self.position[i-1].x+b*g,self.position[i-1].y-b))
elseif i==26 or i==27 then
table.insert(self.position,i,vec2(self.position[i-1].x+c,self.position[i-1].y-d+f))
elseif i>27 and i<33 or i>46 and i <52 then
table.insert(self.position,i,vec2(self.position[i-1].x+d,self.position[i-1].y+a))
elseif i == 33 then
table.insert(self.position,i,vec2(self.position[i-1].x+b,self.position[i-1].y+b*g))
elseif i == 39 or i == 40 then
table.insert(self.position,i,vec2(self.position[i-1].x+d-f,self.position[i-1].y+c))
elseif i == 46 then
table.insert(self.position,i,vec2(self.position[i-1].x-b*g,self.position[i-1].y+b))
elseif i==52 then
table.insert(self.position,i,vec2(self.position[i-1].x-c,self.position[i-1].y+d-f))
elseif i<=58 then
table.insert(self.position,i,vec2(self.position[i-1].x-d+f*c,self.position[i-1].y-a))

end
end

end

function Tokens:draw()
-- Codea does not automatically call this method
ellipseMode(CENTER)
fill(self.r,self.g,self.b,self.a)
strokeWidth(3)
stroke(205, 205, 205, 255)

ellipse(self.token1pos.x,self.token1pos.y, 40,40)
ellipse(self.token2pos.x,self.token2pos.y, 40,40)
ellipse(self.token3pos.x,self.token3pos.y, 40,40)
ellipse(self.token4pos.x,self.token4pos.y, 40,40)

strokeWidth(1)
ellipse(self.token1pos.x,self.token1pos.y, 20,20)
ellipse(self.token2pos.x,self.token2pos.y, 20,20)
ellipse(self.token3pos.x,self.token3pos.y, 20,20)
ellipse(self.token4pos.x,self.token4pos.y, 20,20)

font("HelveticaNeue-CondensedBold")
fontSize(20)
fill(224, 224, 224, 255)
text(self.playerName,self.token1origin.x+40,self.token1origin.y+50)
fill(1, 1, 1, 255)
text(self.playerName,self.token1origin.x+38,self.token1origin.y+52)
end

function Tokens:getandsetToken(toknum,x)
self:settoNextPos(toknum,x)
setTokentoOrigin()

end

function Tokens:settoNextPos(toknum,x)

if toknum == 1 then
self.token1index = x
self.token1pos = vec2(self.position[self.token1index].x, self.position[self.token1index].y)
elseif toknum == 2 then
self.token2index = x
self.token2pos = vec2(self.position[self.token2index].x, self.position[self.token2index].y)
elseif toknum == 3 then
self.token3index = x
self.token3pos = vec2(self.position[self.token3index].x, self.position[self.token3index].y)
elseif toknum == 4 then
self.token4index = x
self.token4pos = vec2(self.position[self.token4index].x, self.position[self.token4index].y)
end
if x==1 then
self.tokensAtStart = self.tokensAtStart - 1
self.tokensOnBoard = self.tokensOnBoard + 1
elseif x==58 then
self.tokensOnBoard = self.tokensOnBoard - 1
self.tokensAtHome = self.tokensAtHome + 1

if win == 1 then
winMsg1 = "Place 1: "..activePlayer.playerName
elseif win == 2 then
winMsg2 = "Place 2: "..activePlayer.playerName
elseif win == 3 then
winMsg3 = "Place 3: "..activePlayer.playerName
end
win = win + 1
end
numberOfMove = numberOfMove - 1
if sixCount == 3 then
inGameMsg = "No more chance for "..activePlayer.playerName.." to roll as six appeared 3 times"
numberOfMove = 0
end
moveFlag = false
end

function Tokens:moveToken(pos,origin,index,toknum)

if pos == origin and currentRoll == 6 then
if positionOccupied(index+1) then
if sameColor() then
debugmsg = "Try another token"
allTokensTried = allTokensTried + 1
return
else
self:getandsetToken(toknum,index+1)
end
else
self:settoNextPos(toknum,index+1)
end
elseif pos~=origin then
if index+currentRoll <= 58 then
if positionOccupied(index+currentRoll)then
if sameColor() then
debugmsg = "Try another token"
allTokensTried = allTokensTried + 1
return
else
self:getandsetToken(toknum,index+currentRoll)
end
else
self:settoNextPos(toknum,index+currentRoll)
end
else
debugmsg = "Try different token"
return
end
end

end

``````

~~~

• Posts: 65

# Tokens - Continued

``````function Tokens:touched(touch)
if touch.state == ENDED then

if touch.x>self.token1pos.x-20 and touch.x<self.token1pos.x+20 and
touch.y<self.token1pos.y+20 and touch.y>self.token1pos.y-20 then

self:moveToken(self.token1pos,self.token1origin,self.token1index,1)

elseif touch.x>self.token2pos.x-20 and touch.x<self.token2pos.x+20 and
touch.y<self.token2pos.y+20 and touch.y>self.token2pos.y-20 then

self:moveToken(self.token2pos,self.token2origin,self.token2index,2)

elseif touch.x>self.token3pos.x-20 and touch.x<self.token3pos.x+20 and
touch.y<self.token3pos.y+20 and touch.y>self.token3pos.y-20 then

self:moveToken(self.token3pos,self.token3origin,self.token3index,3)

elseif touch.x>self.token4pos.x-20 and touch.x<self.token4pos.x+20 and
touch.y<self.token4pos.y+20 and touch.y>self.token4pos.y-20 then

self:moveToken(self.token4pos,self.token4origin,self.token4index,4)
end

end
-- Codea does not automatically call this method
end
``````
• Posts: 65

# Functions

``````function rotateDice()
if flag then
face=false
Angle = Angle+10
if Angle ==520 then
Angle = 160
flag=false
face = true
currentRoll = math.random(1,6)
diceRolled = false
inGameMsg = ""
if currentRoll == 6 then
sixCount = sixCount + 1
numberOfMove = numberOfMove+1
if activePlayer.tokensAtStart>0 or activePlayer.tokensOnBoard >0 then
if moveAvailable() then
moveFlag = true
else
if numberOfMove>1 then
return
else
numberOfMove = 1
changePlayer()
end
end
end

elseif currentRoll<6 and currentRoll>0 then
if activePlayer.tokensOnBoard>0 then
numberOfMove = 1
if moveAvailable() then
moveFlag = true
else
if numberOfMove>1 then
return
else
numberOfMove = 1
changePlayer()
end
end
else
numberOfMove = 1
changePlayer()
end
end
end
end
end

function positionOccupied(nextPos)

for i=1,numberOfPlayer do
if i==1 then
tok = red
elseif i == 2 then
tok = green
elseif i == 3 then
tok = blue
elseif i == 4 then
tok = yellow
end

if tok.token1index~= 0 and math.abs(tok.position[tok.token1index].x-activePlayer.position[nextPos].x)<3 and math.abs(tok.position[tok.token1index].y - activePlayer.position[nextPos].y)<3 then
occupiedToken = 1
return true
elseif tok.token2index~= 0 and math.abs(tok.position[tok.token2index].x-activePlayer.position[nextPos].x)<3 and math.abs(tok.position[tok.token2index].y - activePlayer.position[nextPos].y)<3 then
occupiedToken = 2
return true
elseif tok.token3index~= 0 and math.abs(tok.position[tok.token3index].x -activePlayer.position[nextPos].x)<3 and math.abs(tok.position[tok.token3index].y - activePlayer.position[nextPos].y)<3 then
occupiedToken = 3
return true
elseif tok.token4index~= 0 and math.abs(tok.position[tok.token4index].x-activePlayer.position[nextPos].x)<3 and math.abs(tok.position[tok.token4index].y - activePlayer.position[nextPos].y)<3 then
occupiedToken = 4
return true
end
end
tok = nil
return false
end

function sameColor()
if tok.tokenName == activePlayer.tokenName then
return true
else
return false
end
end

function setTokentoOrigin()
if occupiedToken == 1 then
tok.token1index = 0
tok.token1pos = tok.token1origin
elseif occupiedToken == 2 then
tok.token2index = 0
tok.token2pos = tok.token2origin
elseif occupiedToken == 3 then
tok.token3index = 0
tok.token3pos = tok.token3origin
elseif occupiedToken == 4 then
tok.token4index = 0
tok.token4pos = tok.token4origin
end

tok.tokensAtStart = tok.tokensAtStart + 1
tok.tokensOnBoard = tok.tokensOnBoard - 1

end

function changePlayer()
if currentPlayer == numberOfPlayer then
currentPlayer = 1
activePlayer = red
else
currentPlayer = currentPlayer + 1
if currentPlayer == 2 then
activePlayer = green
elseif currentPlayer == 3 then
activePlayer = blue
elseif currentPlayer == 4 then
activePlayer = yellow
end
end
allTokensTried = 0
end

function markCurrentPlayer(x,y)
rectMode(CENTER)
strokeWidth(4)
fill(115, 115, 115,0)

if currentPlayer == 1 then
stroke(255,0,0,150)
rect(x-250,y+250,240,240)
stroke(255,0,0,100)
rect(x-250,y+250,235,235)
stroke(255,0,0,50)
rect(x-250,y+250,230,230)
elseif currentPlayer == 2 then
stroke(25,156,44,150)
rect(x+250,y-250,240,240)
stroke(25,156,44,100)
rect(x+250,y-250,235,235)
stroke(25,156,44,50)
rect(x+250,y-250,230,230)
elseif currentPlayer == 3 then
stroke(10,67,222,150)
rect(x+250,y+250,240,240)
stroke(10,67,222,100)
rect(x+250,y+250,235,235)
stroke(10,67,222,50)
rect(x+250,y+250,230,230)
elseif currentPlayer == 4 then
stroke(244,255,0,150)
rect(x-250,y-250,240,240)
stroke(244,255,0,100)
rect(x-250,y-250,235,235)
stroke(244,255,0,50)
rect(x-250,y-250,230,230)
end
end

function moveAvailable()
if activePlayer.tokensAtStart>0 and currentRoll==6 then
return true
else
if (activePlayer.token1index>0 and
activePlayer.token1index+currentRoll<=#activePlayer.position) or
(activePlayer.token2index>0 and
activePlayer.token2index+currentRoll<=#activePlayer.position) or
(activePlayer.token3index>0 and
activePlayer.token3index+currentRoll<=#activePlayer.position) or
(activePlayer.token4index>0 and
activePlayer.token4index+currentRoll<=#activePlayer.position) then
return true
else
return false
end
end
end
``````