@(go語言 黑馬)[GO語言]
猜數(shù)字游戲
- 題目:程序運(yùn)行后,系統(tǒng)會(huì)自動(dòng)生成一個(gè)四位數(shù)的隨機(jī)數(shù)卤恳,然后提示用戶同樣輸入一位四位數(shù)秸歧,系統(tǒng)分別對(duì)比這兩個(gè)數(shù)字的個(gè)十百千位灾锯,并且提示是大了還是小了,然后讓用戶再猜贞铣,直到用戶完全才對(duì)為止闹啦。
- 邏輯:首先,生成一個(gè)隨機(jī)4位數(shù)作為答案辕坝;其次,記錄答案的每一位數(shù)荐健;然后酱畅,手動(dòng)輸入一個(gè)隨機(jī)數(shù),并記錄這個(gè)數(shù)的每一位江场;最后纺酸,把手動(dòng)輸入的數(shù)的每一位與之前生成的數(shù)相比較,并給出相應(yīng)的提示址否。
- 代碼如下:
package main
import (
"fmt"
"math/rand"
"time"
)
//生成一個(gè)隨機(jī)4位數(shù)作為答案
//記錄這個(gè)4位數(shù)的每一位
//手動(dòng)輸入一個(gè)4位數(shù)餐蔬,并記錄每一位
//把手動(dòng)輸入的數(shù)的每一位與之前生成的數(shù)相比較
func answer(answers []int, ans *int) { //這是一個(gè)生成答案的函數(shù)
rand.Seed(time.Now().UnixNano()) //隨機(jī)數(shù)種子
var p int
for {
p = rand.Intn(10000) //利用無限for循環(huán)來保證生成的隨機(jī)數(shù)是一個(gè)四位數(shù)
if p > 999 { //直到這個(gè)數(shù)大于999才跳出循環(huán)
break
}
}
/*
p=rand.Intn(9000)+1000 這是實(shí)現(xiàn)一個(gè)4位數(shù)的另一個(gè)方法,比使用for循環(huán)要簡單佑附,同樣優(yōu)化了代碼
rand.Intn(9000)代表的是0-8999的隨機(jī)數(shù)樊诺,加1000后則變成1000-9999,若使用這種方法不需要中間變量p
*/
*ans = p //ans是一個(gè)int類型的內(nèi)存地址音同,*ans是取出ans中的值的意思
//這四個(gè)數(shù)字儲(chǔ)存在切片里頭词爬,切片是引用傳遞,所以不需要加指針
answers[0] = *ans / 1000 //千位
answers[1] = *ans % 1000 / 100 //百位
answers[2] = *ans % 100 / 10 //十位
answers[3] = *ans % 10 //個(gè)位
}
func respond(responds []int) { //這個(gè)函數(shù)作用是:提示用戶輸入數(shù)字权均,并記錄每一位
var res int
fmt.Println("請(qǐng)輸入一個(gè)四位數(shù):")
fmt.Scan(&res)
if res < 1000 || res > 9999 { //若用戶輸入的不是一個(gè)四位數(shù)顿膨,提示錯(cuò)誤并重新輸入
fmt.Println("輸入錯(cuò)誤!請(qǐng)正確輸入一個(gè)四位數(shù):")
fmt.Scan(&res)
} else {
//這里邏輯和記錄答案時(shí)一樣
responds[0] = res / 1000
responds[1] = res % 1000 / 100
responds[2] = res % 100 / 10
responds[3] = res % 10
}
}
func main() {//主函數(shù)實(shí)現(xiàn)對(duì)比
var ans int
answers := make([]int, 4)
answer(answers, &ans)//&是取地址的意思
//調(diào)用生成參數(shù)的函數(shù),實(shí)現(xiàn)生成一個(gè)四位數(shù)的功能叽赊;
// 因?yàn)槎际且脗鬟f恋沃,所以函數(shù)中對(duì)變量做的改變可以傳遞到主函數(shù)的變量中
responds := make([]int, 4)
for {//無限循環(huán),讓用戶可以猜多次必指,知道四位數(shù)都猜對(duì)囊咏,再利用if語句跳出循環(huán)
respond(responds)
n := 0
for i := 0; i < 4; i++ {//利用for循環(huán)遍歷切片中的四位數(shù)
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用來記錄正確個(gè)數(shù),若不為4谱邪,則無限循環(huán)中再從"respond(responds)"開始,n歸零
}
}
if n == 4 {
fmt.Println("全部輸入正確E谂酢!")
fmt.Scan(&ans)
break
}
}
}