Every three numbers?

Hi,
I'm back making 2 more games for playdate. One of them Im trying to switch player turns every 3 moves based on 1-21.
if "whosturn" is 1-3 player1 goes (shake camera test)
if "whosturn" is 4-6 player2 goes (invert test)
if "whosturn" is 7-9 player1 goes (shake test) and so forth.
is this best done with if/elseifs or just if? I'm not sure best way to code 1-3, 4-6 etc. any ideas will help!

This should be all you need.

// start with player one

on load do
player_one = 1
player_two = 0
end

on turn do
if turns>=1 then
if turns<=3 then
player_one = 1
player_two = 0
end
elseif turns>=4 then
if turns<=6 then
player_one = 0
player_two = 1
end
elseif turns>=7 then
if turns<=9 then
player_one = 1
player_two = 0
end
end
end
end
end

Hope this helped.

thank you. Its only workin for player1 right now. Im putting it all in the on update, is that the best place for it? thanks.

This is the fixed version:

on load do
player_one = 1
player_two = 0
end

on update do
if turns>=1 then
if turns<=3 then
player_one = 1
player_two = 0
end
if turns>=4 then
if turns<=6 then
player_one = 0
player_two = 1
end
if turns>=7 then
if turns<=9 then
player_one = 1
player_two = 0
end
end
end
end
end

wonderful yes that works!!!! thank you!

Two things of note. One, branching can be expensive (and verbose in code). Two, whenever you recognize a pattern, there's almost always a formula that you can use to derive what you want; this is almost always faster, more efficient, and much shorter.

for turn = 1, 21 do
	whosturn = ((turn - 1) // 3) % 2 + 1
	print("Turn " .. turn .. " is player " .. whosturn)
end

In this example, we want to do things in groups of three, so we integer divide ( // ) by 3:
0 // 3 = 0, 1 // 3 = 0, 2 // 3 = 0, 3 // 3 = 1, 4 // 3 = 1, 5 // 3 = 1, 6 // 3 = 2, ...

Since turns start at 1 and the formula needs them to start at 0, we just subtract one from turn.

Now we have a sequence of 1, 1, 1, 2, 2, 2, 3, 3, 3,... that we need to convert to two values.

The %2 does that, by essentially dividing by 2 and looking at the remainder;
0 % 2 = 0, 1 % 2 = 1, 2 % 2 = 0, 3 % 2 = 1, 4 % 2 = 0,...

Applied to our list of 1, 1, 1, 2, 2, 2, 3, 3, 3,... it becomes 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1,....

Since we want player 1 or 2, instead of 0 or 1, we can just add one.

Alternatively, you could do this:

for turn = 1, 21 do
	playerOne = ((turn + 2 ) // 3) % 2
	playerTwo = 1 - playerOne

	print("Turn " .. turn .. "  playerOne: " .. playerOne .. "  playerTwo: " .. playerTwo)
end

This does the same thing as above, with a simple twist.

Since we want playerOne to be either a 0 or 1 (representing false and true), and we know % 2 gives us 0s and 1s, we add two to start further in the sequence so the first value we get is 1 for the first three times, then 0 for the next 3, and so on. No final adjustment needed.

Then playerTwo becomes 1 - playerOne, because 1 - 0 = 1, and 1 - 1 = 0. It is just the opposite.

And if you wanted true / false instead of 1 and 0, you could do this:

for turn = 1, 21 do
	playerOne = ((turn + 2 ) // 3) % 2 ~= 0
	playerTwo = not playerOne

	print("Turn " .. turn .. "  playerOne: " .. tostring(playerOne) .. "  playerTwo: " .. tostring(playerTwo))
end

Hope this helps,
-wls

thank you very much.