Skip to content

Commit

Permalink
getting there...hmmm
Browse files Browse the repository at this point in the history
  • Loading branch information
Abdenasser committed Mar 28, 2024
1 parent bdcfa7a commit 7ca6329
Showing 1 changed file with 57 additions and 37 deletions.
94 changes: 57 additions & 37 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package main

import (
"bufio"
"fmt"
"net"
"time"
"strconv"
)

var playerSymbols = []string{"x", "o"}
var connections = []net.Conn{}

type Player struct {
Connection net.Conn
Symbol string
Expand All @@ -17,72 +15,94 @@ type Player struct {

// will only handle 2 players for now
var players = []Player{}

func popSymbol(s *[]string) string {
pop := (*s)[len(*s)-1]
*s = (*s)[:len(*s)-1]
return pop
}

func createPlayer(c net.Conn) Player {
player := Player{
Connection: c,
Symbol: popSymbol(&playerSymbols),
Score: 0,
}
return player
var lastPlayed = map[string]int{
"playerIndex": 0,
}

func handleConnection(conn net.Conn) {
func handleConnection(conn net.Conn, b map[int]string) {
fmt.Printf("Client connected from %v \n", conn.RemoteAddr().String())
time.Sleep(5 * time.Second)
closeConnection(conn)
}

func closeConnection(conn net.Conn) {
removeConn(conn)
scanner := bufio.NewScanner(conn)
for {
// output := printBoard(b)
// conn.Write([]byte(output + "\n"))
conn.Write([]byte("pick a position please \n"))
ok := scanner.Scan()
if !ok {
break
}
play(scanner.Text(), b, players, conn)
}
removePlayer(conn)
fmt.Printf("Client at %v disconnected.\n", conn.RemoteAddr().String())
conn.Close()
}

func removeConn(c net.Conn) {
for i, conn := range connections {
if conn == c {
connections = append(connections[:i], connections[i+1:]...)
break
func play(pos string, b map[int]string, ps []Player, conn net.Conn) {
fmt.Println("> " + pos)
for _, p := range ps {
if lastPlayed["playerIndex"] == 0 {
lastPlayed["playerIndex"] = 1
} else {
lastPlayed["playerIndex"] = 0
}
player := ps[lastPlayed["playerIndex"]]
if p != player {
position, _ := strconv.Atoi(pos)
b[position] = player.Symbol
}

output := printBoard(b)
p.Connection.Write([]byte(output + "\n"))
}
}

func removePlayer(c net.Conn) {
for i, p := range players {
if p.Connection == c {
playerSymbols = append(playerSymbols, p.Symbol)
players = append(players[:i], players[i+1:]...)
break
}
}
}

func initBoard() map[int]string {
board := make(map[int]string)
for i := 0; i < 9; i++ {
board[i] = fmt.Sprintf("%d", i)
}
return board
}

func printBoard(b map[int]string) string {
output := ""
for i := 0; i < 9; i += 3 {
output += fmt.Sprintf("%v | %v | %v\n", b[i], b[i+1], b[i+2])
}
return output
}

func main() {
listener, _ := net.Listen("tcp", "localhost:8080")
fmt.Printf("Listening on %s.\n", "localhost:8080")

b := initBoard()
defer listener.Close()

for {
conn, err := listener.Accept() // connect using telnet cmd: telnet localhost 8080
if err != nil {
fmt.Printf("Some connection error: %s\n", err)
}

fmt.Printf("client connected from %v\n", conn.RemoteAddr().String())
connections = append(connections, conn)

if len(players) < 2 {
players = append(players, createPlayer(conn))
player := Player{
Connection: conn,
Symbol: []string{"x", "o"}[len(players)],
Score: 0,
}
players = append(players, player)
go handleConnection(conn, b)
}
// accept inputs from connected clients in a separate goroutine
go handleConnection(conn)
fmt.Printf("clients %v, players %v, symbols %v\n", len(connections), len(players), len(playerSymbols))
}
}

0 comments on commit 7ca6329

Please sign in to comment.