Tic Tac Toe Game – Fyne Golang tutorial Source Code

Tic Tac Toe Game – Fyne Golang tutorial Source Code
This is one of the project, I created while fixing someone coding problem. Hisham from india contacted to fix his golang program. while working on his code the idea came to my mind and I did it.
This code is not clean and need to be optimised. But I don’t know when I will fix it. So I posted as it is.
You can do whatever you want and can modify code, change images and colors to make it more attractive.
It has too much junk code also. Hope so I will fix it soon.
I have used 9 icons. It means we have 9 places to click. So we have 9 buttons also.
I have container.withoutlayout to arrange icons and button the way I want.
The default window size is 400×400.
A dialog box is used to  show result and also show when you start game.
In tic tac toe we have total 9 places. It mean one array/slice to store 9 places.
one array will store the human chosen “places”.
one array will store the machine chosen “places”
Here is the combination of successful result.
123
456
789
147
258
369
159
357
I have created a struct “combination” for 3 values. If one of these 3 places are used by human or system player. Winner will announced. Otherwise the process will continue.
Random function
Random function is used for system player. It will randomly select a number from 1 to 9.
It will check . If the place is used(already filled) by human player. It will fire again the random function and regenarate the number. and select the random number for human.

Download

Source Code


package main
// import fyne
import (
    "fmt"
    "image/color"
    "math/rand"
    "time"
    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/canvas"
    "fyne.io/fyne/v2/container"
    "fyne.io/fyne/v2/dialog"
    "fyne.io/fyne/v2/widget"
)
type Combinations struct {
    A int
    B int
    C int
}
func myRand(s [9]int) int {
    rand.Seed(time.Now().UnixNano())
    for i := 0; i < 9; i++ {
        randIdx := rand.Intn(len(s))
        if s[randIdx] == 0 {
            //fmt.Println("Randomly selected slice value : ", s[randIdx], randIdx)
            return randIdx
        }
    }
    return 0
}
func main() {
    a := app.New()
    w := a.NewWindow("Tic Tac Toe View")
    w.Resize(fyne.NewSize(400, 400))
    // empty slice for storing the places of the tic tac toe board
    // question mark image url
    question_asset := "C:/assets/question-mark2.png"
    slice1 := [9]int{0, 0, 0, 0, 0, 0, 0, 0, 0}
    slice1_sys := [9]int{0, 0, 0, 0, 0, 0, 0, 0, 0}
    slice2 := []Combinations{
        {1, 2, 3}, {4, 5, 6}, {7, 8, 9},
        {1, 4, 7}, {2, 5, 8}, {3, 6, 9},
        {1, 5, 9}, {3, 5, 7},
    }
    label := widget.NewLabel("Get Ready")
    label.Alignment = fyne.TextAlignCenter
    dlg := dialog.NewCustom("Tic Tac Toe", "OK", label, w)
    dlg.Show()
    //print(slice1)
    // iconFile, err := os.Open("C:/assets/question-mark2.png")
    // if err != nil {
    //  log.Fatal(err)
    // }
    // r := bufio.NewReader(iconFile)
    // b, err := ioutil.ReadAll(r)
    // if err != nil {
    //  log.Fatal(err)
    // }
    // btn := widget.NewButtonWithIcon("X", fyne.NewStaticResource("icon", b), func() {
    //  // do something
    // })
    // btn.Move(fyne.NewPos(50, 50))
    // btn.Resize(fyne.NewSize(100, 100))
    ////////////////////
    title_result := widget.NewLabel("Tic Tac Toe")
    title_result.Move(fyne.NewPos(50, 10))
    ///////////////////////
    icon1 := canvas.NewImageFromFile(question_asset)
    ////
    icon2 := canvas.NewImageFromFile(question_asset)
    ///
    icon3 := canvas.NewImageFromFile(question_asset)
    ////
    icon4 := canvas.NewImageFromFile(question_asset)
    ////
    icon5 := canvas.NewImageFromFile(question_asset)
    ///
    icon6 := canvas.NewImageFromFile(question_asset)
    ///
    icon7 := canvas.NewImageFromFile(question_asset)
    ///
    icon8 := canvas.NewImageFromFile(question_asset)
    //
    icon9 := canvas.NewImageFromFile(question_asset)
    ///
    icon1.Move(fyne.NewPos(50, 50))
    icon1.Resize(fyne.NewSize(80, 80))
    btn1_label := ""
    btn1 := widget.NewButton(btn1_label, func() {
        if btn1_label == "" {
            btn1_label = "X"
            icon1.File = "C:/assets/cat.png"
            icon1.Refresh()
            //print(btn1_label)
        } else if btn1_label == "X" {
            btn1_label = "O"
            icon1.File = "C:/assets/dog.png"
            icon1.Refresh()
            //print(btn1_label)
        } else if btn1_label == "O" {
            btn1_label = "X"
            //print(btn1_label)
        }
        slice1[0] = 1
        //fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1 {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "You Won!"
                title_result.Refresh()
                label.Text = "You Won!"
                dlg.Show()
            }
        }
        store_rand_val := myRand(slice1)
        //fmt.Println("Randomly selected slice value : ", myRand(slice1))
        // I am using using 420 to avoid conflict
        slice1[store_rand_val] = 420
        slice1_sys[store_rand_val] = store_rand_val + 1
        // start of sys icon change
        if (store_rand_val + 1) == 1 {
            icon1.File = "C:/assets/robot.png"
            icon1.Refresh()
        } else if (store_rand_val + 1) == 2 {
            icon2.File = "C:/assets/robot.png"
            icon2.Refresh()
        } else if (store_rand_val + 1) == 3 {
            icon3.File = "C:/assets/robot.png"
            icon3.Refresh()
        } else if (store_rand_val + 1) == 4 {
            icon4.File = "C:/assets/robot.png"
            icon4.Refresh()
        } else if (store_rand_val + 1) == 5 {
            icon5.File = "C:/assets/robot.png"
            icon5.Refresh()
        } else if (store_rand_val + 1) == 6 {
            icon6.File = "C:/assets/robot.png"
            icon6.Refresh()
        } else if (store_rand_val + 1) == 7 {
            icon7.File = "C:/assets/robot.png"
            icon7.Refresh()
        } else if (store_rand_val + 1) == 8 {
            icon8.File = "C:/assets/robot.png"
            icon8.Refresh()
        } else if (store_rand_val + 1) == 9 {
            icon9.File = "C:/assets/robot.png"
            icon9.Refresh()
        }
        // end of sys icon change
        fmt.Println(slice1_sys)
        fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1_sys {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "System Won!"
                title_result.Refresh()
                label.Text = "System Won!"
                dlg.Show()
            }
        }
    })
    btn1.Move(fyne.NewPos(50, 50))
    btn1.Resize(fyne.NewSize(100, 100))
    ///////////////////////////
    icon2.Move(fyne.NewPos(150, 50))
    icon2.Resize(fyne.NewSize(80, 80))
    btn2_label := ""
    btn2 := widget.NewButton(btn2_label, func() {
        if btn2_label == "" {
            btn2_label = "X"
            icon2.File = "C:/assets/cat.png"
            icon2.Refresh()
            print(btn2_label)
        } else if btn2_label == "X" {
            btn2_label = "O"
            icon2.File = "C:/assets/dog.png"
            icon2.Refresh()
            print(btn2_label)
        } else if btn2_label == "O" {
            btn2_label = "X"
            icon2.File = "C:/assets/cat.png"
            icon2.Refresh()
            //print(btn2_label)
        }
        slice1[1] = 2
        //fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1 {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    // fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    // fmt.Println("Success")
                    score_check[2] = "success"
                }
                //fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "You Won!"
                title_result.Refresh()
                label.Text = "You Won!"
                dlg.Show()
            }
        }
        // 2nd check for system
        store_rand_val := myRand(slice1)
        //fmt.Println("Randomly selected slice value : ", myRand(slice1))
        // I am using using 420 to avoid conflict
        slice1[store_rand_val] = 420
        slice1_sys[store_rand_val] = store_rand_val + 1
        //sys icon change
        if (store_rand_val + 1) == 1 {
            icon1.File = "C:/assets/robot.png"
            icon1.Refresh()
        } else if (store_rand_val + 1) == 2 {
            icon2.File = "C:/assets/robot.png"
            icon2.Refresh()
        } else if (store_rand_val + 1) == 3 {
            icon3.File = "C:/assets/robot.png"
            icon3.Refresh()
        } else if (store_rand_val + 1) == 4 {
            icon4.File = "C:/assets/robot.png"
            icon4.Refresh()
        } else if (store_rand_val + 1) == 5 {
            icon5.File = "C:/assets/robot.png"
            icon5.Refresh()
        } else if (store_rand_val + 1) == 6 {
            icon6.File = "C:/assets/robot.png"
            icon6.Refresh()
        } else if (store_rand_val + 1) == 7 {
            icon7.File = "C:/assets/robot.png"
            icon7.Refresh()
        } else if (store_rand_val + 1) == 8 {
            icon8.File = "C:/assets/robot.png"
            icon8.Refresh()
        } else if (store_rand_val + 1) == 9 {
            icon9.File = "C:/assets/robot.png"
            icon9.Refresh()
        }
        // end of system icon change
        fmt.Println(slice1_sys)
        fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1_sys {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "System Won!"
                title_result.Refresh()
                label.Text = "System Won!"
                dlg.Show()
            }
        }
        // end of 2nd check for sys
    })
    btn2.Move(fyne.NewPos(150, 50))
    btn2.Resize(fyne.NewSize(100, 100))
    ///////////////////////////
    // icon3 := canvas.NewImageFromFile(question_asset)
    icon3.Move(fyne.NewPos(250, 50))
    icon3.Resize(fyne.NewSize(80, 80))
    btn3_label := ""
    btn3 := widget.NewButton(btn3_label, func() {
        if btn3_label == "" {
            btn3_label = "X"
            icon3.File = "C:/assets/cat.png"
            icon3.Refresh()
            //print(btn3_label)
        } else if btn3_label == "X" {
            btn3_label = "O"
            icon3.File = "C:/assets/dog.png"
            icon3.Refresh()
            //print(btn3_label)
        } else if btn3_label == "O" {
            btn3_label = "X"
            icon3.File = "C:/assets/cat.png"
            icon3.Refresh()
            //print(btn3_label)
        }
        slice1[2] = 3
        //fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1 {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                } // else {
                //  score_check[0] = "fail"
                // }
                if slice2[i].B == q {
                    // fmt.Println("Success")
                    score_check[1] = "success"
                } //else {
                //  score_check[1] = "fail"
                // }
                if slice2[i].C == q {
                    // fmt.Println("Success")
                    score_check[2] = "success"
                } //else {
                //  score_check[2] = "fail"
                // }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "You Won!"
                title_result.Refresh()
                label.Text = "You Won!"
                dlg.Show()
            }
        }
        // start of 2nd check for system
        store_rand_val := myRand(slice1)
        //fmt.Println("Randomly selected slice value : ", myRand(slice1))
        // I am using using 420 to avoid conflict
        slice1[store_rand_val] = 420
        slice1_sys[store_rand_val] = store_rand_val + 1
        // start of system icon change
        if (store_rand_val + 1) == 1 {
            icon1.File = "C:/assets/robot.png"
            icon1.Refresh()
        } else if (store_rand_val + 1) == 2 {
            icon2.File = "C:/assets/robot.png"
            icon2.Refresh()
        } else if (store_rand_val + 1) == 3 {
            icon3.File = "C:/assets/robot.png"
            icon3.Refresh()
        } else if (store_rand_val + 1) == 4 {
            icon4.File = "C:/assets/robot.png"
            icon4.Refresh()
        } else if (store_rand_val + 1) == 5 {
            icon5.File = "C:/assets/robot.png"
            icon5.Refresh()
        } else if (store_rand_val + 1) == 6 {
            icon6.File = "C:/assets/robot.png"
            icon6.Refresh()
        } else if (store_rand_val + 1) == 7 {
            icon7.File = "C:/assets/robot.png"
            icon7.Refresh()
        } else if (store_rand_val + 1) == 8 {
            icon8.File = "C:/assets/robot.png"
            icon8.Refresh()
        } else if (store_rand_val + 1) == 9 {
            icon9.File = "C:/assets/robot.png"
            icon9.Refresh()
        }
        // end of system icon change
        fmt.Println(slice1_sys)
        fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1_sys {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "System Won!"
                title_result.Refresh()
                label.Text = "System Won!"
                dlg.Show()
            }
        }
        // end of 2nd check for system
    })
    btn3.Move(fyne.NewPos(250, 50))
    btn3.Resize(fyne.NewSize(100, 100))
    ///////////////////////////
    // icon4 := canvas.NewImageFromFile(question_asset)
    icon4.Move(fyne.NewPos(50, 150))
    icon4.Resize(fyne.NewSize(80, 80))
    btn4_label := ""
    btn4 := widget.NewButton(btn4_label, func() {
        if btn4_label == "" {
            btn4_label = "X"
            icon4.File = "C:/assets/cat.png"
            icon4.Refresh()
            //print(btn4_label)
        } else if btn4_label == "X" {
            btn4_label = "O"
            icon4.File = "C:/assets/dog.png"
            icon4.Refresh()
            //print(btn4_label)
        } else if btn4_label == "O" {
            btn4_label = "X"
            icon4.File = "C:/assets/cat.png"
            icon4.Refresh()
            //print(btn4_label)
        }
        slice1[3] = 4
        //fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1 {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                } // else {
                //  score_check[0] = "fail"
                // }
                if slice2[i].B == q {
                    // fmt.Println("Success")
                    score_check[1] = "success"
                } //else {
                //  score_check[1] = "fail"
                // }
                if slice2[i].C == q {
                    // fmt.Println("Success")
                    score_check[2] = "success"
                } //else {
                //  score_check[2] = "fail"
                // }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "You Won!"
                title_result.Refresh()
                label.Text = "You Won!"
                dlg.Show()
            }
        }
        // start of 2nd check for system win
        store_rand_val := myRand(slice1)
        //fmt.Println("Randomly selected slice value : ", myRand(slice1))
        // I am using using 420 to avoid conflict
        slice1[store_rand_val] = 420
        slice1_sys[store_rand_val] = store_rand_val + 1
        // start of sys icon change
        if (store_rand_val + 1) == 1 {
            icon1.File = "C:/assets/robot.png"
            icon1.Refresh()
        } else if (store_rand_val + 1) == 2 {
            icon2.File = "C:/assets/robot.png"
            icon2.Refresh()
        } else if (store_rand_val + 1) == 3 {
            icon3.File = "C:/assets/robot.png"
            icon3.Refresh()
        } else if (store_rand_val + 1) == 4 {
            icon4.File = "C:/assets/robot.png"
            icon4.Refresh()
        } else if (store_rand_val + 1) == 5 {
            icon5.File = "C:/assets/robot.png"
            icon5.Refresh()
        } else if (store_rand_val + 1) == 6 {
            icon6.File = "C:/assets/robot.png"
            icon6.Refresh()
        } else if (store_rand_val + 1) == 7 {
            icon7.File = "C:/assets/robot.png"
            icon7.Refresh()
        } else if (store_rand_val + 1) == 8 {
            icon8.File = "C:/assets/robot.png"
            icon8.Refresh()
        } else if (store_rand_val + 1) == 9 {
            icon9.File = "C:/assets/robot.png"
            icon9.Refresh()
        }
        // end of sys icon change
        fmt.Println(slice1_sys)
        fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1_sys {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "System Won!"
                title_result.Refresh()
                label.Text = "System Won!"
                dlg.Show()
            }
        }
        // end of 2nd check for system win
    })
    btn4.Move(fyne.NewPos(50, 150))
    btn4.Resize(fyne.NewSize(100, 100))
    ///////////////////////////
    //icon5 := canvas.NewImageFromFile(question_asset)
    icon5.Move(fyne.NewPos(150, 150))
    icon5.Resize(fyne.NewSize(80, 80))
    btn5_label := ""
    btn5 := widget.NewButton(btn5_label, func() {
        if btn5_label == "" {
            btn5_label = "X"
            icon5.File = "C:/assets/cat.png"
            icon5.Refresh()
            print(btn5_label)
        } else if btn5_label == "X" {
            btn5_label = "O"
            icon5.File = "C:/assets/dog.png"
            icon5.Refresh()
            print(btn5_label)
        } else if btn5_label == "O" {
            btn5_label = "X"
            icon5.File = "C:/assets/cat.png"
            icon5.Refresh()
            print(btn5_label)
        }
        slice1[4] = 5
        //fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1 {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                } // else {
                //  score_check[0] = "fail"
                // }
                if slice2[i].B == q {
                    // fmt.Println("Success")
                    score_check[1] = "success"
                } //else {
                //  score_check[1] = "fail"
                // }
                if slice2[i].C == q {
                    // fmt.Println("Success")
                    score_check[2] = "success"
                } //else {
                //  score_check[2] = "fail"
                // }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "You Won!"
                title_result.Refresh()
                label.Text = "You Won!"
                dlg.Show()
            }
        }
        // start of 2nd check for system win
        store_rand_val := myRand(slice1)
        //fmt.Println("Randomly selected slice value : ", myRand(slice1))
        // I am using using 420 to avoid conflict
        slice1[store_rand_val] = 420
        slice1_sys[store_rand_val] = store_rand_val + 1
        // start of system icon change
        if (store_rand_val + 1) == 1 {
            icon1.File = "C:/assets/robot.png"
            icon1.Refresh()
        } else if (store_rand_val + 1) == 2 {
            icon2.File = "C:/assets/robot.png"
            icon2.Refresh()
        } else if (store_rand_val + 1) == 3 {
            icon3.File = "C:/assets/robot.png"
            icon3.Refresh()
        } else if (store_rand_val + 1) == 4 {
            icon4.File = "C:/assets/robot.png"
            icon4.Refresh()
        } else if (store_rand_val + 1) == 5 {
            icon5.File = "C:/assets/robot.png"
            icon5.Refresh()
        } else if (store_rand_val + 1) == 6 {
            icon6.File = "C:/assets/robot.png"
            icon6.Refresh()
        } else if (store_rand_val + 1) == 7 {
            icon7.File = "C:/assets/robot.png"
            icon7.Refresh()
        } else if (store_rand_val + 1) == 8 {
            icon8.File = "C:/assets/robot.png"
            icon8.Refresh()
        } else if (store_rand_val + 1) == 9 {
            icon9.File = "C:/assets/robot.png"
            icon9.Refresh()
        }
        // end of system icon change
        fmt.Println(slice1_sys)
        fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1_sys {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "System Won!"
                title_result.Refresh()
                label.Text = "System Won!"
                dlg.Show()
            }
        }
        // end of 2nd check for system win
    })
    btn5.Move(fyne.NewPos(150, 150))
    btn5.Resize(fyne.NewSize(100, 100))
    ///////////////////////////
    //icon6 := canvas.NewImageFromFile(question_asset)
    icon6.Move(fyne.NewPos(250, 150))
    icon6.Resize(fyne.NewSize(80, 80))
    btn6_label := ""
    btn6 := widget.NewButton(btn6_label, func() {
        if btn6_label == "" {
            btn6_label = "X"
            icon6.File = "C:/assets/cat.png"
            icon6.Refresh()
            print(btn6_label)
        } else if btn6_label == "X" {
            btn6_label = "O"
            icon6.File = "C:/assets/dog.png"
            icon6.Refresh()
            print(btn6_label)
        } else if btn6_label == "O" {
            btn6_label = "X"
            icon6.File = "C:/assets/cat.png"
            icon6.Refresh()
            print(btn6_label)
        }
        slice1[5] = 6
        //fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1 {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                } // else {
                //  score_check[0] = "fail"
                // }
                if slice2[i].B == q {
                    // fmt.Println("Success")
                    score_check[1] = "success"
                } //else {
                //  score_check[1] = "fail"
                // }
                if slice2[i].C == q {
                    // fmt.Println("Success")
                    score_check[2] = "success"
                } //else {
                //  score_check[2] = "fail"
                // }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "You Won!"
                title_result.Refresh()
                label.Text = "You Won!"
                dlg.Show()
            }
        }
        // start of 2nd check for system win
        store_rand_val := myRand(slice1)
        //fmt.Println("Randomly selected slice value : ", myRand(slice1))
        // I am using using 420 to avoid conflict
        slice1[store_rand_val] = 420
        slice1_sys[store_rand_val] = store_rand_val + 1
        // start of system icon change
        if (store_rand_val + 1) == 1 {
            icon1.File = "C:/assets/robot.png"
            icon1.Refresh()
        } else if (store_rand_val + 1) == 2 {
            icon2.File = "C:/assets/robot.png"
            icon2.Refresh()
        } else if (store_rand_val + 1) == 3 {
            icon3.File = "C:/assets/robot.png"
            icon3.Refresh()
        } else if (store_rand_val + 1) == 4 {
            icon4.File = "C:/assets/robot.png"
            icon4.Refresh()
        } else if (store_rand_val + 1) == 5 {
            icon5.File = "C:/assets/robot.png"
            icon5.Refresh()
        } else if (store_rand_val + 1) == 6 {
            icon6.File = "C:/assets/robot.png"
            icon6.Refresh()
        } else if (store_rand_val + 1) == 7 {
            icon7.File = "C:/assets/robot.png"
            icon7.Refresh()
        } else if (store_rand_val + 1) == 8 {
            icon8.File = "C:/assets/robot.png"
            icon8.Refresh()
        } else if (store_rand_val + 1) == 9 {
            icon9.File = "C:/assets/robot.png"
            icon9.Refresh()
        }
        // end of system icon change
        fmt.Println(slice1_sys)
        fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1_sys {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "System Won!"
                title_result.Refresh()
                label.Text = "System Won!"
                dlg.Show()
            }
        }
        // end of 2nd check for system win
    })
    btn6.Move(fyne.NewPos(250, 150))
    btn6.Resize(fyne.NewSize(100, 100))
    ///////////////////////////
    //icon7 := canvas.NewImageFromFile(question_asset)
    icon7.Move(fyne.NewPos(50, 250))
    icon7.Resize(fyne.NewSize(80, 80))
    btn7_label := ""
    btn7 := widget.NewButton(btn7_label, func() {
        if btn7_label == "" {
            btn7_label = "X"
            icon7.File = "C:/assets/cat.png"
            icon7.Refresh()
            print(btn7_label)
        } else if btn7_label == "X" {
            btn7_label = "O"
            icon7.File = "C:/assets/dog.png"
            icon7.Refresh()
            print(btn7_label)
        } else if btn7_label == "O" {
            btn7_label = "X"
            icon7.File = "C:/assets/cat.png"
            icon7.Refresh()
            print(btn7_label)
        }
        slice1[6] = 7
        //fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1 {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                } // else {
                //  score_check[0] = "fail"
                // }
                if slice2[i].B == q {
                    // fmt.Println("Success")
                    score_check[1] = "success"
                } //else {
                //  score_check[1] = "fail"
                // }
                if slice2[i].C == q {
                    // fmt.Println("Success")
                    score_check[2] = "success"
                } //else {
                //  score_check[2] = "fail"
                // }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "You Won!"
                title_result.Refresh()
                label.Text = "You Won!"
                dlg.Show()
            }
        }
        // start of 2nd check for system win
        store_rand_val := myRand(slice1)
        //fmt.Println("Randomly selected slice value : ", myRand(slice1))
        // I am using using 420 to avoid conflict
        slice1[store_rand_val] = 420
        slice1_sys[store_rand_val] = store_rand_val + 1
        // start of system icon change
        if (store_rand_val + 1) == 1 {
            icon1.File = "C:/assets/robot.png"
            icon1.Refresh()
        } else if (store_rand_val + 1) == 2 {
            icon2.File = "C:/assets/robot.png"
            icon2.Refresh()
        } else if (store_rand_val + 1) == 3 {
            icon3.File = "C:/assets/robot.png"
            icon3.Refresh()
        } else if (store_rand_val + 1) == 4 {
            icon4.File = "C:/assets/robot.png"
            icon4.Refresh()
        } else if (store_rand_val + 1) == 5 {
            icon5.File = "C:/assets/robot.png"
            icon5.Refresh()
        } else if (store_rand_val + 1) == 6 {
            icon6.File = "C:/assets/robot.png"
            icon6.Refresh()
        } else if (store_rand_val + 1) == 7 {
            icon7.File = "C:/assets/robot.png"
            icon7.Refresh()
        } else if (store_rand_val + 1) == 8 {
            icon8.File = "C:/assets/robot.png"
            icon8.Refresh()
        } else if (store_rand_val + 1) == 9 {
            icon9.File = "C:/assets/robot.png"
            icon9.Refresh()
        }
        // end of system icon change
        fmt.Println(slice1_sys)
        fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1_sys {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "System Won!"
                title_result.Refresh()
                label.Text = "System Won!"
                dlg.Show()
            }
        }
        // end of 2nd check for system win
    })
    btn7.Move(fyne.NewPos(50, 250))
    btn7.Resize(fyne.NewSize(100, 100))
    ///////////////////////////
    //icon8 := canvas.NewImageFromFile(question_asset)
    icon8.Move(fyne.NewPos(150, 250))
    icon8.Resize(fyne.NewSize(80, 80))
    btn8_label := ""
    btn8 := widget.NewButton(btn8_label, func() {
        if btn8_label == "" {
            btn8_label = "X"
            icon8.File = "C:/assets/cat.png"
            icon8.Refresh()
            print(btn8_label)
        } else if btn8_label == "X" {
            btn8_label = "O"
            icon8.File = "C:/assets/dog.png"
            icon8.Refresh()
            print(btn8_label)
        } else if btn8_label == "O" {
            btn8_label = "X"
            icon8.File = "C:/assets/cat.png"
            icon8.Refresh()
            print(btn8_label)
        }
        slice1[7] = 8
        //fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1 {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                } // else {
                //  score_check[0] = "fail"
                // }
                if slice2[i].B == q {
                    // fmt.Println("Success")
                    score_check[1] = "success"
                } //else {
                //  score_check[1] = "fail"
                // }
                if slice2[i].C == q {
                    // fmt.Println("Success")
                    score_check[2] = "success"
                } //else {
                //  score_check[2] = "fail"
                // }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "You Won!"
                title_result.Refresh()
                label.Text = "You Won!"
                dlg.Show()
            }
        }
        // start of check for system win
        store_rand_val := myRand(slice1)
        //fmt.Println("Randomly selected slice value : ", myRand(slice1))
        // I am using using 420 to avoid conflict
        slice1[store_rand_val] = 420
        slice1_sys[store_rand_val] = store_rand_val + 1
        // start of system icon change
        if (store_rand_val + 1) == 1 {
            icon1.File = "C:/assets/robot.png"
            icon1.Refresh()
        } else if (store_rand_val + 1) == 2 {
            icon2.File = "C:/assets/robot.png"
            icon2.Refresh()
        } else if (store_rand_val + 1) == 3 {
            icon3.File = "C:/assets/robot.png"
            icon3.Refresh()
        } else if (store_rand_val + 1) == 4 {
            icon4.File = "C:/assets/robot.png"
            icon4.Refresh()
        } else if (store_rand_val + 1) == 5 {
            icon5.File = "C:/assets/robot.png"
            icon5.Refresh()
        } else if (store_rand_val + 1) == 6 {
            icon6.File = "C:/assets/robot.png"
            icon6.Refresh()
        } else if (store_rand_val + 1) == 7 {
            icon7.File = "C:/assets/robot.png"
            icon7.Refresh()
        } else if (store_rand_val + 1) == 8 {
            icon8.File = "C:/assets/robot.png"
            icon8.Refresh()
        } else if (store_rand_val + 1) == 9 {
            icon9.File = "C:/assets/robot.png"
            icon9.Refresh()
        }
        // end of system icon change
        fmt.Println(slice1_sys)
        fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1_sys {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "System Won!"
                title_result.Refresh()
                label.Text = "System Won!"
                dlg.Show()
            }
        }
        // end of check for system win
    })
    btn8.Move(fyne.NewPos(150, 250))
    btn8.Resize(fyne.NewSize(100, 100))
    ///////////////////////////
    //icon9 := canvas.NewImageFromFile(question_asset)
    icon9.Move(fyne.NewPos(250, 250))
    icon9.Resize(fyne.NewSize(80, 80))
    btn9_label := ""
    btn9 := widget.NewButton(btn9_label, func() {
        if btn9_label == "" {
            btn9_label = "X"
            icon9.File = "C:/assets/cat.png"
            icon9.Refresh()
            print(btn9_label)
        } else if btn9_label == "X" {
            btn9_label = "O"
            icon9.File = "C:/assets/dog.png"
            icon9.Refresh()
            print(btn9_label)
        } else if btn9_label == "O" {
            btn9_label = "X"
            icon9.File = "C:/assets/cat.png"
            icon9.Refresh()
            print(btn9_label)
        }
        slice1[8] = 9
        //fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1 {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                } // else {
                //  score_check[0] = "fail"
                // }
                if slice2[i].B == q {
                    // fmt.Println("Success")
                    score_check[1] = "success"
                } //else {
                //  score_check[1] = "fail"
                // }
                if slice2[i].C == q {
                    // fmt.Println("Success")
                    score_check[2] = "success"
                } //else {
                //  score_check[2] = "fail"
                // }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "You Won!"
                title_result.Refresh()
                label.Text = "You Won!"
                dlg.Show()
            }
        }
        // start of check for system win
        store_rand_val := myRand(slice1)
        //fmt.Println("Randomly selected slice value : ", myRand(slice1))
        // I am using using 420 to avoid conflict
        slice1[store_rand_val] = 420
        slice1_sys[store_rand_val] = store_rand_val + 1
        // start of system icon change
        if (store_rand_val + 1) == 1 {
            icon1.File = "C:/assets/robot.png"
            icon1.Refresh()
        } else if (store_rand_val + 1) == 2 {
            icon2.File = "C:/assets/robot.png"
            icon2.Refresh()
        } else if (store_rand_val + 1) == 3 {
            icon3.File = "C:/assets/robot.png"
            icon3.Refresh()
        } else if (store_rand_val + 1) == 4 {
            icon4.File = "C:/assets/robot.png"
            icon4.Refresh()
        } else if (store_rand_val + 1) == 5 {
            icon5.File = "C:/assets/robot.png"
            icon5.Refresh()
        } else if (store_rand_val + 1) == 6 {
            icon6.File = "C:/assets/robot.png"
            icon6.Refresh()
        } else if (store_rand_val + 1) == 7 {
            icon7.File = "C:/assets/robot.png"
            icon7.Refresh()
        } else if (store_rand_val + 1) == 8 {
            icon8.File = "C:/assets/robot.png"
            icon8.Refresh()
        } else if (store_rand_val + 1) == 9 {
            icon9.File = "C:/assets/robot.png"
            icon9.Refresh()
        }
        //end of system icon change
        fmt.Println(slice1_sys)
        fmt.Println(slice1)
        for i := 0; i < 8; i++ {
            score_check := [3]string{"", "", ""}
            for _, q := range slice1_sys {
                if slice2[i].A == q {
                    // fmt.Println("Success")
                    score_check[0] = "success"
                }
                if slice2[i].B == q {
                    //fmt.Println("Success")
                    score_check[1] = "success"
                }
                if slice2[i].C == q {
                    //fmt.Println("Success")
                    score_check[2] = "success"
                }
                // fmt.Println(p, q)
            }
            if score_check[0] != "" && score_check[1] != "" && score_check[2] != "" {
                fmt.Println(score_check)
                title_result.Text = "System Won!"
                title_result.Refresh()
                label.Text = "System Won!"
                dlg.Show()
            }
        }
        // end of check for system win
    })
    btn9.Move(fyne.NewPos(250, 250))
    btn9.Resize(fyne.NewSize(100, 100))
    ///////////////////////////
    line := canvas.NewLine(color.RGBA{R: 255, G: 0, B: 0, A: 255})
    line.Position1 = fyne.NewPos(50, 150)
    line.Position2 = fyne.NewPos(350, 150)
    line.StrokeWidth = 5
    // setup data on screen
    line2 := canvas.NewLine(color.RGBA{R: 255, G: 0, B: 0, A: 255})
    line2.Position1 = fyne.NewPos(150, 50)
    line2.Position2 = fyne.NewPos(150, 350)
    line2.StrokeWidth = 5
    // setup data on screen
    line3 := canvas.NewLine(color.RGBA{R: 255, G: 0, B: 0, A: 255})
    line3.Position1 = fyne.NewPos(250, 50)
    line3.Position2 = fyne.NewPos(250, 350)
    line3.StrokeWidth = 5
    line4 := canvas.NewLine(color.RGBA{R: 255, G: 0, B: 0, A: 255})
    line4.Position1 = fyne.NewPos(50, 250)
    line4.Position2 = fyne.NewPos(350, 250)
    line4.StrokeWidth = 5
    // setup data on screen
    c := container.NewWithoutLayout(
        title_result,
        line, line2, line3, line4,
        btn1, icon1, btn2, icon2, btn3, icon3,
        btn4, icon4, btn5, icon5, btn6, icon6,
        btn7, icon7, btn8, icon8, btn9, icon9,
    )
    w.SetContent(c)
    w.ShowAndRun()
}
/// End of code :)
// You can download code from link in description.


Tony BB
 

TonyBB is a Coach , marketer, hypnotist and a founder of RSKVF Production who specializes in providing simple, affordable, and easy to use solutions for Life.

Click Here to Leave a Comment Below 0 comments

Leave a Reply: