作者LaPass (LaPass)
看板GameDesign
标题Fw: [问题] 对亦游戏的 SERVER 端怎麽写?
时间Thu Nov 28 22:36:53 2013
※ [本文转录自 java 看板 #1IbrI_2L ]
作者: LaPass (LaPass) 看板: java
标题: [问题] 对亦游戏的 SERVER 端怎麽写?
时间: Thu Nov 28 22:35:40 2013
打算用websocket在网页上写个对弈游戏
例如黑白棋、五子棋、围棋等等
目前已经将websocket的连线转接过
所以可以不用管那些技术细节
现在我在做的是对奕室的SERVER部份
就是,两人轮流子,以及把棋盘的结果传输给观众的部份
里面有
1.一群观众
2.玩家(a) (要考虑网页视窗多开的可能性,因为应该会有人这样干)
3.玩家(b)
流程是这样:
1.轮到玩家(a)下棋,通知玩家a进入落子模式
2.等候玩家(a)
3.当任何一个玩家(a)的连线收到落子讯号时,忽略其他玩家(a)连线的落子
并关闭玩家(a)的落子模式
4.通知所有使用者(玩家a、玩家b、观众)棋盘上多了颗旗子
5.判断胜负,如果出现胜负就切换到游戏结束的流程
6.轮到玩家(b)落子,以下略
因为没看过别人关於这部份的设计
也不知道该用什麽关键字去找这样的范例或设计模式
自己想了两个....
一是依照一般的游戏流程,分成update()跟draw()两部份
由更上层的执行序控制的逻辑,去定时呼叫计算跟绘图两部份
一般游戏的是60fps,不过如果是对弈类的,应该300毫秒就很即时了
但是 ,这样可能会让程式变得很复杂
理由是每次执行到update()时,他都要去判断现在的流程到哪个地方
然後在决定要作什麽事情这样
二是专门开一条执行序去跑游戏逻辑的loop
如果跑到要等待的地方就把他blok在那边
这样程式会比较好写
但是我觉得这方法可能会有个问题就是.....
万一有一千个人在下棋,就有一千个游戏室
那不就意味着有一千条执行序在跑?
我没写过什麽太大的、一堆人同时在线的程式
不知道这样写会不会有什麽问题.....
所以想请问
一般游戏SERVER是怎麽处理这种游戏逻辑的?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.38.73.123
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: LaPass (114.38.73.123), 时间: 11/28/2013 22:36:53
1F:→ LaPass:补充,是用java写的 11/28 22:38
2F:推 Ayukawayen:感觉State并没有很多 Server端的Event基本上只有落子 11/28 23:42
3F:→ Ayukawayen:以event-driven在收到落子的Request时做处理应该可解? 11/28 23:44
4F:→ LaPass:感谢,我一开始想的太复杂了XD 11/29 00:10
5F:推 LayerZ:与其看是否第一个a送的讯号,不如验证a送来的是否合法吧 11/29 00:40
6F:→ LayerZ:同时有两个合法的讯号来源本身就是问题了? 11/29 00:40
7F:→ LayerZ:而1000个游戏室,在我看来1000条执行绪跟1条执行绪似乎没 11/29 00:42
8F:→ LayerZ:似乎都一样吧XD 11/29 00:42
9F:→ LayerZ:有什麽非用Multi-Thread的理由? 11/29 00:43
10F:推 Bencrie:感觉 multiprocess 好处比较大,一条线炸了不会全死 11/29 08:44
11F:→ LayerZ:我这样说好了,一个房间开始後,一定要一个单独Thread去维 11/29 10:15
12F:→ LayerZ:持该房间的运作? 其实server端处理的资料只有验证玩家跟 11/29 10:16
13F:→ LayerZ:处理每回合玩家送来的资料吧 11/29 10:16
14F:→ LayerZ:好吧,还是Java跟C不同(死 11/29 10:40
15F:推 sorkayi:event-driven 加上 class_tag 为什麽要用 thread? 11/29 15:17
16F:→ sorkayi:加上 time out 处理 断线问题? 11/29 15:21
17F:推 llzzyy01:我自己写也是至少一个Thread在Server端 12/01 16:56