想想MUD/MUCKs,但也许有头像或场所插图.我选择的语言是红宝石.
我需要处理多个持久连接,并在服务器及其各个客户端之间异步传输数据.必须根据客户端会话中发生的活动保持单个数据库的最新状态.每个客户端会话中的活动可能需要立即更新多个其他客户端(用户进入房间;用户向另一个用户发送私人消息).
这是一个目标项目 和一个学习项目,所以我的目的是重新发明一两个轮子,以了解有关并发网络编程的更多信息.但是,我对并发和网络编程都不熟悉; 以前我几乎专门在Web应用程序中的非持久性同步HTTP请求的世界中工作.所以,我想确保我重新发明了正确的轮子.
根据emboss的优秀答案,我开始关注某些HTTP服务器的内部情况,因为Web应用程序通常可以避免由于服务器本身抽象问题的彻底解决而导致的线程问题.
我不想使用EventMachine或GServer,因为我还不知道他们做了什么.一旦我对他们的工作方式有了一般意识,他们解决了什么问题以及为什么它们有用,我会对此感到满意.我的目标不是"写游戏",而是"编写游戏并了解一些低级别的东西是如何工作的".我也不清楚某些术语的界限; 例如,"I/O-unbound apps"是"事件驱动的应用程序"的超集吗?反之亦然?
我当然对实现我的目标的一种正确的方式感兴趣,如果它存在,但总体而言我想理解为什么它是正确的方式以及为什么其他方式不太可取.
您可以建议的任何书籍,电子书,在线资源,示例项目或其他花絮都是我真正追求的.
我现在正在做的事情是使用IO#select
阻塞连接套接字列表,超时为0.1秒.它将读取的任何信息推送到线程安全的读取队列中,然后无论何时达到超时,它都会从线程安全的写入队列中提取数据.我不确定超时是否应该更短.还有第二个线程轮询套接字处理线程的读取队列并处理"请求".这比我最初的工作方式要好,但仍然可能不太理想.
我在Hacker News上发布了这个问题,并且链接到了我正在处理的一些资源; 类似的东西会很棒:
作为一个业余爱好项目,我正在尝试创建一个ROM(基于Diku-Merc)的衍生产品.(现已不复存在)如果有人做过类似的事情并且有一些有用的资源可以分享或提供提示,我将不胜感激.我发现很多邮件列表等资源不再活跃,许多链接已经死亡.
我选择了ROM,因为这是我作为玩家所熟悉的,但是源代码比我遇到的任何内容都要复杂,我不介意选择更容易理解的代码库.在我认真潜入之前的任何建议也将受到赞赏.
至于泥泞社区,我不知道泥泞连接器之外的东西,因为我一直比开发人员更多地担任用户/玩家角色.一个宽容和积极的地方,我可以得到我的问题的答案是我最重视的.
我正在使用Clojure编写的MUD客户端.现在,我需要两个不同的线程.接收来自用户的输入并将其发送到MUD(通过简单的Socket),以及从MUD读取和显示输出的输入到用户的输入.
我应该只使用Java线程,还是我应该转向某些特定于Clojure的功能?
我正在使用java编写MUD(基于文本的游戏).MUD的一个主要方面是格式化字符串并将其发送回用户.如何最好地完成这项工作?
说我想发送以下字符串:
你对别人说"你好!" - "有人","说"和"你好!" 都是变数.哪个表现最好?
"You " + verb + " to " + user + " \"" + text + "\""
要么
String.format("You %1$s to %2$s \"%3$s\"", verb, user, text)
还是其他一些选择?
我不确定最终哪个更容易使用(这很重要,因为它将无处不在),但我现在正在考虑这个问题,因为与+的连接变得有点混乱一些更大的线.我觉得在这种情况下使用StringBuilder只会让它更具可读性.
这里有什么建议吗?
希望这个问题不会太复杂或模糊.我知道我想要的是什么,所以手指交叉我可以在文本中得到这个.
我正在寻找一种语法与我自己的规范,所以我想我需要自己创建一个.我花了最近几天阅读有关编译器,词法分析器,解析器,汇编语言,虚拟机等的内容,而且我正在努力根据我实现目标所需的内容进行排序(文件附在底部一些规格).从本质上讲,我对于我需要使用哪些工具才能前进而感到非常困惑.
一点背景:所用的语言有望用于实现多人,基于文本的MUD服务器.因此,它需要简单的内置功能来创建/维护客户端TCP/IP连接,非阻塞IO,通过SQL或类似的数据库访问.我也对安全感兴趣,因为我不希望为这种语言编写的代码能够在没有专业软件的情况下被公众窃取和使用.这可能意味着它应该编译为目标代码
那么,创建符合这些规范的语言的最佳选择是什么?
我的结论如下.这只是我最好的教育猜测,所以如果你认为我正朝着错误的方向前进,那么请对我提出质疑.我大多只是把它包括在内,看看当专家们发表意见时我是多么的困惑.
为了代码安全,我应该想要一种编译并在虚拟机中运行的语言.如果我这样做,我将有很多工作要做,不是吗?在较低级别编写虚拟机,汇编语言,然后在更高级别的代码库上编写自己处理IO,套接字等,而不是使用现有模块?
我只是很困惑.
我不确定我是否有意义.
如果有人能够平息我的大脑,我真诚地感激它!或者,如果我离开课程并且有更简单的方法,请告诉我!
compiler-construction parsing language-design mud vm-implementation
我曾经根据Smaug Codebase播放MUD .它是高度定制的,但核心是相同的.我有这个MUD的源代码,我有兴趣编写自己的(只是为了一个有趣的项目).我有一些问题,主要是关于设计方面.也许有人可以帮我一把?
我希望它可以扩展到允许50个玩家同时在线,而不会降低性能.如果我使用Ruby 1.8(非常慢),与使用Python 3.1(更快)或编译C/C++相比,它会有所作为吗?
如果有人可以伸出援助之手并提供一些信息或建议,我将永远感激不尽.
我正在建立一个单人游戏MUD,它基本上是一个基于文本的战斗游戏.它没有联网.
我不明白如何收集用户命令并将它们异步传递到我的事件循环中.当游戏事件发生时,玩家需要能够随时输入命令.因此,使用raw_input暂停该过程将不起作用.我想我需要做一些像select.select和使用线程的东西.
在下面的示例中,我有一个userInputListener()的模型函数,我喜欢接收命令,如果有输入,则将它们附加到命令Que.
如果有一个事件循环,例如:
from threading import Timer
import time
#Main game loop, runs and outputs continuously
def gameLoop(tickrate):
#Asynchronously get some user input and add it to a command que
commandQue.append(userInputListener())
curCommand = commandQue(0)
commandQue.pop(0)
#Evaluate input of current command with regular expressions
if re.match('move *', curCommand):
movePlayer(curCommand)
elif re.match('attack *', curCommand):
attackMonster(curCommand)
elif re.match('quit', curCommand):
runGame.stop()
#... etc
#Run various game functions...
doStuff()
#All Done with loop, sleep
time.sleep(tickrate)
#Thread that runs the game loop
runGame = Timer(0.1, …
Run Code Online (Sandbox Code Playgroud) 我有一个为游戏服务器中的所有玩家和对象运行tick()的函数.我这样做是通过每隔0.1秒循环一次.我需要它是一个坚实的.1.大量的时间和数学取决于这个暂停尽可能精确到.1秒.为实现这一点,我将其添加到tick线程:
start_time = time.time()
# loops and code and stuff for tick thread in here...
time_lapsed = time.time() - start_time # get the time it took to run the above code
if 0.1 - time_lapsed > 0:
time.sleep(0.1 - time_lapsed)
else:
print "Server is overloaded!"
# server lag is greater that .1, so don't sleep, and just eat it on this run.
# the goal is to never see this.
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是最好的方法吗?如果我的循环持续时间是0.01,那么time_lapsed == 0.01 ...然后睡眠应该只有0.09.我问,因为它似乎没有起作用.我前几天开始收到重载的服务器消息,服务器肯定没有超载.关于"动态"控制睡眠的好方法的任何想法?也许有一种不同的方式来运行代码每十分之一秒不睡觉?
我正在写一个文本游戏,我需要一个简单的战斗系统,就像在MUD中一样,你发出命令,偶尔发生"滴答",当所有这些命令执行时,玩家和怪物造成伤害,各种不同的东西发生.我该如何实现这个概念?我想过做保存最后一跳时间的变量,而只是把堆栈的事件,在那个时候(时间+ X)执行所有这些simutaniously功能.有没有更简单或更清洁的变体呢?
那可能的语法是什么?
double lastTickTime;
double currentTime;
void eventsPile(int event, int target)
{
// how do i implement stack of events? And send them to execute() when time is up?
}
void execute(int event, int target)
{
if ((currentTime - lastTickTime) == 2)
{
eventsHandler(event, target);
}
else
{ // How do I put events on stack?
}
}
Run Code Online (Sandbox Code Playgroud) 我需要在我正在使用python构建的MUD(或者更多,如果可能的话)中从玩家的当前房间中抽取2个半径图.房间设置为容器,self.exits = {'west':1, 'north':2}
其中键是值(相邻房间的UID)所在的方向.客房仅以这种方式相连.self.location为0的玩家可以键入'n',并且基于上面的变量,他们的位置将是2,并且该房间的内容将玩家的UID附加到其内容.
所以,我希望根据上面的变量显示一个如下所示的地图,其中'u'是玩家的当前位置.
[ ]
|
[ ]-[u]
Run Code Online (Sandbox Code Playgroud)
我已经实现了这一部分,因为这只是一个半径1.这里有一个小的(经过大量修改,在这里发布)我如何做到这一点的片段,你会明白为什么我发帖,因为它的代码很差.
mloc = '[u]'
mn = ' '
mw = ' '
spn= ' '
spw= ' '
for Exit in room.exits.keys():
if Exit == 'north':
mn = '[ ]'
spn = '|'
if Exit == 'west':
mw = '[ ]-'
# player.hear() is our function for printing a line to the player's screen
player.hear(' '+mn)
player.hear(' '+sp)
player.hear(mw+mloc)
Run Code Online (Sandbox Code Playgroud)
在我疯狂的情况下,我成功地完成了所有8个不同方向的工作(对角线,不包括向上或向下).但是我必须循环使用我的第一个for循环解析的房间,然后绘制它们,然后将它全部分开,然后考虑(sp)aces的重叠,例如'\'或' |" 如果有相互交叉的路径.这个小小的任务立刻变成了噩梦,在我完成之前已经进入了200行.
另一个障碍是我只能逐行打印.因此,如果地图高50个字符,我必须有player.hear()
50行,我不反对.在发布答案之前,请记住这一点.
我对格式化也不挑剔.我只想简单地想要一张"地图一览"来帮助玩家环游世界. …
mud ×10
python ×3
c++ ×1
client ×1
clojure ×1
concurrency ×1
event-loop ×1
input ×1
java ×1
networking ×1
online-game ×1
parsing ×1
python-2.7 ×1
ruby ×1
time ×1