目的:
學(xué)習(xí)用c語言寫一個(gè)猜數(shù)字游戲的demo,練習(xí)使用c語言里的for,while循環(huán),數(shù)組,排序方法等,加強(qiáng)對(duì)c語言的邏輯結(jié)構(gòu)的理解。
游戲過程:
首先系統(tǒng)自動(dòng)產(chǎn)生4個(gè)0-9的不重復(fù)隨機(jī)數(shù)從小到大排好序,但是不顯示給用戶知道;
接著用戶從終端輸入猜測(cè)的4個(gè)數(shù)字,將產(chǎn)生的那組數(shù)字中每個(gè)數(shù)字都與用戶猜測(cè)的一組數(shù)字中的每個(gè)進(jìn)行比較;
若兩個(gè)數(shù)字相同且在數(shù)組中位置也相同,則輸出提示用戶一個(gè)A,若位置不同,則提示B,直到用戶猜測(cè)正確,輸出4A(兩組數(shù)字分別對(duì)應(yīng)相同),游戲結(jié)束。
程序運(yùn)行結(jié)果:
猜數(shù)字游戲.gif

程序分析:
1.首先需要產(chǎn)生四個(gè)不重復(fù)的隨機(jī)數(shù).
需要定義一個(gè)數(shù)組保存產(chǎn)生的4個(gè)隨機(jī)數(shù):
int orgArray[4] = {};
產(chǎn)生隨機(jī)數(shù)之前需要導(dǎo)入相應(yīng)的頭文件:
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
然后需要種一個(gè)產(chǎn)生隨機(jī)數(shù)的種子:
srand((unsigned int)time(NULL));
使用for循環(huán)產(chǎn)生4個(gè)隨機(jī)數(shù),定義一個(gè)bool類型的變量isExist判斷是否重復(fù),代碼實(shí)現(xiàn)如下:
for (int i = 0; i < 4; i ++) {
//生成一個(gè)隨機(jī)數(shù)
int temp = rand() % 10;
//判斷是否重復(fù)
bool isExist = false;
for (int j = 0; j < i; j++) {
if (orgArray[j] == temp) {
//重復(fù)了
isExist = true;
break;
}
}
//判斷是否重復(fù)
if (isExist == false) {
//不重復(fù) 保存這個(gè)數(shù)
orgArray[i] = temp;
}else{
//重復(fù)了
i--;
}
}
2.運(yùn)用冒泡排序法對(duì)產(chǎn)生的隨機(jī)數(shù)從小到大排序:
//用冒泡排序法進(jìn)行排序
for (int i = 0; i < 4; i ++) {
for (int j = 0; j < 3-i; j++) {
if (orgArray[j] > orgArray[j+1]) {
int temp = orgArray[j];
orgArray[j] = orgArray[j+1];
orgArray[j+1] = temp;
}
}
}
3.接下來開始游戲
定義一個(gè)數(shù)組保存猜測(cè)的數(shù)字,定義兩個(gè)變量countA和countB分別保存A和B的個(gè)數(shù):
int guessArray[4] = {};
int countA = 0;
int countB = 0;
因?yàn)椴聰?shù)字過程要進(jìn)行多次,使用一個(gè)while循環(huán)。使用兩個(gè)for循環(huán)將原數(shù)字與猜測(cè)的數(shù)字進(jìn)行比較,每次猜測(cè)后,countA和countB要還原,下一次循環(huán)重新計(jì)數(shù)。代碼實(shí)現(xiàn)如下:
//開始游戲
int guessTime = 0;
while (1) {
printf("請(qǐng)輸入猜測(cè)數(shù)字:");
for (int i = 0; i < 4; i++) {
scanf("%d", &guessArray[i]);
}
//將原數(shù)字與猜測(cè)數(shù)字進(jìn)行比較
for (int i = 0; i < 4; i++) {//控制原數(shù)字
for (int j = 0; j < 4; j++) {//控制猜測(cè)的數(shù)字
//判斷兩數(shù)字是否相同
if (orgArray[i] == guessArray[j]) {
//判斷兩數(shù)字位置是否相同
if (i == j) {
//數(shù)字相同 位置相同
countA++;
} else{
//數(shù)字相同 位置不同
countB++;
}
}
}
}
guessTime ++;
//判斷是不是猜對(duì)了
if (countA == 4) {
printf("Congratulation!! 猜測(cè)的次數(shù)為:%d次!", guessTime);
break;
} else{
printf("%dA%dB\n", countA, countB);
//還原數(shù)據(jù)
countA = 0;
countB = 0;
}
}
總結(jié)
要完成這個(gè)Demo,需要對(duì)c語言的各種循環(huán)結(jié)構(gòu),數(shù)組等熟練使用,對(duì)循環(huán)中變量的控制熟練掌握。剛開始寫可能沒有那么順暢,但只要通過多次練習(xí),就會(huì)理解的更深刻,對(duì)這些運(yùn)用的更熟練。