Advertisement
Guest User

TicTacToe in Go

a guest
Nov 15th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 5.49 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bufio"
  5.     "fmt"
  6.     "math/rand"
  7.     "os"
  8.     "strconv"
  9. )
  10.  
  11. func main() {
  12.     reader := bufio.NewReader(os.Stdin)
  13.  
  14.     players := [...]string{"X", "O"}
  15.     moveNumber := 0
  16.     grid := [...]string{"1", "2", "3", "4", "5", "6", "7", "8", "9"}
  17.  
  18.     showGrid := func() {
  19.         fmt.Printf("%s %s %s\n", grid[0], grid[1], grid[2])
  20.         fmt.Printf("%s %s %s\n", grid[3], grid[4], grid[5])
  21.         fmt.Printf("%s %s %s\n", grid[6], grid[7], grid[8])
  22.     }
  23.  
  24.     showMenu := func() {
  25.         fmt.Println("Tic Tac Toe")
  26.         fmt.Println("1. Versus")
  27.         fmt.Println("2. Computer Versus")
  28.         fmt.Println("3. Exit")
  29.     }
  30.  
  31.     gameState := func() string {
  32.         if grid[0] == grid[1] && grid[2] == grid[0] || grid[3] == grid[4] && grid[5] == grid[3] ||
  33.             grid[6] == grid[7] && grid[8] == grid[6] || grid[0] == grid[3] && grid[6] == grid[0] ||
  34.             grid[1] == grid[4] && grid[7] == grid[1] || grid[2] == grid[5] && grid[8] == grid[2] ||
  35.             grid[0] == grid[4] && grid[8] == grid[0] || grid[2] == grid[4] && grid[6] == grid[2] {
  36.             return "win"
  37.         } else if moveNumber == 9 {
  38.             return "draw"
  39.         }
  40.         return "still playing"
  41.     }
  42.  
  43.     versus := func() {
  44.         for {
  45.             showGrid()
  46.  
  47.             currentPlayer := players[moveNumber%2]
  48.  
  49.             line, _, _ := reader.ReadLine()
  50.             choice, err := strconv.ParseInt(string(line), 10, 64)
  51.             wrongRange := choice < 1 || choice > 9
  52.  
  53.             for ; err != nil || wrongRange; {
  54.                 fmt.Println("Wrong input")
  55.  
  56.                 line, _, _ = reader.ReadLine()
  57.                 choice, err = strconv.ParseInt(string(line), 10, 64)
  58.                 wrongRange = choice < 1 || choice > 9
  59.             }
  60.  
  61.             grid[choice-1] = currentPlayer
  62.  
  63.             moveNumber++
  64.             fmt.Println()
  65.  
  66.             switch gameState() {
  67.             case "win":
  68.                 showGrid()
  69.                 fmt.Println(currentPlayer + " won")
  70.                 return
  71.             case "draw":
  72.                 showGrid()
  73.                 fmt.Println("It's a draw")
  74.                 return
  75.             }
  76.         }
  77.     }
  78.  
  79.     computer := func() {
  80.         for {
  81.             showGrid()
  82.  
  83.             currentPlayer := players[moveNumber%2]
  84.             if currentPlayer == "X" {
  85.                 line, _, _ := reader.ReadLine()
  86.                 choice, err := strconv.ParseInt(string(line), 10, 64)
  87.                 wrongRange := choice < 1 || choice > 9
  88.  
  89.                 for ; err != nil || wrongRange; {
  90.                     fmt.Println("Wrong input")
  91.  
  92.                     line, _, _ = reader.ReadLine()
  93.                     choice, err = strconv.ParseInt(string(line), 10, 64)
  94.                     wrongRange = choice < 1 || choice > 9
  95.                 }
  96.  
  97.                 grid[choice-1] = "X"
  98.             } else {
  99.                 var choice int
  100.                 if grid[0] == grid[1] && grid[2] != "X" && grid[2] != "O" {
  101.                     choice = 2
  102.                 } else if grid[1] == grid[2] && grid[0] != "X" && grid[0] != "O" {
  103.                     choice = 0
  104.                 } else if grid[0] == grid[2] && grid[1] != "X" && grid[1] != "O" {
  105.                     choice = 1
  106.  
  107.                 } else if grid[3] == grid[4] && grid[5] != "X" && grid[5] != "O" {
  108.                     choice = 5
  109.                 } else if grid[4] == grid[5] && grid[3] != "X" && grid[3] != "O" {
  110.                     choice = 3
  111.                 } else if grid[3] == grid[5] && grid[4] != "X" && grid[4] != "O" {
  112.                     choice = 4
  113.  
  114.                 } else if grid[6] == grid[7] && grid[8] != "X" && grid[8] != "O" {
  115.                     choice = 8
  116.                 } else if grid[7] == grid[8] && grid[6] != "X" && grid[6] != "O" {
  117.                     choice = 6
  118.                 } else if grid[6] == grid[8] && grid[7] != "X" && grid[7] != "O" {
  119.                     choice = 7
  120.  
  121.                 } else if grid[0] == grid[3] && grid[6] != "X" && grid[6] != "O" {
  122.                     choice = 6
  123.                 } else if grid[3] == grid[6] && grid[0] != "X" && grid[0] != "O" {
  124.                     choice = 0
  125.                 } else if grid[0] == grid[6] && grid[3] != "X" && grid[3] != "O" {
  126.                     choice = 3
  127.  
  128.                 } else if grid[1] == grid[4] && grid[7] != "X" && grid[7] != "O" {
  129.                     choice = 7
  130.                 } else if grid[4] == grid[7] && grid[1] != "X" && grid[1] != "O" {
  131.                     choice = 1
  132.                 } else if grid[1] == grid[7] && grid[4] != "X" && grid[4] != "O" {
  133.                     choice = 4
  134.  
  135.                 } else if grid[2] == grid[5] && grid[8] != "X" && grid[8] != "O" {
  136.                     choice = 8
  137.                 } else if grid[5] == grid[8] && grid[2] != "X" && grid[2] != "O" {
  138.                     choice = 2
  139.                 } else if grid[2] == grid[8] && grid[5] != "X" && grid[5] != "O" {
  140.                     choice = 5
  141.  
  142.                 } else if grid[0] == grid[4] && grid[8] != "X" && grid[8] != "O" {
  143.                     choice = 8
  144.                 } else if grid[4] == grid[8] && grid[0] != "X" && grid[0] != "O" {
  145.                     choice = 0
  146.                 } else if grid[0] == grid[8] && grid[4] != "X" && grid[4] != "O" {
  147.                     choice = 4
  148.  
  149.                 } else if grid[2] == grid[4] && grid[6] != "X" && grid[6] != "O" {
  150.                     choice = 6
  151.                 } else if grid[4] == grid[6] && grid[2] != "X" && grid[2] != "O" {
  152.                     choice = 2
  153.                 } else if grid[2] == grid[6] && grid[4] != "X" && grid[4] != "O" {
  154.                     choice = 4
  155.  
  156.                 } else {
  157.                     choice = rand.Intn(9)
  158.                     for ; grid[choice] == "O" || grid[choice] == "X"; {
  159.                         choice = rand.Intn(9)
  160.                     }
  161.                 }
  162.  
  163.                 grid[choice] = "O"
  164.             }
  165.  
  166.             moveNumber++
  167.             fmt.Println()
  168.  
  169.             switch gameState() {
  170.             case "win":
  171.                 showGrid()
  172.                 fmt.Println(currentPlayer + " won")
  173.                 return
  174.             case "draw":
  175.                 showGrid()
  176.                 fmt.Println("It's a draw")
  177.                 return
  178.             }
  179.         }
  180.  
  181.         showGrid()
  182.         fmt.Println(players[(moveNumber-1)%2] + " won")
  183.         fmt.Println()
  184.     }
  185.  
  186.     for {
  187.         showMenu()
  188.  
  189.         line, _, _ := reader.ReadLine()
  190.         choice, err := strconv.ParseInt(string(line), 10, 64)
  191.         wrongRange := choice < 1 || choice > 3
  192.  
  193.         for ; err != nil || wrongRange; {
  194.             fmt.Println("Wrong input")
  195.  
  196.             line, _, _ = reader.ReadLine()
  197.             choice, err = strconv.ParseInt(string(line), 10, 64)
  198.             wrongRange = choice < 1 || choice > 3
  199.         }
  200.  
  201.         fmt.Println()
  202.  
  203.         switch choice {
  204.         case 1:
  205.             versus()
  206.         case 2:
  207.             computer()
  208.         case 3:
  209.             return
  210.         }
  211.  
  212.         fmt.Println()
  213.  
  214.         moveNumber = 0
  215.         grid = [...]string{"1", "2", "3", "4", "5", "6", "7", "8", "9"}
  216.     }
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement