首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于MUD服务器和文本的客户端

基于MUD服务器和文本的客户端
EN

Stack Overflow用户
提问于 2017-07-14 08:02:36
回答 1查看 461关注 0票数 2

我已经开始开发一个简单的MUD (基于文本的多玩家地牢),客户端只使用终端连接和播放。

无论如何,我用不同的方式来处理它,我希望玩家能够在房间(x,y)周围移动,并在下面的屏幕截图中看到房间的地图。

所看到的整个屏幕由服务器发送给客户端,更新如下:

有人动了,现在的位置变了,有人掉了东西,等等.

在屏幕的底部,有一个客户端可以放置以下命令的地方:

听着,东,西,捡,放下,盘点,.

问题

然而,设计的问题是,当用户正在放置一个命令时,同时服务器已经更新了它的屏幕(有人移动了,或者生成了一些事件),他会松开正在输入的命令,因为整个屏幕被刷新了。

如何将屏幕发送给播放机?

我在服务器端构建视图,当发送到客户端时,我使用ANSI字符:

  1. 清除屏幕(\u001b[H\001b[2J])
  2. 在窗口的特定区域找到光标(\033[.)绘制视图的特定区域

问题

当我向客户发送视图时,是否有可能客户端不会丢失他们的输入?

换句话说,是否有可能(可能需要一些ANSI代码?)当我在终端中输入一些东西,同时如果我收到了什么,我的输入就不会被新收到的消息打断?

要使问题形象化:

好:

代码语言:javascript
复制
from server: aaa
from server: bbb
> input

当前:

代码语言:javascript
复制
from server: aaa
> in
from server: bbb
put
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 09:01:21

替代解

在客户端构建视图可能是个更好的主意--然后服务器只需要发送“原始信息”,客户机就可以显示它。在本例中,您已经说过服务器会发送一个新的视图,比如有人在移动--所以只需要向客户端发送一条消息,上面写着"Bob已经移动了“,而不是一个全新的呈现屏幕,让客户机来处理更新。

这有多个优点--为了解决您的问题,您只需缓冲任何服务器输入,直到用户完成输入,或者重新绘制客户端用户没有主动更改的屏幕上的任何部分。

它还允许在客户端进行更多的自定义--如果服务器发送视图,客户端如何在对服务器视图的不同分辨率的终端上显示视图?通过客户端渲染,您可以在每个客户端处理这类问题。通过让客户用户定制他们的个人视图,你也可以打开大量定制的大门。

用你现有的策略解决问题

如果您固定要让服务器构造视图,那么在客户机上,您可以一次读取单个字符的输入(在windows _getch上,linux ncurses上提供此功能),那么如果服务器更新只是呈现新视图,然后重新呈现用户预先输入的内容。

另一项建议

安西密码是..。凌乱。使用像curses这样的库可以使基于控制台的guis更好、更易于维护。在linux上有ncurses,在windows上有一个名为pdcurses的开源变体(显然具有相同的API,只是在一个独立的库中公开)。在Windows上编译时,您需要更改链接器设置,但希望不是任何代码)。感谢Bartek提到这件事。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45097798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档