我用django、websocket开发一个在线扑克游戏,遇到问题请教。
我的意图,也是扑克游戏的普通规则:
1、利用django自带的auth模块,建立有不同的3个用户;
2、3个用户不会同时进入牌室,等到最后(第3个用户登录并send准备好的指令)进入,后端发不同的牌给3个用户;
3、出牌时,所有用户都能看到。
这里涉及到几个概念:
1、关于群发与私发。对于发牌,是一对一向指定用户私发;对于出牌,则是群发。怎样实现群发与私发?
2、等待用户到齐,这个需要用异步模式吗?还是不一定?或者这个阶段用ajax请求?
脑袋一团雾水,请教各位的指点,最好有代码及注释说明!谢谢!

请教一个django websocket同步与异步、group分组与向特定用户发信息的问题。(语言-python)
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- IT_service_mesh 2023-03-23 22:05关注
参考GPT和自己的思路:
对于你的问题,我建议使用django-socketio这个第三方库来实现websocket的功能。它可以支持异步、分组和向特定用户发送信息等功能。
对于你的需求,可以先使用django自带auth模块建立3个用户,然后在websocket连接时将用户所属的组信息传入。可以使用socketio的join_group和leave_group方法进行分组操作。
对于发牌,可以在服务器端维护一个牌局信息,然后根据用户所属的组向对应的用户发送发牌信息,例如:
from socketio.namespace import BaseNamespace class PokerNamespace(BaseNamespace): def on_connect(self): # 将用户所属的组信息传入 self.group = self.request.args.get('group') def on_ready(self, data): # 等待所有用户准备就绪 ready_users = get_ready_users() if len(ready_users) == 3: # 发牌 deal_cards() # 向各自分组的用户发送发牌信息 self.socketio.emit('deal', cards, room=self.group)
对于出牌,可以使用socketio的broadcast方法向所有用户群发出牌信息,例如:
def on_play_card(self, data): # 出牌 play_card(data['card']) # 群发出牌信息 self.socketio.emit('play', {'player': self.request.sid, 'card': data['card']}, broadcast=True)
至于等待用户到齐的问题,可以在客户端发送一个ready事件告知服务器用户已准备就绪,然后在服务器端维护一个列表,判断列表中的用户数是否为3,若为3则说明所有用户都准备就绪,可以进行发牌操作。可以使用socketio的emit方法向单个用户发送信息,例如:
def on_ready(self, data): # 将准备就绪的用户添加到列表中 self.ready_users.append(self.request.sid) # 发送准备就绪信息给用户 self.socketio.emit('ready', {'player': self.request.sid}) if len(self.ready_users) == 3: # 发牌 deal_cards() # 向各自分组的用户发送发牌信息 self.socketio.emit('deal', cards, room=self.group)
以上是代码示例,注意注释和自己的代码逻辑进行对比。希望可以帮助到你!
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报