【问题标题】:Print multiple rows in parallel Golang并行打印多行 Golang
【发布时间】:2019-04-08 22:01:11
【问题描述】:

我正在尝试编写一个多行的赛马模拟器。 每行将代表一个由 goroutine 计算的马的位置。

由于某种原因,代码在 Go Playground 上运行时不会像在我的机器上那样随机输出数字。

package main

import (
    "math/rand"
    "os"
    "strconv"
    "time"
)

var counter = 0

func main() {
    i := 1
    horses := 9
    for i <= horses {
        go run(i)
        i++
    }
    time.Sleep(5000 * time.Millisecond)
    print("\ncounter: " + strconv.Itoa(counter))
    print("\nEnd of main()")
}

func run(number int) {
    var i = 1
    var steps = 5
    for i <= steps {
        print("[" + strconv.Itoa(number) + "]")
        rand.Seed(time.Now().UnixNano())
        sleep := rand.Intn(10)
        time.Sleep(time.Duration(sleep) * time.Millisecond)
        i++
        counter++
    }
    if i == steps {
        println(strconv.Itoa(number) + " wins")
        os.Exit(1)
    }
}

游乐场:https://play.golang.org/p/pycZ4EdH7SQ

我的无序输出是:

[1][5][8][2][3][4][7][9][6][7][9][9][4][3]...

但我的问题是我将如何打印以下数字:

[1][1]
[2][2][2][2][2][2][2][2]
[3][3][3]
...
[N][N][N][N][N]

【问题讨论】:

  • 这是终端仿真器特有的,不是真正的 Go 编程问题。
  • 如果你想附加到之前写的行,你需要清除和重写。
  • 关于随机顺序,rand.Seed(...) 旨在被调用一次,具有非恒定值。通常,当前时间在大多数环境中随着时间的推移而合适,但操场总是在同一时间开始(因此它总是可预测的)。将 rand.Seed(..) 移动到 main() 的顶部。

标签: algorithm go goroutine


【解决方案1】:

您可能想查看this stackoverflow answer,它使用goterm 移动终端光标并允许您覆盖它的一部分。

这个想法是,一旦你到达终端位,你想要“动态”(很像电子游戏屏幕清除+重绘),你总是重新定位光标并“绘制”你的“马”位置。

请注意,您需要将它们的位置存储在某个地方,然后在每个“帧”处“绘制”它们的位置。

通过本练习,您将接近视频游戏的工作原理,为此您可能需要设置一个具有给定刷新率的 goroutine 以清除终端并呈现您想要的内容。

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多