go - 如何同时打印和扫描

标签 go channels

我正在编写一个简单的贪吃蛇游戏。

这将是非常基础的,但我现在卡住了。我使用“wsad”来引导蛇,但在原始游戏中,即使我们没有改变它的方向,蛇也会移动。我的代码等待我输入一个字母,然后蛇就会移动。所以这是我测试如何计算出来的示例,但我无法得到结果。

package main

import (
    "fmt"
    "github.com/eiannone/keyboard"
    "time"
)

func takeLetter(s chan bool) {
    char, _, err := keyboard.GetSingleKey()

    if err != nil {
        panic(err)
    }

    fmt.Printf("%c", char)
    s <- true
}

func Print(c chan bool) {

    fmt.Println("snake is moving")
    time.Sleep(1 * time.Second)
    c <- true

}

func main() {
    c := make(chan bool)
    s := make(chan bool)
    for {

        go takeLetter(s)
        go Print(c)
        <-s
        <-c
    }

}

即使我们没有按下任何键,我如何管理这段代码来打印“snake is moving”?

最佳答案

您的代码明确地同步了它们:

for {

    go takeLetter(s)
    go Print(c)
    <-s
    <-c
}

该循环的每次迭代,每个函数都将执行一次,并且它将等待再次执行循环,直到两者都完成(这就是您对 channel 所做的)。您可能想要的是对每个函数运行一次,并让每个循环独立运行:

func takeLetter() {
    for {
        char, _, err := keyboard.GetSingleKey()

        if err != nil {
            panic(err)
        }

        fmt.Printf("%c", char)
    }
}

func Print() {
    for {
        fmt.Println("snake is moving")
        time.Sleep(1 * time.Second)
    }

}

func main() {
        go takeLetter()
        go Print()
        select {} // keep main from exiting immediately
}

关于go - 如何同时打印和扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53124488/

相关文章:

reflection - 错误的反射结构类型

go - 如何使用多种格式在循环中解析日期?

recursion - 从路径字符串中获取树状结构

python - 如何用pydub指定输出 channel (左,右)?

使用 channel 超时

Git2go : How to handle simple merge conflicts

windows - Filepath.Walk in Go 不拾取 C : drive properly in Windows 下的文件夹

go - 如何关闭多个 goroutine 正在发送的 channel ?

go - 使用 channel 时出现问题 : all goroutines are asleep - deadlock