今天我们来把青训营的两个最简单的项目给完成,在这里我会给出我的思路和细节,希望能对以后我复习有用,如果对大家学习有帮助的话那更好不过了。
猜数字游戏
我们使用go语言来实现一个猜数游戏。
项目要求
在这个游戏里面。程序会首先生成一个1~100的随机整数,让玩家进行猜测。每进行一次猜测,程序会告诉玩家这个猜测的数比答案大了还是小了,并且让玩家再次猜测。如果猜对了,就告诉玩家胜利并且退出程序。
设计思路
首先,核心部分就是生成这个随机数。而在go语言里面我们需要同时调用math/rand包,并且调用rand.Seed()函数才能实现生成随机数。但是如果我们在rand.Seed()内填入一个不变的值,就会像老师的效果,随机数是一个定值。
这个时候我们就要设置时间戳,调time包的time.Now().UnixNano()函数,这样就可以使每次输出的随机数都不一样啦。
然后再调用rand.Intn()来表示范围,[0,maxNum]
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
}
实现了生成随机数,接下来的就很简单了。我在这里使用fmt.Scanln()来简化代码。
首先得初始化玩家猜测的值guess,然后就调用fmt.Scanln()来输入值,这个函数会返回两个值一直是count代表一共输入了多少个数,我在这里用_下划线省略了。还有一个是err错误信息。使用Scanln是因为它比较方便,最后输入回车就可以完成输入了。最后再就是用if循环来完成整个代码结构。然后就完成了~
下面是我的代码:
package main
import (
"fmt"
"math/rand"
"time"
)
var (
//reader int
guess int
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
//fmt.Println("The secret number is ", secretNumber)
for {
fmt.Println("Please input your guess")
//reader := bufio.NewReader(os.Stdin)
//input, err := reader.ReadString('\n') //读取一行的输入
/*if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}*/
//input = strings.TrimSuffix(input, "\n") //删除换行符
//input = strings.TrimSuffix(input, "\r\n") //删除回车和换行符
_, err := fmt.Scanln(&guess)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("You guess is", guess)
if guess > secretNumber {
fmt.Println("Your guess is bigger than the secret number. Please try again")
} else if guess < secretNumber {
fmt.Println("Your guess is smaller than the secret number. Please try again")
} else {
fmt.Println("Correct, you Legend!")
break
}
}
}