@(go语言 黑马)[GO语言]
猜数字游戏
- 题目:程序运行后,系统会自动生成一个四位数的随机数,然后提示用户同样输入一位四位数,系统分别对比这两个数字的个十百千位,并且提示是大了还是小了,然后让用户再猜,直到用户完全才对为止。
- 逻辑:首先,生成一个随机4位数作为答案;其次,记录答案的每一位数;然后,手动输入一个随机数,并记录这个数的每一位;最后,把手动输入的数的每一位与之前生成的数相比较,并给出相应的提示。
- 代码如下:
package main
import (
"fmt"
"math/rand"
"time"
)
//生成一个随机4位数作为答案
//记录这个4位数的每一位
//手动输入一个4位数,并记录每一位
//把手动输入的数的每一位与之前生成的数相比较
func answer(answers []int, ans *int) { //这是一个生成答案的函数
rand.Seed(time.Now().UnixNano()) //随机数种子
var p int
for {
p = rand.Intn(10000) //利用无限for循环来保证生成的随机数是一个四位数
if p > 999 { //直到这个数大于999才跳出循环
break
}
}
/*
p=rand.Intn(9000)+1000 这是实现一个4位数的另一个方法,比使用for循环要简单,同样优化了代码
rand.Intn(9000)代表的是0-8999的随机数,加1000后则变成1000-9999,若使用这种方法不需要中间变量p
*/
*ans = p //ans是一个int类型的内存地址,*ans是取出ans中的值的意思
//这四个数字储存在切片里头,切片是引用传递,所以不需要加指针
answers[0] = *ans / 1000 //千位
answers[1] = *ans % 1000 / 100 //百位
answers[2] = *ans % 100 / 10 //十位
answers[3] = *ans % 10 //个位
}
func respond(responds []int) { //这个函数作用是:提示用户输入数字,并记录每一位
var res int
fmt.Println("请输入一个四位数:")
fmt.Scan(&res)
if res < 1000 || res > 9999 { //若用户输入的不是一个四位数,提示错误并重新输入
fmt.Println("输入错误!请正确输入一个四位数:")
fmt.Scan(&res)
} else {
//这里逻辑和记录答案时一样
responds[0] = res / 1000
responds[1] = res % 1000 / 100
responds[2] = res % 100 / 10
responds[3] = res % 10
}
}
func main() {//主函数实现对比
var ans int
answers := make([]int, 4)
answer(answers, &ans)//&是取地址的意思
//调用生成参数的函数,实现生成一个四位数的功能;
// 因为都是引用传递,所以函数中对变量做的改变可以传递到主函数的变量中
responds := make([]int, 4)
for {//无限循环,让用户可以猜多次,知道四位数都猜对,再利用if语句跳出循环
respond(responds)
n := 0
for i := 0; i < 4; i++ {//利用for循环遍历切片中的四位数
if responds[i] > answers[i] {//一共三种情况:大了、小了、相等
fmt.Printf("第%d位大了\n", i+1)
} else if responds[i] < answers[i] {
fmt.Printf("第%d位小了\n", i+1)
} else {
fmt.Printf("第%d位输入正确!\n", i+1)
n++//n用来记录正确个数,若不为4,则无限循环中再从"respond(responds)"开始,n归零
}
}
if n == 4 {
fmt.Println("全部输入正确!!")
fmt.Scan(&ans)
break
}
}
}