通過編寫一個簡單的游戲?qū)W習(xí) C 語言
我在小學(xué)時就開始 自學(xué)編程 。我的第一個程序是在 Apple II 上編寫的,但最終,我還是通過看書和編程練習(xí)學(xué)會了 C 語言。練習(xí)編程的最佳方法是編寫示例程序,它能幫助你練習(xí)新知識。
在我學(xué)習(xí)一種新的編程語言時,我喜歡編寫一個簡單的“猜數(shù)字”游戲來練習(xí)。電腦從 1 到 100 中隨機(jī)挑選一個數(shù)字,你必須通過猜測來算出來。在另一篇文章中,我展示了如何用 Bash 語言編寫這個 “猜數(shù)字”游戲 ,我的同事也寫了一些文章,介紹如何用 Java 、 Julia 和其他計算機(jī)語言編寫它。
“猜數(shù)字”游戲的偉大之處在于它踐行了幾個編程概念:如何使用變量、如何比較值、如何打印輸出以及如何讀取輸入。
整個夏天,我錄制了 一個系列視頻 ,教人們?nèi)绾斡?C 語言 編寫程序。從那以后,我聽到了很多人都在跟著它學(xué)習(xí) C 語言編程的消息。所以,我想接著用 C 語言寫一個“猜數(shù)字”的游戲。
去取一個隨機(jī)數(shù)
從寫一個函數(shù)來選擇一個隨機(jī)數(shù)字來開始“猜數(shù)字”游戲。在編寫函數(shù)時,優(yōu)秀的程序員會盡量使它們具有靈活性,這樣他們就可以重用它們來解決略有不同的問題。因此,與其硬編碼函數(shù)來選擇 1 到 100 之間的一個隨機(jī)數(shù),不如編寫函數(shù)來選擇 1 到某個整數(shù) maxval 之間的一個隨機(jī)數(shù):
- #include <stdio.h>
- #include <sys/random.h>
- int
- randnum(int maxval)
- {
- /* pick a random number from 1 to maxval */
- int randval;
- getrandom(&randval, sizeof(int), GRND_NONBLOCK);
- /* could be negative, so ensure it's positive */
- if (randval < 0) {
- return (-1 * randval % maxval + 1);
- }
- else {
- return (randval % maxval + 1);
- }
- }
該函數(shù)使用 Linux 的系統(tǒng)調(diào)用 getrandom 來生成一系列隨機(jī)數(shù)。你可以在手冊頁中了解關(guān)于這個系統(tǒng)調(diào)用的更多信息,但請注意,getrandom 將用隨機(jī)的 0 和 1 填充變量。這意味著最終值可以是正的,也可以是負(fù)的,因此你需要在之后進(jìn)行測試,以確保 randnum 函數(shù)的結(jié)果是正值。
編寫程序
你可以用這個函數(shù)來寫你的“猜數(shù)字”程序:
- #include <stdio.h>
- #include <sys/random.h>
- int
- randnum(int maxval)
- {
- ...
- }
- int
- main(void)
- {
- int number;
- int guess;
- number = randnum(100);
- puts("Guess a number between 1 and 100");
- do {
- scanf("%d", &guess);
- if (guess < number) {
- puts("Too low");
- }
- else if (guess > number) {
- puts("Too high");
- }
- } while (guess != number);
- puts("That's right!");
- return 0;
- }
程序首先使用 randnum 函數(shù)從 1 到 100 之間選擇一個隨機(jī)數(shù)。在向用戶輸出一個提示后,程序進(jìn)入一個 do-while 循環(huán),以便用戶可以猜測數(shù)字。
在循環(huán)的每次迭代中,程序測試用戶的猜測的數(shù)值。如果用戶的猜測小于隨機(jī)數(shù),程序?qū)⑤敵?ldquo;Too low”,如果猜測大于隨機(jī)數(shù),程序?qū)⑤敵?ldquo;Too high”。循環(huán)繼續(xù),直到用戶的猜測與隨機(jī)數(shù)相同。
當(dāng)循環(huán)退出時,程序輸出 “That's right!”,然后立即結(jié)束:
- $ gcc -o guess -Wall guess.c
- $ ./guess
- Guess a number between 1 and 100
- 50
- Too high
- 30
- Too low
- 40
- Too low
- 45
- Too high
- 42
- Too low
- 43
- Too low
- 44
- That's right!
嘗試動手
在學(xué)習(xí)一門新的編程語言時,這個“猜數(shù)字”游戲是一個很好的入門程序,因?yàn)樗砸环N非常直接的方式練習(xí)了幾個常見的編程概念。通過用不同的編程語言實(shí)現(xiàn)這個簡單的游戲,你可以演示一些核心概念,并比較每種語言的細(xì)節(jié)。