網站首頁 編程語言 正文
前言
本文是介紹用Go實現一個猜謎小游戲,就是程序先生成一個隨機數num
,然后讓用戶來猜生成的數是多少,如果猜的數比num
小就提示用戶猜測的數據小于num
,如果猜的數比num
大就提示用戶測試的數據大于num
,如果猜測的數據剛好是num
就提示用戶猜對了。
技術點
在本文中將會使用到以下技術點:隨機數、隨機數種子、獲取當前時間戳、兩種讀取終端輸入方式等。
隨機數
Go
生成隨機數需要引入math/rand
包,Intn(n int)
函數可以生成一個0~n
的非負隨機整數數,包含0
不包含n
也就是[0,n)
。
import ( "fmt" "math/rand" ) func main() { fmt.Println(rand.Intn(100)) }
經過多次運行,我們發現產生的數并不是隨機的,每次都一樣。
隨機數種子
Go
中的隨機數是通過rand.Seed
(種子值seedNum
)設置種子值,在同一個種子下每次產生的隨機數順序是一樣的。
為了保證種子值的隨機性,一般采用系統時間的毫秒值作為種子值,因為系統時間的毫秒值是一直變動的。
time.Now().UnixMilli()
可以系統當前的毫秒時間戳。
time.Now().Unix()
可以系統當前的秒時間戳。
time.Now().UnixMicro()
可以系統當前的微秒時間戳。
time.Now().UnixNano()
可以系統當前的納秒時間戳。
import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) fmt.Println(rand.Intn(100)) }
再次運行代碼,可以發現每次運行的隨機數都是不同的了。
接收用戶輸入
Reader
os.Stdin
指向標準輸入文件/dev/stdin
,os.Stdin
是os
包的一個變量。它是os
包的NewFile
函數的返回值。
bufio
包中都是IO
操作的方法,創建Reader
對象,就可以讀取數據了。
reader := bufio.NewReader(os.Stdin)
設置按行讀取:
input, err := reader.ReadString('\n')
按行讀取得到的結果是包含換行符的,要把換行符給截取去掉:
input = strings.Trim(input, "\r\n")
再把得到的字符串轉換為數字:
guess, err := strconv.Atoi(input)
Scanf
Scanf
函數也可以從os.Stdin
中讀取數據。
var guess int fmt.Scanf("%d", &guess) fmt.Println(guess)
完整代碼
因為用戶不一定一次就猜中數據,我們可以使用for
循環,當用戶猜不中時,可以讓用戶再繼續猜直到猜中。
下面來看下完整的代碼。
使用Reader
func main() { maxNum := 100 rand.Seed(time.Now().UnixNano()) secretNumber := rand.Intn(maxNum) fmt.Println("Please input your guess") reader := bufio.NewReader(os.Stdin) for { input, err := reader.ReadString('\n') if err != nil { fmt.Println("An error occured while reading input. Please try again", err) continue } input = strings.Trim(input, "\r\n") guess, err := strconv.Atoi(input) 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 } } }
使用Scanf
func main() { maxNum := 100 rand.Seed(time.Now().UnixNano()) secretNumber := rand.Intn(maxNum) fmt.Println("Please input your guess") var guess int for { fmt.Scanf("%d", &guess) 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 } } }
來運行一下代碼看下最終效果:
總結
本文介紹了使用Go
語言來實現類一個猜字小游戲,在文中介紹了隨機數、隨機數種子以及如何從終端讀取數據的兩種方法。
對比從終端獲取用戶輸入的兩種方法,我們可以看到使用Scanf
比使用bufio
中的Reader方便了很多,大大簡化了代碼。
剛剛接觸Go難免有些錯誤與不足之處,如有發現歡迎指出。
原文鏈接:https://juejin.cn/post/7191469064588361785
相關推薦
- 2022-03-11 UE4 添加自己項目的AutomationProject,解決報錯Failed to find co
- 2024-01-16 解決 git pull 操作后文件權限變化
- 2022-05-01 C#實現提取Word中插入的多媒體文件(視頻,音頻)_C#教程
- 2023-03-04 React中實現keepalive組件緩存效果的方法詳解_React
- 2022-08-29 Python可視化神器pyecharts繪制水球圖_python
- 2022-08-28 Python異步發送日志到遠程服務器詳情_python
- 2022-05-20 HTML常用標簽超詳細整理_CSS/HTML
- 2023-04-24 python讀取相對路徑和絕對路徑的方法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支