Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "bufio"
- "fmt"
- "math/rand"
- "os"
- "strconv"
- )
- func main() {
- reader := bufio.NewReader(os.Stdin)
- players := [...]string{"X", "O"}
- moveNumber := 0
- grid := [...]string{"1", "2", "3", "4", "5", "6", "7", "8", "9"}
- showGrid := func() {
- fmt.Printf("%s %s %s\n", grid[0], grid[1], grid[2])
- fmt.Printf("%s %s %s\n", grid[3], grid[4], grid[5])
- fmt.Printf("%s %s %s\n", grid[6], grid[7], grid[8])
- }
- showMenu := func() {
- fmt.Println("Tic Tac Toe")
- fmt.Println("1. Versus")
- fmt.Println("2. Computer Versus")
- fmt.Println("3. Exit")
- }
- gameState := func() string {
- if grid[0] == grid[1] && grid[2] == grid[0] || grid[3] == grid[4] && grid[5] == grid[3] ||
- grid[6] == grid[7] && grid[8] == grid[6] || grid[0] == grid[3] && grid[6] == grid[0] ||
- grid[1] == grid[4] && grid[7] == grid[1] || grid[2] == grid[5] && grid[8] == grid[2] ||
- grid[0] == grid[4] && grid[8] == grid[0] || grid[2] == grid[4] && grid[6] == grid[2] {
- return "win"
- } else if moveNumber == 9 {
- return "draw"
- }
- return "still playing"
- }
- versus := func() {
- for {
- showGrid()
- currentPlayer := players[moveNumber%2]
- line, _, _ := reader.ReadLine()
- choice, err := strconv.ParseInt(string(line), 10, 64)
- wrongRange := choice < 1 || choice > 9
- for ; err != nil || wrongRange; {
- fmt.Println("Wrong input")
- line, _, _ = reader.ReadLine()
- choice, err = strconv.ParseInt(string(line), 10, 64)
- wrongRange = choice < 1 || choice > 9
- }
- grid[choice-1] = currentPlayer
- moveNumber++
- fmt.Println()
- switch gameState() {
- case "win":
- showGrid()
- fmt.Println(currentPlayer + " won")
- return
- case "draw":
- showGrid()
- fmt.Println("It's a draw")
- return
- }
- }
- }
- computer := func() {
- for {
- showGrid()
- currentPlayer := players[moveNumber%2]
- if currentPlayer == "X" {
- line, _, _ := reader.ReadLine()
- choice, err := strconv.ParseInt(string(line), 10, 64)
- wrongRange := choice < 1 || choice > 9
- for ; err != nil || wrongRange; {
- fmt.Println("Wrong input")
- line, _, _ = reader.ReadLine()
- choice, err = strconv.ParseInt(string(line), 10, 64)
- wrongRange = choice < 1 || choice > 9
- }
- grid[choice-1] = "X"
- } else {
- var choice int
- if grid[0] == grid[1] && grid[2] != "X" && grid[2] != "O" {
- choice = 2
- } else if grid[1] == grid[2] && grid[0] != "X" && grid[0] != "O" {
- choice = 0
- } else if grid[0] == grid[2] && grid[1] != "X" && grid[1] != "O" {
- choice = 1
- } else if grid[3] == grid[4] && grid[5] != "X" && grid[5] != "O" {
- choice = 5
- } else if grid[4] == grid[5] && grid[3] != "X" && grid[3] != "O" {
- choice = 3
- } else if grid[3] == grid[5] && grid[4] != "X" && grid[4] != "O" {
- choice = 4
- } else if grid[6] == grid[7] && grid[8] != "X" && grid[8] != "O" {
- choice = 8
- } else if grid[7] == grid[8] && grid[6] != "X" && grid[6] != "O" {
- choice = 6
- } else if grid[6] == grid[8] && grid[7] != "X" && grid[7] != "O" {
- choice = 7
- } else if grid[0] == grid[3] && grid[6] != "X" && grid[6] != "O" {
- choice = 6
- } else if grid[3] == grid[6] && grid[0] != "X" && grid[0] != "O" {
- choice = 0
- } else if grid[0] == grid[6] && grid[3] != "X" && grid[3] != "O" {
- choice = 3
- } else if grid[1] == grid[4] && grid[7] != "X" && grid[7] != "O" {
- choice = 7
- } else if grid[4] == grid[7] && grid[1] != "X" && grid[1] != "O" {
- choice = 1
- } else if grid[1] == grid[7] && grid[4] != "X" && grid[4] != "O" {
- choice = 4
- } else if grid[2] == grid[5] && grid[8] != "X" && grid[8] != "O" {
- choice = 8
- } else if grid[5] == grid[8] && grid[2] != "X" && grid[2] != "O" {
- choice = 2
- } else if grid[2] == grid[8] && grid[5] != "X" && grid[5] != "O" {
- choice = 5
- } else if grid[0] == grid[4] && grid[8] != "X" && grid[8] != "O" {
- choice = 8
- } else if grid[4] == grid[8] && grid[0] != "X" && grid[0] != "O" {
- choice = 0
- } else if grid[0] == grid[8] && grid[4] != "X" && grid[4] != "O" {
- choice = 4
- } else if grid[2] == grid[4] && grid[6] != "X" && grid[6] != "O" {
- choice = 6
- } else if grid[4] == grid[6] && grid[2] != "X" && grid[2] != "O" {
- choice = 2
- } else if grid[2] == grid[6] && grid[4] != "X" && grid[4] != "O" {
- choice = 4
- } else {
- choice = rand.Intn(9)
- for ; grid[choice] == "O" || grid[choice] == "X"; {
- choice = rand.Intn(9)
- }
- }
- grid[choice] = "O"
- }
- moveNumber++
- fmt.Println()
- switch gameState() {
- case "win":
- showGrid()
- fmt.Println(currentPlayer + " won")
- return
- case "draw":
- showGrid()
- fmt.Println("It's a draw")
- return
- }
- }
- showGrid()
- fmt.Println(players[(moveNumber-1)%2] + " won")
- fmt.Println()
- }
- for {
- showMenu()
- line, _, _ := reader.ReadLine()
- choice, err := strconv.ParseInt(string(line), 10, 64)
- wrongRange := choice < 1 || choice > 3
- for ; err != nil || wrongRange; {
- fmt.Println("Wrong input")
- line, _, _ = reader.ReadLine()
- choice, err = strconv.ParseInt(string(line), 10, 64)
- wrongRange = choice < 1 || choice > 3
- }
- fmt.Println()
- switch choice {
- case 1:
- versus()
- case 2:
- computer()
- case 3:
- return
- }
- fmt.Println()
- moveNumber = 0
- grid = [...]string{"1", "2", "3", "4", "5", "6", "7", "8", "9"}
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement