Skip to content

Commit 1781ad2

Browse files
committedApr 21, 2019
add /Users/piao/data/golang/server/act
1 parent 8824a42 commit 1781ad2

14 files changed

+1150
-0
lines changed
 

‎act/.DS_Store

6 KB
Binary file not shown.

‎act/conf.json

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"discard_timeout":12,
3+
"operate_timeout":10,
4+
5+
"image_dir":"./image",
6+
"image_port":8013,
7+
"feedback_image_dir":"./feedback",
8+
"feedback_image_port":8014,
9+
10+
"db_addr":"127.0.0.1:2225",
11+
"server_host":"127.0.0.1",
12+
"server_port":7011,
13+
"web_port":8017,
14+
"pay_port":0,
15+
"pay_wx_pattern":"/mahjong/wxpay/notice",
16+
"pay_iapp_pattern":"/mahjong/iapppay/notice",
17+
"share_addr":"http://www.xxx.com/share/index.htm",
18+
19+
"server_node":"127.0.0.1:7070",
20+
"robots_node":"127.0.0.1:7072",
21+
22+
"server_id":1,
23+
"version":"1.0.1"
24+
}

‎act/ctrl

+187
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
#!/bin/bash
2+
3+
usage() {
4+
echo " ./ctrl cmd "
5+
echo " cmd : build, build-admin, run, run-admin "
6+
echo " cmd : show, sync, kill, run-server, stop "
7+
echo " cmd : show-admin, stop-admin run-admin "
8+
echo " cmd : show-robot, stop-robot run-robot "
9+
}
10+
11+
proto() {
12+
CURDIR=$(cd ../"$(dirname "$0")"; pwd)
13+
OLDGOPATH="$GOPATH"
14+
export GOPATH="$CURDIR"
15+
cd ./messages
16+
MSGDIR=../../src/protoactor/messages
17+
#protoc --go_out=$MSGDIR,import_path=$MSGDIR:$MSGDIR login.proto
18+
protoc -I=. -I=${GOPATH}/src --gogoslick_out=plugins=grpc:${MSGDIR} *.proto
19+
export GOPATH="$OLDGOPATH"
20+
}
21+
22+
protos() {
23+
CURDIR=$(cd ../"$(dirname "$0")"; pwd)
24+
OLDGOPATH="$GOPATH"
25+
export GOPATH="$CURDIR"
26+
cd ./messages
27+
MSGDIR=../../src/protoactor/messages
28+
protoc -I=. -I=${GOPATH}/src --gogoslick_out=plugins=grpc:${MSGDIR} protos.proto
29+
export GOPATH="$OLDGOPATH"
30+
}
31+
32+
build() {
33+
GOPATHOLD=$GOPATH
34+
GOPATH=$(cd ../"$(dirname "$0")"; pwd)
35+
go build -o main -ldflags "-w -s" ../src/protoactor/main.go
36+
GOPATH=$GOPATHOLD
37+
}
38+
39+
build_robot() {
40+
GOPATHOLD=$GOPATH
41+
GOPATH=$(cd ../"$(dirname "$0")"; pwd)
42+
go build -o robot -ldflags "-w -s" ../src/protoactor/robots.go
43+
GOPATH=$GOPATHOLD
44+
}
45+
46+
build_linux() {
47+
GOPATHOLD=$GOPATH
48+
GOARCH_OLD=$GOARCH
49+
GOOS_OLD=$GOOS
50+
CGO_ENABLED_OLD=$CGO_ENABLED
51+
export CGO_ENABLED=0
52+
export GOOS=linux
53+
export GOARCH=amd64
54+
GOPATH=$(cd ../"$(dirname "$0")"; pwd)
55+
go build -o main -ldflags "-w -s" ../src/protoactor/main.go
56+
GOPATH=$GOPATHOLD
57+
export GOARCH=$GOARCH_OLD
58+
export GOOS=$GOOS_OLD
59+
export CGO_ENABLED=$CGO_ENABLED_OLD
60+
}
61+
62+
build_linux_robot() {
63+
GOPATHOLD=$GOPATH
64+
GOARCH_OLD=$GOARCH
65+
GOOS_OLD=$GOOS
66+
CGO_ENABLED_OLD=$CGO_ENABLED
67+
export CGO_ENABLED=0
68+
export GOOS=linux
69+
export GOARCH=amd64
70+
GOPATH=$(cd ../"$(dirname "$0")"; pwd)
71+
go build -o robot -ldflags "-w -s" ../src/protoactor/robots.go
72+
GOPATH=$GOPATHOLD
73+
export GOARCH=$GOARCH_OLD
74+
export GOOS=$GOOS_OLD
75+
export CGO_ENABLED=$CGO_ENABLED_OLD
76+
}
77+
78+
start() {
79+
PID=`get_pid`
80+
if [ "$PID" != '' ]; then
81+
echo "server already runing PID : $PID"
82+
else
83+
./main -log_dir="log" > error.log 2>&1 &
84+
sleep 3s
85+
PID=`get_pid`
86+
echo "runing server PID : $PID"
87+
fi
88+
}
89+
90+
start_robot() {
91+
PID=`get_pid_robot`
92+
if [ "$PID" != '' ]; then
93+
echo "robot server already runing PID : $PID"
94+
else
95+
./robot -log_dir="log" > error-robot.log 2>&1 &
96+
sleep 3s
97+
PID=`get_pid_robot`
98+
echo "runing robot server PID : $PID"
99+
fi
100+
}
101+
102+
show() {
103+
ps aux | grep -v grep | grep './main -log_dir=log'
104+
}
105+
106+
get_pid() {
107+
ps aux | grep -v grep | grep './main -log_dir=log' | awk '{print $2}'
108+
}
109+
110+
show_robot() {
111+
ps aux | grep -v grep | grep './robot -log_dir=log'
112+
}
113+
114+
get_pid_robot() {
115+
ps aux | grep -v grep | grep './robot -log_dir=log' | awk '{print $2}'
116+
}
117+
118+
stop() {
119+
PID=`get_pid`
120+
if [ "$PID" != '' ]; then
121+
kill -2 $PID
122+
sleep 3s
123+
echo "$PID killed!"
124+
return 1
125+
else
126+
echo "stopped"
127+
return 1
128+
fi
129+
}
130+
131+
stop_robot() {
132+
PID=`get_pid_robot`
133+
if [ "$PID" != '' ]; then
134+
kill -2 $PID
135+
sleep 3s
136+
echo "$PID killed!"
137+
return 1
138+
else
139+
echo "stopped"
140+
return 1
141+
fi
142+
}
143+
144+
restart() {
145+
stop
146+
sleep 3s
147+
start
148+
}
149+
150+
restart_robot() {
151+
stop_robot
152+
sleep 3s
153+
start_robot
154+
}
155+
156+
case $1 in
157+
build)
158+
build;;
159+
build-robot)
160+
build_robot;;
161+
build-linux)
162+
build_linux;;
163+
build-robot-linux)
164+
build_linux_robot;;
165+
start)
166+
start;;
167+
show)
168+
show;;
169+
stop)
170+
stop;;
171+
restart)
172+
restart;;
173+
start-robot)
174+
start_robot;;
175+
show-robot)
176+
show_robot;;
177+
stop-robot)
178+
stop_robot;;
179+
restart-robot)
180+
restart_robot;;
181+
proto)
182+
proto;;
183+
protos)
184+
protos;;
185+
*)
186+
usage;;
187+
esac

‎act/go-get.sh

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
go get -u github.com/gogo/protobuf/proto
2+
go get -u github.com/gogo/protobuf/protoc-gen-gogo
3+
go get -u github.com/gogo/protobuf/gogoproto
4+
go get -u github.com/gogo/protobuf/protoc-gen-gofast
5+
#go get -u google.golang.org/grpc
6+
go get -u github.com/gogo/protobuf/protoc-gen-gogofast
7+
go get -u github.com/gogo/protobuf/protoc-gen-gogofaster
8+
go get -u github.com/gogo/protobuf/protoc-gen-gogoslick
9+
10+
go get -u github.com/Workiva/go-datastructures/queue
11+
go get -u github.com/emirpasic/gods/stacks/linkedliststack
12+
go get -u github.com/orcaman/concurrent-map
13+
go get -u github.com/AsynkronIT/gonet
14+
go get -u github.com/hashicorp/consul/api
15+
go get -u github.com/AsynkronIT/goconsole
16+
go get -u github.com/emirpasic/gods/sets/hashset
17+
go get -u github.com/serialx/hashring
18+
go get -u github.com/couchbase/gocb

‎act/messages/MsgID.lua

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
msgID = {
2+
CWxLogin = 1004,
3+
CWxpayQuery = 3004,
4+
CBuildAgent = 3006,
5+
CCreateRoom = 4010,
6+
CUserData = 1036,
7+
CKick = 4014,
8+
CDiscard = 4029,
9+
CConfig = 1030,
10+
CWxpayOrder = 3002,
11+
CChatText = 2000,
12+
CChatVoice = 2004,
13+
CEnterRoom = 4000,
14+
CReady = 4004,
15+
CRegist = 1002,
16+
COperate = 4030,
17+
CLogin = 1000,
18+
CBuy = 3000,
19+
CLeave = 4002,
20+
21+
SGameover = 4036,
22+
SWxLogin = 1004,
23+
SWxpayQuery = 3004,
24+
SBuildAgent = 3006,
25+
SLeave = 4002,
26+
SCamein = 4022,
27+
SDraw = 4027,
28+
SRegist = 1002,
29+
SChatVoice = 2004,
30+
SReady = 4004,
31+
SCreateRoom = 4010,
32+
SConfig = 1030,
33+
SChatText = 2000,
34+
SEnterRoom = 4000,
35+
SKick = 4014,
36+
SDiscard = 4029,
37+
SPengKong = 4032,
38+
SLogin = 1000,
39+
SBuy = 3000,
40+
SWxpayOrder = 3002,
41+
SGamestart = 4025,
42+
SOperate = 4030,
43+
SUserData = 1036,
44+
}

‎act/messages/README.md

+157
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# majiang
2+
3+
Go语言麻将服务器实现
4+
5+
Backend implementation of server in golang
6+
7+
8+
# usage
9+
10+
cd bin
11+
./ctrl build
12+
./ctrun run
13+
14+
# protocol
15+
protobuf
16+
17+
# document
18+
19+
协议数据打包:
20+
handerLen + protoLen + dataLen + data
21+
22+
handerLen uint32 = 1 : 包头长度1byte(包序)
23+
protoLen uint32 = 4 : 协议号长度4(大端序)
24+
dataLen uint32 = 4 : 数据长度4(大端序)
25+
data uint32 = dataLen : 数据
26+
27+
包序算法:index++; index = index % 256
28+
29+
server port:7001
30+
31+
//牌值定义:
32+
高四位表示色值(0:万,1:条,2:饼),
33+
低四位表示1-9的牌值
34+
如:0x09 = 九万
35+
36+
//掩码值定义(TODO:可以修改调整)
37+
// 碰杠胡掩码,用32位每位代表不同的状态
38+
DRAW uint32 = 0 // 摸牌
39+
DISCARD uint32 = 1 // 打牌
40+
PENG uint32 = 2 << 0 // 碰
41+
MING_KONG uint32 = 2 << 1 // 明杠
42+
AN_KONG uint32 = 2 << 2 // 暗杠
43+
BU_KONG uint32 = 2 << 3 // 补杠
44+
KONG uint32 = 2 << 4 // 杠(代表广义的杠)
45+
CHOW uint32 = 2 << 5 // 吃
46+
HU uint32 = 2 << 6 // 胡(代表广义的胡)
47+
48+
//胡牌方式
49+
ZIMO uint32 = 2 << 8 // 自摸
50+
HEIMO uint32 = 2 << 9 // 黑摸
51+
RUANMO uint32 = 2 << 10 // 软摸
52+
PAOHU uint32 = 2 << 11 // 炮胡,也叫放冲
53+
QIANG_GANG uint32 = 2 << 12 // 抢杠,其他家胡你补杠那张牌
54+
REPAO uint32 = 2 << 13 // 热炮,杠后出牌被胡
55+
HU_KONG_FLOWER uint32 = 2 << 14 // 杠上开花,杠完牌抓到的第一张牌自摸了
56+
TIAN_HU uint32 = 2 << 15 // 天胡
57+
DI_HU uint32 = 2 << 16 // 地胡
58+
59+
//胡牌类型
60+
HU_PING uint32 = 2 << 17 // 平胡
61+
62+
63+
玩法规则(TODO:修改完善):
64+
65+
游戏简介:
66+
一赖到底有两个特点:
67+
1、笑:仙桃人讲的点笑、回头笑、闷笑(是指麻将中的:明杠、补杠、暗杠)
68+
2、晃:胡牌者会被换下,让其他人上。所以一赖到底的游戏可以多人参与。
69+
3、一赖到底牌型简单,有赖子,胡牌和笑牌都有翻倍
70+
4、胡牌牌型:(108,筒、条、万各36),胡牌者的牌型必须具备下列牌型之一:
71+
A.11,123,123,123,123
72+
B.11,123,123,123,111
73+
C.11,123,123,111,111
74+
D.11,123,111,111,111
75+
E.11,111,111,111,111
76+
5、 规则:
77+
6、 庄 家: 四人游戏时谁胡牌谁当庄家,多人游戏时胡牌者对家当庄,庄家流局则继续当庄家
78+
7、 翻赖子:所有玩家牌起完后,翻第一张牌确定赖子,翻出的牌是一(万/条/筒),那么二(万/条/筒)为赖子。
79+
8、 碰 杠:只能碰牌,不能吃。有明杠、补杠、暗杠。
80+
9、 无海底:摸完所有的牌.最后一手牌摸完后也要打出。
81+
10、荒 庄:即使荒庄,明杠、补杠、暗杠的分数同样需要计算。
82+
11、朝 天:赖子皮翻出来后,就不在牌里出现了,比如翻三万,那一局就剩3张三万.谁起
83+
到3张三万就算自摸朝天,等同于暗杠。起到2张三万,别人打出来一个三万碰就等同于点笑。
84+
12、胡牌方式:
85+
1.赖 子:胡牌时牌中只允许有一个籁子,多的籁子必须杠下来。只要有一个玩家杠赖子后,
86+
所有玩家都只能自摸。
87+
2.硬 胡:无赖子或者赖子和在句里面的胡牌牌型。
88+
3.硬 摸:又称黑摸,硬胡自摸。手上有四个赖子杠3个后,手上还有一个赖子自摸的软摸算是硬摸。
89+
4.放 炮:只有硬胡牌型才能胡放炮,放炮有一炮多响。
90+
5.软 摸:有一个赖子的自摸。
91+
6.抢 杠:补杠时有被抢的可能,如补杠3万时,有人胡3万为抢杠,硬胡的牌型才能抢杠。
92+
7.热 铳:明杠、暗杠、补杠后,打出的那张牌放炮就是热铳。硬胡的牌型才能胡热铳。
93+
13、番种及分数:
94+
一赖到底的胡牌和杠牌是分开结算的。玩家杠赖子后,胡牌和杠牌都需要算翻数。
95+
1.胡 牌:胡牌1分;
96+
2.杠 牌:明杠1分、补杠1分、暗杠2分,点朝天1分,自摸朝天2分;
97+
3.算 翻:赖子杠*2、自摸*2、硬胡*2。
98+
99+
仙桃麻将规则技巧:
100+
1、牌型:自摸和接冲,自摸算两倍(每家都给钱),点冲算一倍(点冲者给钱)
101+
2、“买马”及其规则:
102+
“买马”是四个人在玩,有多余的人在旁无聊想参与进来,
103+
就在起完牌后随便拿一张牌(一般在最后几顿牌),以庄家为起点,
104+
按所拿牌面数字确定你买在谁身上了,然后跟着那个人一起输赢,
105+
当然倍数可能不一样。
106+
3、“笑系列”以及规则:
107+
暗扛--“暗笑”:手起或者中途起到四张一样的牌。算钱倍数与自摸相同都是两倍。
108+
(“暗笑”可以当时也可以过几圈再“笑”)
109+
补扛--“自笑”:起先将某一张牌“蹦”起来,后又自己将这张牌的绝张抓回来。算钱倍数为一倍,但3家都得开钱。
110+
(“自笑”只能当时“笑”)
111+
明扛--“点笑”:手起一扛,被人将这张牌的绝张打出,则为“点笑”。算钱与点冲一致。
112+
113+
114+
拿牌规则:第一次掷确定第二位掷骰子的参与者,庄家掷点
115+
例如:庄家为1,按逆时针方向,庄为东
116+
骰子点数 下次掷骰子的方位
117+
5、9 东
118+
2、6、10 南
119+
3、7、11 西
120+
4、8、12 北
121+
122+
123+
算番:
124+
胡牌方式分
125+
1、软摸1分
126+
2、黑摸2分
127+
3、炮胡1分
128+
4、抢杠2分
129+
5、热杠2分
130+
5、杠上花2分
131+
6、天胡3分
132+
7、地胡3分
133+
(注:多个时只取最高的,顺序7~1)
134+
135+
胡牌分或牌型分
136+
1、平胡1分
137+
(注:多个时只取最高的,顺序7~1)
138+
139+
扔赖分
140+
1、扔赖数量 * 2倍
141+
142+
收取方式:
143+
A分 = (胡牌方式 + 牌型分 + 扔赖分) * 底分
144+
1、庄家自摸收三家 * 1倍A分
145+
2、闲家自摸收三家 * 1倍A分
146+
3、庄家炮胡收一家 * 1倍A分(收放炮玩家)
147+
4、闲家炮胡收一家 * 1倍A分(收放炮玩家)
148+
149+
杠牌分
150+
B分 = 杠牌分
151+
1、明杠1分 * 1倍(放杠玩家出)
152+
2、暗杠2分 * 2倍(收三家)
153+
3、补杠1分 * 1倍(收三家)
154+
155+
总分 = A + B
156+
157+
TODO 前端展示方式调整,暂时按再有协议显示

‎act/messages/buy.proto

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
syntax = "proto3";
2+
package messages;
3+
4+
// 商城
5+
message CBuy
6+
{
7+
uint32 code = 1 ;//协议号
8+
uint32 id = 2; // 购买ID
9+
}
10+
11+
message SBuy
12+
{
13+
uint32 code = 1 ;//协议号
14+
uint32 result = 2; // 0购买成功,1失败
15+
uint32 error = 3 ; // 错误码
16+
}
17+
18+
// 微信支付 - 下单
19+
message CWxpayOrder
20+
{
21+
uint32 code = 1 ;//协议号
22+
uint32 id = 2; // 购买商品ID
23+
string body = 3; // 购买商品描述
24+
}
25+
26+
message SWxpayOrder
27+
{
28+
uint32 code = 1 ;//协议号
29+
uint32 id = 2; // 购买商品ID
30+
string payreq = 3; // 调起支付接口请求参数
31+
string orderid = 4; // 订单号
32+
uint32 error = 5 ; // 错误码
33+
}
34+
35+
// 微信支付 - 查询
36+
message CWxpayQuery
37+
{
38+
uint32 code = 1 ;//协议号
39+
string transid = 2; // 微信订单号
40+
}
41+
42+
message SWxpayQuery
43+
{
44+
uint32 code = 1 ;//协议号
45+
string orderid = 2; // 订单号
46+
uint32 result = 3; // 0支付成功,1发货中,2订单号不存在,3支付失败
47+
uint32 error = 4 ; // 错误码
48+
}
49+
50+
// 绑定代理id
51+
message CBuildAgent
52+
{
53+
uint32 code = 1;//协议号
54+
string agent= 2;//代理ID
55+
}
56+
57+
message SBuildAgent
58+
{
59+
uint32 code = 1;//协议号
60+
uint32 result = 2;//0成功,1不能绑定自己,2已经绑定,3不合格id,4不能绑定下级自己,5代理商不存在
61+
}

‎act/messages/chat.proto

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
syntax = "proto3";
2+
package messages;
3+
4+
// 房间广播文字聊天
5+
message CChatText
6+
{
7+
uint32 code = 1 ;//协议号
8+
string content = 2;
9+
}
10+
11+
// 广播文字聊天
12+
message SChatText
13+
{
14+
uint32 code = 1 ;//协议号
15+
uint32 seat = 2;
16+
string content = 3;
17+
uint32 error = 4 ; // 错误码
18+
}
19+
20+
// 房间广播语音聊天
21+
message CChatVoice
22+
{
23+
uint32 code = 1 ;//协议号
24+
string content = 2;
25+
}
26+
27+
// 广播语音聊天
28+
message SChatVoice
29+
{
30+
uint32 code = 1 ;//协议号
31+
uint32 seat = 2;
32+
string content = 3;
33+
uint32 error = 4 ; // 错误码
34+
}

‎act/messages/login.proto

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
syntax = "proto3";
2+
package messages;
3+
4+
// 登陆
5+
message CLogin
6+
{
7+
uint32 code = 1;//协议号
8+
string phone = 2;// 如果已经有userid不会再验证手机
9+
string password = 3;// 密码 (MD5)
10+
}
11+
12+
message SLogin
13+
{
14+
uint32 code = 1 ;//协议号
15+
string userid = 2 ;// 用户id
16+
uint32 error = 3 ; // 错误码
17+
}
18+
19+
// 注册
20+
message CRegist
21+
{
22+
uint32 code = 1 ;//协议号
23+
string nickname = 2;//昵称
24+
string phone = 3;//手机号
25+
string password = 4;//密码(md5)
26+
}
27+
28+
message SRegist
29+
{
30+
uint32 code = 1 ;//协议号
31+
string userid = 2 ;// 用户id
32+
uint32 error = 3 ; // 错误码
33+
}
34+
35+
// 微信登录登陆
36+
message CWxLogin
37+
{
38+
uint32 code = 1;//协议号
39+
string wxcode = 2; //微信code
40+
string token = 3; //token登录
41+
}
42+
43+
message SWxLogin
44+
{
45+
uint32 code = 1 ;//协议号
46+
string userid = 2 ;// 用户id
47+
string token = 3 ;// 返回access_token
48+
uint32 error = 4 ; // 错误码
49+
}

‎act/messages/protos.proto

+189
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
syntax = "proto3";
2+
package messages;
3+
import "github.com/AsynkronIT/protoactor-go/actor/protos.proto";
4+
5+
message Login {
6+
string Userid = 1;
7+
string Phone = 2;
8+
string Nickname = 3;
9+
actor.PID Sender = 4;
10+
}
11+
12+
message Logined {
13+
actor.PID Sender = 1;
14+
}
15+
16+
message RepeatLogin {
17+
actor.PID Sender = 1;
18+
actor.PID Repeat = 2;
19+
}
20+
21+
message Logout {
22+
actor.PID Sender = 1;
23+
}
24+
25+
message Request {
26+
string UserName = 1;
27+
string Message = 2;
28+
}
29+
30+
message Response {
31+
string UserName = 1;
32+
string Message = 2;
33+
}
34+
35+
//登录
36+
message OnlineReq {
37+
actor.PID Pid = 1; //玩家进程ID
38+
actor.PID Sender = 2; //玩家消息进程ID
39+
string Userid = 3;
40+
string Phone = 4;
41+
string Nickname = 5;
42+
}
43+
44+
message OnlineResp {
45+
bool Result = 1; //是否在线
46+
actor.PID Sender = 2; //玩家消息进程ID
47+
string Userid = 3;
48+
string Phone = 4;
49+
string Nickname = 5;
50+
}
51+
52+
//进入房间请求
53+
message EnterRoomReq {
54+
string Userid = 1; //玩家ID
55+
string Nickname = 2; //玩家昵称
56+
uint32 Sex = 3; //玩家性别
57+
string Photo = 4; //玩家头像地址
58+
uint32 Diamond = 5; //玩家钻石数量
59+
string Code = 6; //邀请码
60+
actor.PID Pid = 7; //玩家进程ID
61+
}
62+
63+
//响应进入房间
64+
message EnterRoomResp {
65+
bool Result = 1; //邀请码
66+
actor.PID Pid = 2; //玩家进程ID
67+
}
68+
69+
//创建房间请求
70+
message CreateRoomReq {
71+
string Userid = 1; //玩家ID
72+
string Nickname = 2; //玩家昵称
73+
uint32 Sex = 3; //玩家性别
74+
string Photo = 4; //玩家头像地址
75+
uint32 Diamond = 5; //玩家钻石数量
76+
uint32 Rtype = 6; //房间类型
77+
string Rname = 7; //房间名字
78+
uint32 Ante = 8; //房间底分
79+
uint32 Round = 9; //房间局数
80+
uint32 Payment =10; //付费方式
81+
uint32 Pao =11; //大牌玩法
82+
uint32 Count =12; //房间人数
83+
actor.PID Pid =13; //玩家进程ID
84+
}
85+
86+
//响应创建房间
87+
message CreateRoomResp {
88+
bool Result = 1; //创建成功或失败
89+
actor.PID Pid = 2; //玩家进程ID
90+
}
91+
92+
//房间准备请求
93+
message ReadyRoomReq {
94+
string Userid = 1; //玩家ID
95+
bool Ready = 2; //准备状态
96+
actor.PID Pid = 3; //玩家进程ID
97+
}
98+
99+
//第一次进入房间
100+
message EnterDeskReq {
101+
string Userid = 1; //玩家ID
102+
bool Result = 2; //进入成功或失败
103+
actor.PID Pid = 3; //玩家进程ID
104+
}
105+
106+
//离开房间
107+
message LeaveRoomReq {
108+
string Userid = 1; //玩家ID
109+
actor.PID Pid = 2; //玩家进程ID
110+
}
111+
112+
//打牌
113+
message DiscardReq {
114+
string Userid = 1; //玩家ID
115+
uint32 Card = 2; //打的牌
116+
bool State = 3; //是否为超时操作
117+
actor.PID Pid = 4; //玩家进程ID
118+
}
119+
120+
//胡碰杠操作
121+
message OperateReq {
122+
string Userid = 1; //玩家ID
123+
uint32 Card = 2; //操作的牌
124+
uint32 Value = 3; //操作值
125+
actor.PID Pid = 4; //玩家进程ID
126+
}
127+
128+
//超时打牌
129+
message TimerDiscardReq {
130+
string Userid = 1; //操作玩家
131+
uint32 Card = 2; //操作的牌
132+
}
133+
134+
//超时操作
135+
message TimerTurnReq {
136+
uint32 Seat = 1; //操作位置
137+
}
138+
139+
//房间关闭,离开房间
140+
message LeaveDesk {
141+
uint32 Seat = 1; //操作位置
142+
}
143+
144+
//房间关闭
145+
message DeskClose {
146+
string Code = 1; //邀请码
147+
}
148+
149+
//机器人消息
150+
message RobotMsg {
151+
string Code = 1;
152+
uint32 Num = 2;
153+
}
154+
155+
//注册消息
156+
message LogRegist {
157+
string Userid = 1;
158+
string Name = 2;
159+
string Nickname = 3;
160+
string Ip = 4;
161+
actor.PID Sender = 5; //日志进程
162+
}
163+
164+
//登录消息
165+
message LogLogin {
166+
string Userid = 1;
167+
uint32 Event = 2;
168+
string Ip = 3;
169+
actor.PID Sender = 4; //日志进程
170+
}
171+
172+
//登出消息
173+
message LogLogout {
174+
string Userid = 1;
175+
uint32 Event = 2;
176+
string Ip = 3;
177+
actor.PID Sender = 4; //日志进程
178+
}
179+
180+
//牌局结算
181+
message UpdateUser {
182+
string Userid = 1; //玩家ID
183+
uint32 Coin = 2; //玩家金币
184+
uint32 Diamond = 3; //玩家钻石数量
185+
uint32 Win = 4; //赢
186+
uint32 Lost = 5; //输
187+
uint32 Ping = 6; //荒
188+
uint32 Piao = 7; //飘
189+
}

‎act/messages/room.proto

+170
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
syntax = "proto3";
2+
package messages;
3+
import "vo.proto";
4+
5+
// 进入房间,断线重连
6+
message CEnterRoom
7+
{
8+
uint32 code = 1 ;//协议号
9+
string invitecode= 2; //房间邀请码,每个私人局房间都有一个唯一的邀请码
10+
}
11+
12+
message SEnterRoom
13+
{
14+
uint32 code = 1 ;//协议号
15+
RoomData roominfo = 2;//房间信息
16+
repeated RoomUser userinfo = 3;//房间内玩家信息
17+
repeated RoomCards cardinfo = 4;//玩家牌面数据
18+
RoomVote voteinfo = 5;//投票中时的投票数据
19+
uint32 error = 6 ; // 错误码
20+
}
21+
22+
// 离开房间
23+
message CLeave
24+
{
25+
uint32 code = 1 ;//协议号
26+
}
27+
message SLeave
28+
{
29+
uint32 code = 1 ;//协议号
30+
uint32 seat = 2; //玩家选择的座位号
31+
uint32 error= 3 ; // 错误码
32+
}
33+
34+
// 准备游戏
35+
message CReady
36+
{
37+
uint32 code = 1 ;//协议号
38+
bool ready = 2; //true准备,false取消
39+
}
40+
message SReady
41+
{
42+
uint32 code = 1 ;//协议号
43+
uint32 seat = 2; //准备游戏的玩家座位
44+
bool ready= 3; //true准备,false取消
45+
uint32 error= 4 ; // 错误码
46+
}
47+
48+
// 创建房间
49+
message CCreateRoom
50+
{
51+
uint32 code = 1 ;//协议号
52+
string rname = 2; //房间名字
53+
uint32 rtype = 3; //房间类型,里面定义低注等
54+
uint32 ante = 4; //底分
55+
uint32 round = 5; //牌局数
56+
uint32 payment = 6; //付费方式0=房主付费,1=AA付费
57+
uint32 pao = 7; //1=大牌玩法,0=不能炮胡
58+
uint32 count = 8; //房间人数(2,4)
59+
}
60+
// 返回房间数据,
61+
message SCreateRoom
62+
{
63+
uint32 code = 1 ;//协议号
64+
RoomData rdata = 2; //房间数据
65+
uint32 error = 3 ; // 错误码
66+
}
67+
68+
// 踢人
69+
message CKick
70+
{
71+
uint32 code = 1 ;//协议号
72+
uint32 seat = 2; //被踢的玩家座位
73+
}
74+
message SKick
75+
{
76+
uint32 code = 1 ;//协议号
77+
uint32 seat = 2; //被踢的玩家座位
78+
uint32 userid = 3; //被踢的玩家id
79+
uint32 result = 4; //0失败,1房主T人,2房间被解散
80+
uint32 error = 5 ; // 错误码
81+
}
82+
83+
// 其他玩家进入房间
84+
message SCamein
85+
{
86+
uint32 code = 1 ;//协议号
87+
RoomUser userinfo= 2;// 玩家的信息
88+
}
89+
90+
//开始游戏,打骰,选庄,选赖,发牌,包含两个骰子数字
91+
message SGamestart
92+
{
93+
uint32 code = 1 ;//协议号
94+
uint32 dice = 2; //1-6的骰子数,如63表示6,3
95+
uint32 dealer= 3; //庄家位置
96+
uint32 laipi = 4; //赖皮牌值
97+
uint32 laizi = 5; //赖子牌值
98+
repeated uint32 cards = 6; //手牌13张,庄家14张
99+
uint32 value = 7; //是否杠胡,掩码,庄家操作提示
100+
}
101+
102+
//抓牌
103+
message SDraw
104+
{
105+
uint32 code = 1 ;//协议号
106+
uint32 seat = 2; //摸牌玩家的座位号(1-4)
107+
uint32 card = 3; //所摸的牌,不是自己时为空
108+
uint32 value= 4; //掩码
109+
uint32 kong = 5; //1:杠后摸牌0:普通摸牌
110+
}
111+
112+
// 出牌
113+
message CDiscard
114+
{
115+
uint32 code = 1 ;//协议号
116+
uint32 card = 2; //牌值
117+
}
118+
119+
//玩家出牌广播
120+
message SDiscard
121+
{
122+
uint32 code = 1 ;//协议号
123+
uint32 seat = 2; //出牌玩家的座位号(1-4)
124+
uint32 card = 3; //牌值
125+
uint32 value= 4; //碰杠胡掩码
126+
uint32 error= 5 ; // 错误码
127+
}
128+
129+
// 玩家碰杠操作
130+
message COperate
131+
{
132+
uint32 code = 1 ;//协议号
133+
uint32 card = 2; //牌值
134+
uint32 value= 3; //提交碰杠相应的单个掩码值
135+
}
136+
137+
// 碰杠广播 ,胡牌不在这个接口返回
138+
message SOperate
139+
{
140+
uint32 code = 1 ;//协议号
141+
uint32 seat = 2; // 碰牌和杠牌玩家的座位号
142+
uint32 beseat = 3; // 被碰杠胡的玩家座位号
143+
uint32 card = 4; // 被碰或杠牌的牌值
144+
uint32 value = 5; // 碰或值杠,掩码
145+
uint32 discontinue= 6; // 抢杠
146+
uint32 error = 7 ; // 错误码
147+
}
148+
149+
// 处理前面有玩家胡牌优先操作,如果该玩家跳过胡牌,此协议向有碰和明杠的玩家主动发送
150+
message SPengKong
151+
{
152+
uint32 code = 1 ;//协议号
153+
uint32 seat = 2; // 出牌玩家的座位号(1-4)
154+
uint32 card = 3; // 牌值
155+
uint32 value= 4; // 碰杠胡,掩码表示
156+
}
157+
158+
// 结算广播接口,游戏结束
159+
message SGameover
160+
{
161+
uint32 code = 1 ;//协议号
162+
uint32 roomid = 2;//牌局id
163+
uint32 round = 3;//剩余牌局数
164+
uint32 expire = 4;//牌局设定的时间(牌局存在的时间)
165+
uint32 huType = 5;//0:黄庄,1:自摸,2:炮胡
166+
uint32 paoSeat= 6;//放炮玩家座位号
167+
uint32 seat = 7;//胡牌玩家座位号
168+
uint32 card = 8;//胡牌的牌值(玩家胡的是哪张牌)
169+
repeated RoomOver data = 9;//结算数据
170+
}

‎act/messages/user.proto

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
syntax = "proto3";
2+
package messages;
3+
import "vo.proto";
4+
5+
// 获取游戏全局配置数据
6+
message CConfig
7+
{
8+
uint32 code = 1;//协议号
9+
}
10+
11+
message SConfig
12+
{
13+
uint32 code = 1;//协议号
14+
string imageurl = 2; // 玩家头像图片服务器地址和端口
15+
string version = 3; // 版本号
16+
}
17+
18+
// 获取玩家的数据
19+
message CUserData
20+
{
21+
uint32 code = 1 ;//协议号
22+
string userid = 2;//用户id
23+
}
24+
25+
message SUserData
26+
{
27+
uint32 code = 1 ;//协议号
28+
UserData data = 2;
29+
uint32 error = 3; // 错误码
30+
}

‎act/messages/vo.proto

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
syntax = "proto3";
2+
package messages;
3+
4+
// 玩家的详细数据
5+
message UserData
6+
{
7+
string userid =1;//用户账号
8+
string nickname =2;//昵称
9+
string phone =3;//电话号码
10+
uint32 sex =4;//用户性别,男1 女0
11+
uint32 status =5;//屏蔽状态(正常0 锁定1 黑名单2)
12+
string photo =6;//头像
13+
uint32 coin =8;//金币
14+
uint32 diamond =9;//钻石
15+
uint32 win =10;//输的局数
16+
uint32 lost =11;//赢的局数
17+
uint32 ping =12;//平局数
18+
uint32 piao =13;//飘赖子次数
19+
uint32 roomtype =14;//所在房间类型id
20+
uint32 roomid =15;//所在房间id
21+
string invitecode=16;//所在房间邀请码
22+
}
23+
24+
// 玩家在房间内的基础数据
25+
message RoomUser
26+
{
27+
string userid =1;//用户账号
28+
string nickname =2;//昵称
29+
uint32 seat =3;//座位号
30+
uint32 sex =4;//用户性别,男1 女0
31+
string photo =5;//头像
32+
uint32 coin =7;//金币
33+
uint32 diamond =8;//钻石
34+
bool ready =9;//玩家de准备状态
35+
uint32 win =10;//输的局数
36+
uint32 lost =11;//赢的局数
37+
uint32 ping =12;//平局数
38+
uint32 piao =13;//飘赖子次数
39+
int32 score =14;//当前积分
40+
uint32 value =15;//碰杠胡掩码(重连进入房间时)
41+
repeated uint32 handcards =16;//玩家手牌
42+
}
43+
44+
// 房间数据
45+
message RoomData
46+
{
47+
uint32 roomid = 1; //牌局id
48+
uint32 rtype = 2; //room type
49+
string rname = 3; //room name
50+
uint32 expire = 4; //牌局设定的时间(牌局存在的时间)
51+
uint32 count = 5; //房间限制数量
52+
string invitecode= 6; //房间邀请码
53+
uint32 dealer = 7; //庄家位置
54+
uint32 round = 8; //剩余牌局数
55+
string userid = 9; //房主ID
56+
bool state =10; //房间状态
57+
uint32 cards =11; //剩余未摸起的牌数
58+
uint32 dice =12; //1-6的骰子数
59+
uint32 turn =13; //当前打牌玩家
60+
uint32 laipi =14; //赖皮牌值
61+
uint32 laizi =15; //赖子牌值
62+
}
63+
64+
// 房间桌面牌数据(重复进入房间时数据)
65+
message RoomCards
66+
{
67+
uint32 seat =1;//玩家的座位
68+
repeated uint32 peng =2;//最高字节为被碰牌玩家座位号,第二字节为碰牌值
69+
repeated uint32 kong =3;//最高字节为放杠玩家的座位(1-4),非明杠则为0,第二字节为杠牌值,第三个字节为杠类型(暗杠/明杠/补杠)最低字节保留
70+
repeated uint32 outcards=4;//每个玩家跟前的海底牌
71+
}
72+
73+
// 结算数据
74+
message RoomOver
75+
{
76+
uint32 seat =1; //玩家座位号
77+
string userid =2; //用户id
78+
repeated uint32 cards =3; //玩家手牌
79+
uint32 hu =4; //胡牌类型,掩码值,为0时不胡牌
80+
int32 huTypeFan =5; //胡牌方式番数(比如:热炮,杠上开花,杀报等等方式胡牌时额外的番数)
81+
int32 huFan =6; //胡牌牌型番数(仅针对胡牌牌型的番数)
82+
int32 mingKong =7; //明杠的番数
83+
int32 beMingKong=8; //被杠的负番数
84+
int32 anKong =9; //暗杠的番数
85+
int32 buKong =10; //补杠的番数
86+
int32 total =11; //总番数,总番=胡牌牌型番值*马的番值
87+
int32 coin =12; //输赢金币数量
88+
int32 score =13; //当前积分
89+
}
90+
91+
// 投票信息
92+
message RoomVote
93+
{
94+
uint32 seat =1;//发起投票的玩家座位号
95+
repeated uint32 agree =2;//同意
96+
repeated uint32 disagree=3;//不同意
97+
}

‎act/service.sh

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#!/bin/bash
2+
# -------------------------------------
3+
# 服务启动脚本
4+
#
5+
# @author piaohua
6+
# @date 2017-04-02 21:49:17
7+
# -------------------------------------
8+
9+
appname=server
10+
workDir=$(cd `dirname $0`; pwd)
11+
binFile="$workDir/$appname"
12+
pidFile="$workDir/$appname.pid"
13+
error=""
14+
15+
cd $workDir
16+
17+
start() {
18+
./$binFile -log_dir="log" > /dev/null 2>&1 &
19+
echo $! > $pidFile
20+
}
21+
22+
stop() {
23+
if [[ -e $pidFile ]]; then
24+
pid=`cat $pidFile`
25+
rm -f $pidFile
26+
else
27+
pid=`ps aux | grep $appname | grep -v grep | awk '{print $2}' | head -1`
28+
fi
29+
30+
if [ "$pid"x != ""x ]; then
31+
kill -2 $pid
32+
else
33+
error="服务不在运行状态"
34+
return 1
35+
fi
36+
}
37+
38+
case $1 in
39+
start)
40+
if [[ -e $pidFile ]]; then
41+
echo "服务正在运行中, 进程ID: " $(cat $pidFile)
42+
exit 1
43+
fi
44+
echo -n "正在启动 ... "
45+
start
46+
sleep 1
47+
echo "成功, 进程ID:" $(cat $pidFile)
48+
;;
49+
stop)
50+
echo -n "正在停止 ... "
51+
stop
52+
if [[ $? -gt 0 ]]; then
53+
echo "失败, ${error}"
54+
else
55+
echo "成功"
56+
fi
57+
;;
58+
restart)
59+
echo -n "正在重启 ... "
60+
stop
61+
sleep 1
62+
start
63+
echo "成功, 进程ID:" $(cat $pidFile)
64+
;;
65+
status)
66+
if [[ -e $pidFile ]]; then
67+
pid=$(cat $pidFile)
68+
else
69+
pid=`ps aux | grep $appname | grep -v grep | awk '{print $2}' | head -1`
70+
fi
71+
if [[ -z "$pid" ]]; then
72+
echo "服务不在运行状态"
73+
exit 1
74+
fi
75+
exists=$(ps -ef | grep $pid | grep -v grep | wc -l)
76+
if [[ $exists -gt 0 ]]; then
77+
echo "服务正在运行中, 进程ID为${pid}"
78+
else
79+
echo "服务不在运行状态, 但进程ID文件存在"
80+
fi
81+
;;
82+
build)
83+
rebuild
84+
;;
85+
*)
86+
echo "$appname启动脚本"
87+
echo "用法: "
88+
echo " ./service.sh (start|stop|restart|status)"
89+
;;
90+
esac

0 commit comments

Comments
 (0)
Please sign in to comment.