通過編寫一個簡單的遊戲學習 C 語言
我在小學時就開始 自學編程。我的第一個程序是在 Apple II 上編寫的,但最終,我還是通過看書和編程練習學會了 C 語言。練習編程的最佳方法是編寫示常式序,它能幫助你練習新知識。
在我學習一種新的編程語言時,我喜歡編寫一個簡單的「猜數字」遊戲來練習。電腦從 1 到 100 中隨機挑選一個數字,你必須通過猜測來算出來。在另一篇文章中,我展示了如何用 Bash 語言編寫這個「猜數字」遊戲,我的同事也寫了一些文章,介紹如何用 Java、Julia 和其他計算機語言編寫它。
「猜數字」遊戲的偉大之處在於它踐行了幾個編程概念:如何使用變數、如何比較值、如何列印輸出以及如何讀取輸入。
整個夏天,我錄製了一個系列視頻,教人們如何用 C 語言編寫程序。從那以後,我聽到了很多人都在跟著它學習 C 語言編程的消息。所以,我想接著用 C 語言寫一個「猜數字」的遊戲。
去取一個隨機數
從寫一個函數來選擇一個隨機數字來開始「猜數字」遊戲。在編寫函數時,優秀的程序員會盡量使它們具有靈活性,這樣他們就可以重用它們來解決略有不同的問題。因此,與其硬編碼函數來選擇 1 到 100 之間的一個隨機數,不如編寫函數來選擇 1 到某個整數 maxval
之間的一個隨機數:
#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);
}
}
該函數使用 Linux 的系統調用 getrandom
來生成一系列隨機數。你可以在手冊頁中了解關於這個系統調用的更多信息,但請注意,getrandom
將用隨機的 0 和 1 填充變數。這意味著最終值可以是正的,也可以是負的,因此你需要在之後進行測試,以確保 randnum
函數的結果是正值。
編寫程序
你可以用這個函數來寫你的「猜數字」程序:
#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
函數從 1 到 100 之間選擇一個隨機數。在向用戶輸出一個提示後,程序進入一個 do-while
循環,以便用戶可以猜測數字。
在循環的每次迭代中,程序測試用戶的猜測的數值。如果用戶的猜測小於隨機數,程序將輸出「Too low」,如果猜測大於隨機數,程序將輸出「Too high」。循環繼續,直到用戶的猜測與隨機數相同。
當循環退出時,程序輸出 「That's right!」,然後立即結束:
$ 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!
嘗試動手
在學習一門新的編程語言時,這個「猜數字」遊戲是一個很好的入門程序,因為它以一種非常直接的方式練習了幾個常見的編程概念。通過用不同的編程語言實現這個簡單的遊戲,你可以演示一些核心概念,並比較每種語言的細節。
你有最喜歡的編程語言嗎?你會如何用它來編寫「猜數字」遊戲呢?關注本系列文章,查看你可能感興趣的其他編程語言的示例。
via: https://opensource.com/article/21/1/learn-c
作者:Jim Hall 選題:lujun9972 譯者:qfzy1233 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive