Как печатать и сканировать одновременно - PullRequest
0 голосов
/ 02 ноября 2018

Я пишу простую игру SNAKE.

Это будет очень просто, но я застрял сейчас. Я использую «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
    }

}

Как мне управлять этим кодом, чтобы напечатать «змея движется», даже если мы не нажали ни одной клавиши?

1 Ответ

0 голосов
/ 02 ноября 2018

Ваш код явно синхронизирует их:

for {

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

Каждая итерация этого цикла, каждая функция будет выполняться один раз, и она будет ожидать повторного выполнения цикла, пока оба не завершат работу (это то, что вы делаете с вашими каналами). Вместо этого вы, вероятно, захотите запустить каждую функцию один раз и иметь каждый цикл независимо:

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
}
...