0

我正在用 Go 编写一个简单的程序作为学习语言的练习。该程序是一个游戏玩家:它是一个基于文本的游戏,然后通过/exec.Command与之通信。在闲逛并阅读了大量在线文档之后,我设法让骨架工作——相当于 Hello World,我已经建立了双向通信,并且可以处理程序终止等错误。StdinPipeStdoutPipe

现在我正在尝试编写实际的游戏 AI 代码。因为我的目的是学习这门语言,所以我对风格非常谨慎——我不只是想用 Go 编写 C(或其他语言)。

程序中明显的分工(一旦完成所有设置)分为两部分。首先,程序查看当前状态并决定应该向游戏发出什么命令。其次,程序查看返回的数据并相应地更新状态。(是的,这是一个简单的游戏——它等待输入然后响应,没有时间问题。)

我不确定这个状态信息应该去哪里。将它全部转储到全局范围内感觉是错误的,并且制作一个巨大的单例对象似乎更糟(而且 Go 并不是特别 OO)。无论如何,我不想让函数传递并返回 20 多个变量。

一般建议很好,但我最感兴趣的是惯用的 Go 语言。根据要求,我可以共享代码,但我认为这不会有帮助。

4

2 回答 2

2

我喜欢为此目的使用一个包。

简单的例子:

package foo

func Incr() {
    f.incr()
}

func Count() int {
    return f.count()
}

type foo struct {
    sync.RWMutex
    count int
}

func (f *foo) incr() {
    f.Lock()
    f.count++
    f.Unlock()
}

func (f *foo) count() int {
    f.RLock()
    defer f.RUnlock()
    return f.count
}

var f = &foo{}

该包可以导入任何其他包并保持状态。我添加了 sync.RWMutex 以防止任何竞争条件。这使您可以完全控制 foo 的状态如何被访问和很好地包含。

于 2014-10-03T02:06:13.433 回答
1

Go 确实启用了一种OO 编程风格

为游戏状态创建一个结构类型。在你的程序中传递一个指向这种类型的值的指针,或者如果这种事情不打扰你,则将指针存储在包级变量中。根据需要在此类型上实施方法。考虑将它放在自己的包中以进行更好的封装。

于 2014-10-02T22:22:15.337 回答