小编Diz*_*zzy的帖子

通过网络排序事件(网络化回合制游戏)

我对haskell网络(以及一般的点对点通信)相当新,并且正在寻找一种玩家到玩家联网的刽子手游戏,类似于流行的"和朋友一起玩".在完成了一些教程,包括haskell.org的"实现聊天服务器"之后,我能够成功创建一个服务器并将套接字连接到套接字,然后弹回消息和第四个消息.

我还有一个刽子手客户端,在给定预定输入时按预期播放.

但是,我遇到了连接客户端之间排序事件的问题.因为读取和写入套接字通道发生在不同的线程上(由于readChan和writeChan的阻塞性质),我不确定如何在远程终端之间对动作进行排序.我知道我想要什么,而不是如何到达那里:

  1. 一旦第二个用户连接,调用"发送"功能,提示他们输入第一个玩家的输入字
  2. 玩家1通过"接收"功能接收此单词,并且,如果它不是命令关键字(加入,退出,结果),则使用提供的单词运行刽子手游戏.同时,玩家2的屏幕阻挡,等待玩家1完成.
  3. 玩家1完成.记录他的结果,然后为他调用"发送"功能,提示他输入游戏.
  4. 重复2-3直到玩家退出.

我已经走了几步.我更成功的方法之一是通过阻塞信号量.我曾经想过随着"控制"玩家的转变而使用MVar.它在第一个转弯时正确运行,但此后降级为乱码.一个信号的信道内的概念(这基本上是它的方式太块的无功)真的把我的头搞乱.因为它确实阻止了,它的证明也很难调试.

我对信号量的了解有点不稳定.我这样做的方式是否有意义?

代码可以在bitbucket存储库中找到.以下是获取正确代码/分支所需的步骤:

git clone git@bitbucket.org:ndisidore/haskell-hangman.git
git checkout block-sem
Run Code Online (Sandbox Code Playgroud)

在线查看.

跑步: runhaskell NetInterface.hs

这会创建一个侦听端口3468的套接字

要作为客户端/播放器连接,请打开一个单独的终端并运行"telnet localhost 3468".这需要做两次,每个玩家一次.

提前致谢.

sockets networking multithreading haskell semaphore

6
推荐指数
0
解决办法
319
查看次数

标签 统计

haskell ×1

multithreading ×1

networking ×1

semaphore ×1

sockets ×1