start tcp server

This commit is contained in:
2026-05-20 11:30:13 +02:00
parent f5210f5611
commit 0815234bfe
+121
View File
@@ -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]")
}
}