如何同时打印和扫描
How to print and scan at the same time
我正在编写一个简单的贪吃蛇游戏。
这将是非常基础的,但我现在卡住了。我使用 "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
}
该循环的每次迭代,每个函数都将执行一次,并且它将等待再次执行循环,直到两者都完成(这就是您对频道所做的)。您可能想要的是 运行 每个函数一次,并让每个循环独立:
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
}
我正在编写一个简单的贪吃蛇游戏。
这将是非常基础的,但我现在卡住了。我使用 "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
}
该循环的每次迭代,每个函数都将执行一次,并且它将等待再次执行循环,直到两者都完成(这就是您对频道所做的)。您可能想要的是 运行 每个函数一次,并让每个循环独立:
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
}