写在前面: 我是「虐猫人薛定谔i」,一个不满足于现状,有梦想,有追求的00后
\quad
本博客主要记录和分享自己毕生所学的知识,欢迎关注,第一时间获取更新。
\quad
不忘初心,方得始终。
\quad❤❤❤❤❤❤❤❤❤❤

目录结构
设计思路
本次我们将实现如下功能:
1、玩家登录
2、玩家退出
3、显示在线玩家
4、向玩家广播信息
首先,要有一个玩家类,具体实现如下:
type Player struct {
Name string
Level int
Exp int
Room int
mq chan *Message // 等待收取的消息
}
其次,要有客户端和服务端(具体的实现可以参考下面的源代码),对于消息的广播,我们为每一个玩家都创建一个独立的goroutine,用来监听消息,一旦接受到消息,就将消息输出到控制台上。
代码
player.go
package cg
import "fmt"
type Player struct {
Name string
Level int
Exp int
Room int
mq chan *Message // 等待收取的消息
}
func NewPlayer() *Player {
m := make(chan *Message, 1024)
player := &Player{
"", 0, 0, 0, m}
go func(p *Player) {
for {
msg := <- p.mq
fmt.Println(p.Name, "receive message:", msg.Content)
}
}(player)
return player
}
center.go
package cg
import (
"encoding/json"
"errors"
"fmt"
"sync"
"example.com/m/src/ipc"
)
type Message struct {
From string
To string
Content string
}
type CenterServer struct {
servers map[string] ipc.Server
players[] *Player
mutex sync.RWMutex
}
func NewCenterServer() *CenterServer {
servers := make(map[string] ipc.Server)
players := make([]*Player, 0)
return &CenterServer{
servers: servers, players: players}
}
func (server *CenterServer)addPlayer(params string) error {
player := NewPlayer()
err := json.Unmarshal([]byte(params), &player)
if err != nil {
return err
}
server.mutex.Lock()
defer server.mutex.Unlock()
for _, item := range server.players {
// 判断是否重复登陆了
if item.Name == player.Name {
fmt.Println("The user already exists")
return nil
}
}
server.players = append(server.players, player)
return nil
}
func (server *CenterServer)removePlayer(params string) error{
server.mutex.Lock()
defer server.mutex.Unlock()
for i, v := range server.players {
if v.Name == params {
if len(server.players) == 1 {
server.players = make([]*Player, 0)
} else if<