tech/game

21/07/13 TicTacToe - SQUARE STATUS EMPTY OR FULL

tech-lover 2021. 7. 13. 15:52

https://youtu.be/AyB057f0Py8

 

```

local composer = require( "composer" )

local scene = composer.newScene()

 

-- -----------------------------------------------------------------------------------

-- Code outside of the scene event functions below will only be executed ONCE unless

-- the scene is removed entirely (not recycled) via "composer.removeScene()"

-- -----------------------------------------------------------------------------------

 

local grpBackground

local grpMain

local grpUI

 

local grpBoardBG

local grpBoardFG



local backgroundImage

local gridSquare

 

local imgLogo

local imgGameTitle

 

local arrayBoard = {}

 

local player1

local player2

local playersTurn = math.random(2)

 

local message

local messageOptions = {

    parent = grpUI,

    text = "Hello World",

    x = display.contentCenterX,

    y = display.contentCenterY-210,

    width = display.contentWidth - 20,

    font = "fonts-tictactoe/BradBunR.ttf",

    fontSize = 40,

    align = "center"

}

 

local optionsZeros = 

{

    text = "O",

    x = display.contentCenterX,

    y = display.contentCenterY,

    -- font = native.systemFont,

    font = "fonts-tictactoe/BradBunR.ttf",

    fontSize = 120,

    align = "center"  -- Alignment parameter

}

 

local optionsCrosses = 

{

    text = "X",

    x = display.contentCenterX,

    y = display.contentCenterY,

    font = "fonts-tictactoe/BradBunR.ttf",

    fontSize = 120,

    align = "center"

}

 

-- -----------------------------------------------------------------------------------

-- Scene event functions

-- -----------------------------------------------------------------------------------

 

-- create()

function scene:create( event )

 

    local sceneGroup = self.view

    -- Code here runs when the scene is first created but has not yet appeared on screen

 

    grpBackground = display.newGroup()  

    grpMain = display.newGroup()   

    grpUI = display.newGroup() 

 

    sceneGroup:insert(grpBackground)

    sceneGroup:insert(grpMain)

    sceneGroup:insert(grpUI)

 

    grpBoardBG = display.newGroup() 

    grpBoardFG = display.newGroup() 

    grpMain:insert(grpBoardBG)

    grpBoardBG:insert(grpBoardFG)

 

    grpBoardFG:toBack()

    grpBoardFG:toFront()

 

    backgroundImage = display.newImageRect(grpBackground, "images-tictactoe/background-orange.jpg"7681024)

    backgroundImage.x = display.contentCenterX

    backgroundImage.y = display.contentCenterY

 

    local gridBoarder = display.newRect(grpBoardBG, display.contentCenterX, display.contentCenterY, 300300)

    gridBoarder.alpha = 0.5

    gridBoarder:toBack()

    gridBoarder:setFillColor(1110.1)

    gridBoarder.strokeWidth = 10

    gridBoarder:setStrokeColor(00.50.5)

 

    local imgLogo = display.newImageRect(grpMain, "images-tictactoe/logo.png"

    7070)

    imgLogo.x = display.contentCenterX - 130

    imgLogo.y = display.contentCenterY - 300

    imgLogo:rotate(-10)

    imgLogo:setFillColor(0.50.51)

 

    local imgGameTitle = display.newImageRect(grpMain, "images-tictactoe/game-studio.png"1000/5358/5)

    imgGameTitle.x = display.contentCenterX + 10

    imgGameTitle.y = display.contentCenterY - 300

    imgGameTitle:setFillColor(0.511)

 

    message = display.newText(messageOptions)

 

    player1 = display.newText(messageOptions)

    player1.playerNum = 1

    player1.character = "zeros"

    player1.name = "Player 1"

    player1.isVisible = false

 

    player2 = display.newText(messageOptions)

    player2.playerNum = 2

    player2.character = "crosses"

    player2.name = "Player 2"

    player2.isVisible = false



end

 

 

-- show()

function scene:show( event )

 

    local sceneGroup = self.view

    local phase = event.phase

 

    if ( phase == "will" ) then

        -- Code here runs when the scene is still off screen (but is about to come on screen)



        local counterSquareNumber = 1

        local function drawSquare(xPosIn, yPosIn)

            print("sqaure")

            gridSquare = display.newRect(grpBoardBG, xPosIn, yPosIn, 100100)

            gridSquare.strokeWidth = 3

            gridSquare:setStrokeColor( 000)

            gridSquare.isVisible = true

            gridSquare:toBack() 

            gridSquare.number = counterSquareNumber

            gridSquare.status = "EMPTY"

            table.insert( arrayBoard, counterSquareNumber, gridSquare)

 

            counterSquareNumber = counterSquareNumber + 1

 

        end



        local function drawRow(xPosIn, yPosIn) 

            print("drawRow()")

 

            local numCols = 3

            local xPos = xPosIn

            local yPos = yPosIn

 

            for count=1, numCols, 1 do

                print("for loop")

 

                drawSquare(xPos, yPos)

                xPos = xPos + 100



            end

 

        end

 

        local function drawGrid(xPosIn, yPosIn)

            print("drawGrid()")

 

            local numRows = 3

            local xPos = xPosIn

            local yPos = yPosIn

 

            for count=1, numRows, 1 do

            

                print("for loop rows")

                drawRow(xPos, yPos)

                yPos = yPos + 100

 

            end

 

        end

 

        -- Starting box coordinates (top left box 1)

        local xPos = display.contentCenterX - 100

        local yPos = display.contentCenterY - 100

        drawGrid(xPos, yPos)

 

        grpBoardBG.y = grpBoardBG.y + 20

 

        message.text = "It's Player " .. playersTurn .. "'s Turn"

 

    elseif ( phase == "did" ) then

        -- Code here runs when the scene is entirely on screen

 

        local function drawZeros(xPosIn, yPosIn)

                

            local charZeros = display.newText( optionsZeros )

            grpBoardFG:insert(charZeros)

            charZeros:setFillColor( 10.20.1 )

            charZeros.isVisible = true

            charZeros:toFront()

            charZeros.x = xPosIn

            charZeros.y = yPosIn

        end

    

        local function drawCrosses(xPosIn, yPosIn)

            local charCrosses = display.newText( optionsCrosses )

            grpBoardFG:insert(charCrosses)

            charCrosses:setFillColor( 0.10.51 )

            charCrosses.isVisible = true        

            charCrosses:toFront()

            charCrosses.x = xPosIn

            charCrosses.y = yPosIn

        end

 

        

        local function whichSquareTapped(event)

            print("square number is: " .. event.target.number)

            print("playersTurn ".. playersTurn)



            local function updateSquareStatus(inCharacter)

                -- print("updateSqureStatus")

                local character = tostring(inCharacter)

                for index, object in ipairs (arrayBoard) do

                    if object.number == event.target.number then

                        print("match")

                        object.status = character

                    else

                        print("non match")

                    end

                    print("["..index.."]"..object.number, object.status)

                end

                character = nil

            end

 

            local xPos = event.target.x

            local yPos = event.target.y

 

            if playersTurn == player1.playerNum then

                print("player1.playerNum ".. player1.playerNum)

                print("player1.character ".. player1.character)

                drawZeros(xPos, yPos)

                updateSquareStatus(player1.character)

                playersTurn = 2

                message.text = "It's Player " .. playersTurn .. "'s Turn"

 

            elseif playersTurn == player2.playerNum then

                print("player2.playerNum ".. player2.playerNum)

                print("player2.character ".. player2.character)

                drawCrosses(xPos, yPos)

                updateSquareStatus(player2.character)

                playersTurn = 1

                message.text = "It's Player " .. playersTurn .. "'s Turn"

 

            else

                -- error do nothing

            end




        end

 

        for index, value in ipairs(arrayBoard) do

            local objSquare = value

 

            print("[" .. index .. "] " .. objSquare.number)

            objSquare:addEventListener("tap", whichSquareTapped)

 

        end



    end

end

 

 

-- hide()

function scene:hide( event )

 

    local sceneGroup = self.view

    local phase = event.phase

 

    if ( phase == "will" ) then

        -- Code here runs when the scene is on screen (but is about to go off screen)

 

    elseif ( phase == "did" ) then

        -- Code here runs immediately after the scene goes entirely off screen

 

    end

end

 

 

-- destroy()

function scene:destroy( event )

 

    local sceneGroup = self.view

    -- Code here runs prior to the removal of scene's view

 

end

 

 

-- -----------------------------------------------------------------------------------

-- Scene event function listeners

-- -----------------------------------------------------------------------------------

scene:addEventListener( "create", scene )

scene:addEventListener( "show", scene )

scene:addEventListener( "hide", scene )

scene:addEventListener( "destroy", scene )

-- -----------------------------------------------------------------------------------

 

return scene

```