start tcp server
This commit is contained in:
+121
@@ -0,0 +1,121 @@
|
||||
package hanabi
|
||||
|
||||
import "core:fmt"
|
||||
import "core:math/rand"
|
||||
import "core:net"
|
||||
import "core:os"
|
||||
|
||||
COLORS :: enum {
|
||||
RED,
|
||||
GREEN,
|
||||
WHITE,
|
||||
BLUE,
|
||||
YELLOW,
|
||||
RAINBOW,
|
||||
}
|
||||
|
||||
Card :: struct {
|
||||
value: u8,
|
||||
color: COLORS,
|
||||
}
|
||||
|
||||
VALUES: []u8 : {1, 1, 1, 2, 2, 3, 3, 4, 4, 5}
|
||||
|
||||
Player :: struct {
|
||||
hand: [dynamic]Card,
|
||||
}
|
||||
|
||||
Game :: struct {
|
||||
num_players: u8,
|
||||
hint_tokens: u8,
|
||||
lives_left: u8,
|
||||
players: [dynamic]Player,
|
||||
deck: [dynamic]Card,
|
||||
}
|
||||
|
||||
hand_size :: proc(s: Game) -> int {
|
||||
return s.num_players <= 3 ? 5 : 4
|
||||
}
|
||||
|
||||
create_deck :: proc() -> (deck: [dynamic]Card) {
|
||||
for c in COLORS {
|
||||
for v in VALUES {
|
||||
append(&deck, Card{v, c})
|
||||
}
|
||||
}
|
||||
rand.shuffle(deck[:])
|
||||
return
|
||||
}
|
||||
|
||||
create_player :: proc(s: ^Game) -> (p: Player) {
|
||||
for i in 0 ..< hand_size(s^) {
|
||||
append(&p.hand, pop(&s.deck))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
create_game :: proc(hint_tokens, lives_left, num_players: u8) -> (s: Game) {
|
||||
assert(num_players > 1 && num_players < 6)
|
||||
s.hint_tokens = hint_tokens
|
||||
s.lives_left = lives_left
|
||||
s.deck = create_deck()
|
||||
for i in 0 ..< num_players {
|
||||
append(&s.players, create_player(&s))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
print_game :: proc(s: Game) {
|
||||
for p in s.players {
|
||||
fmt.println("---")
|
||||
for c in p.hand {
|
||||
fmt.println(c.value, c.color)
|
||||
}
|
||||
}
|
||||
// fmt.println("---")
|
||||
// for c in s.deck {
|
||||
// fmt.println(c.value, c.color)
|
||||
// }
|
||||
// fmt.println("---")
|
||||
// fmt.println(len(s.deck))
|
||||
}
|
||||
|
||||
Comm_World :: struct {
|
||||
sockets: [dynamic]net.TCP_Socket,
|
||||
}
|
||||
|
||||
create_socket :: proc(addr_str: string) -> (net.TCP_Socket, bool) {
|
||||
addr, endpoint_ok := net.parse_endpoint(addr_str)
|
||||
if !endpoint_ok {
|
||||
fmt.eprintln("failed to parse endpoint")
|
||||
return 0, false
|
||||
}
|
||||
sock, dial_error := net.listen_tcp(addr)
|
||||
if dial_error != nil {
|
||||
fmt.eprintln(addr_str, dial_error)
|
||||
return 0, false
|
||||
}
|
||||
return sock, true
|
||||
}
|
||||
|
||||
create_comm_world :: proc(addresses: []string) -> (comm: Comm_World) {
|
||||
for addr_str in addresses {
|
||||
sock, ok := create_socket(addr_str)
|
||||
if !ok do panic(fmt.tprintfln("%s: failed to create socket", addr_str))
|
||||
append(&comm.sockets, sock)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
main :: proc() {
|
||||
game := create_game(8, 3, 3)
|
||||
print_game(game)
|
||||
|
||||
if len(os.args) > 1 {
|
||||
comm := create_comm_world(os.args[1:])
|
||||
fmt.println(comm.sockets)
|
||||
} else {
|
||||
fmt.eprintln("usage: <player 1 addr:port> <p2> [p3] [p4] [p5]")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user