引言:
? ? ? ? ? 前面貝蒂已經給大家介紹了選擇,循環結構~,今天貝蒂就基于這兩種結構,為大家講解一種搗蛋小游戲的設計思路和方法哦。
1.游戲要求
游戲要求:
1. 電腦?動?成1~100的隨機數
2. 玩家猜數字,猜數字的過程中,根據猜測數據的??給出?了或?了的反饋。3. 玩家一共有五次機會,在五次內,猜對就游戲通關,猜錯就游戲失敗。
4. 游戲失敗執行懲罰措施(60s后電腦關機),若輸入我是豬,則取消關機。
2.隨機數的生成
? ? 2.1rand()函數?
1.頭文件<stdlib.h>
2.C 庫函數rand(void)?返回一個范圍在 0 到?RAND_MAX?之間的“隨機數”。RAND_MAX 是一個常量,它的默認值在不同的實現中會有所不同,但是值至少是 32767。
3.int rand (void);,void表示()內不需要填值,返回值是int類型,也就是生成那個“隨機數”
? ? 代碼實現如下:?
#include <stdio.h>
#include <stdlib.h>
int main()
{int a = rand();printf("%d\n",a);return 0;
}
? ? ? 貝蒂說:“但是rand()函數生成的“隨機數”是一種偽隨機數,是根據一個數值按照某個公式推算出來的,并不是真正的隨機數,那該怎么辦呢~”?
2.2srand()函數?
? ? ?srand()函數能間接控制rand()函數生成的值,?我們知道了rand()并不是真正的隨機數,它是根據某種算法生成的,我們自然而然想到,我們能不能通過控制srand(),來間接控制rand()呢,讓我們來實驗一下吧。
1.頭文件<stdlib.h>
2.C 庫函數srand()?播種由函數?rand?使用的隨機數發生器。
3.?void srand(unsigned int seed),不返回值。
? ? ?貝蒂說:“但是srand()如果參數部分仍是一個確定的值,rand()生成的數仍是偽隨機數,嘿嘿,瘋狂套娃~”
? ? 2.3time()函數
? ? ? ? ?我們要使srand()參數部分是一個不斷地改變量,才能生成真正的隨機數,而我們生活中常見的變量--時間,就自然而然可以成為其參數。
1.頭文件<time.h>
2.C 庫函數?time(time_t *seconds)?返回自紀元 Epoch(1970-01-01 00:00:00 UTC)起經過的時間,以秒為單位。如果?seconds?不為空,則返回值也存儲在變量?seconds?中。
3.time_t time(time_t *seconds),time_t就是無符號整數。
? ? ? 語言來描述time()函數有點復雜,但大家不用擔心,我們只要會用就行啦,生成隨機數的代碼如下:
srand((unsigned int)time(NULL));
int ret=rand()%10+1;//生成1~10的隨機數
3.主體思路
1.首先設置游戲簡易菜單,當游戲開始時,自動顯示。
2.讓玩家選擇,1為開始游戲,0為退出游戲。
3.選擇其他數字,提醒玩家輸入錯誤,重新讓玩家選擇。?
? ? 代碼實現如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{int input = 0;//輸入srand((unsigned int)time(NULL));//提前設置時間種子do{menu();printf("請選擇:>");scanf("%d", &input);//1 0 switch (input){case 1:game();break;case 0:printf("退出游戲\n");break;default:printf("選擇錯誤,重新選擇\n");break;}} while (input);//選擇0退出游戲return 0;
}
4.菜單的實現
? ? 貝蒂所學有限,只能設計出這樣一個簡單菜單哦~
void menu()
{printf("*******************************\n");printf("****** 1. play *********\n");printf("****** 0. exit *********\n");printf("*******************************\n");
}
5.游戲的實現?
? ? ?首先我們先生成1~100的隨機數,然后設置回答次數,每次回答錯誤次數-1,次數用完告訴玩家隨機數的值,并執行懲罰措施。
? ? ?代碼實現如下:
void game()
{int guess = 0;//生成隨機數int ret = rand() % 100 + 1;int count = 5;//回答次數printf("五次失敗觸發彩蛋哦~\n");while (count){printf("你還有 %d 次機會\n", count);printf("請輸入要猜的數字:>");scanf("%d", &guess);if (guess < ret){printf("猜小了\n");}else if (guess > ret){printf("猜大了\n");}else{printf("恭喜你,猜對了,數字是:%d\n", ret);break;}count--;}if (count == 0){printf("很遺憾,三次次機會使用完,挑戰失敗,隨機數是:%d\n", ret);punish();//執行懲罰措施}
}
? 6.懲罰措施?
? ? 6.1system()函數
1.頭文件<stdlib.h>
2. C 庫函數?int system(const char *command)?把?command?指定的命令名稱或程序名稱傳給要被命令處理器執行的主機環境,并在命令完成后返回。(簡單來說就是執行系統指令)
? ? 6.2關機指令
system("shutdown -s -t 60");//60s后關機
//不要忘記之間的空格哦
? ? ? 貝蒂說:“如果大家想直接讓電腦關機,可以把60改成0哦~,但是千萬不要告訴其他人是貝蒂告訴你的哦~”
? ? ?6.3取消關機指令
? ? ? 有關機指令自然也有取消關機指令啦,不然別人只能干看著電腦關機啦~,哈哈
? ? ? 代碼如下:
system("shutdown -a");//取消關機
? ? ? 6.4strcmp()函數
? ? ? 當玩家輸入“我是豬”的時候,則取消關機,用計算機語言表達就是比較玩家輸入的內容是否與“我是豬”這個字符串相同,可能大家第一想法是用==,但是字符串在內存中是以首元素地址存儲的,比較兩個地址肯定不同,所以我們就借用一個庫函數strcmp()來比較~
1. 頭文件<string.h>
2. 聲明:int strcmp(const char *str1, const char *str2),str1?-- 要進行比較的第一個字符串。str2?-- 要進行比較的第二個字符串。
3. 返回值:
?如果返回值小于 0,則表示 str1 小于 str2。
?如果返回值大于 0,則表示 str1 大于 str2。
?如果返回值等于 0,則表示 str1 等于 str2。
? ? ? 代碼實現:
void punish()
{printf("作為懲罰,你的電腦將在60s后關機\n");system("shutdown -s -t 60");//60s后關機printf("如果輸入我是豬則取消懲罰\n");while(1){printf("請輸入\n");char arr[20] = { 0 };gets(arr);if (strcmp(arr, "我是豬") == 0){system("shutdown -a");//取消關機break;}}
}
7完整代碼:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
void menu()
{printf("*******************************\n");printf("****** 1. play *********\n");printf("****** 0. exit *********\n");printf("*******************************\n");
}
void punish()
{printf("作為懲罰,你的電腦將在60s后關機\n");system("shutdown -s -t 60");//60s后關機printf("如果輸入我是豬則取消懲罰\n");while(1){printf("請輸入\n");char arr[20] = { 0 };gets(arr);if (strcmp(arr, "我是豬") == 0){system("shutdown -a");//取消關機break;}}
}
void game()
{int guess = 0;//生成隨機數int ret = rand() % 100 + 1;int count = 5;//回答次數printf("五次失敗觸發彩蛋哦~\n");while (count){printf("你還有 %d 次機會\n", count);printf("請輸入要猜的數字:>");scanf("%d", &guess);if (guess < ret){printf("猜小了\n");}else if (guess > ret){printf("猜大了\n");}else{printf("恭喜你,猜對了,數字是:%d\n", ret);break;}count--;}if (count == 0){printf("很遺憾,三次次機會使用完,挑戰失敗,隨機數是:%d\n", ret);punish();//執行懲罰措施}
}
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{int input = 0;//輸入srand((unsigned int)time(NULL));//提前設置時間種子do{menu();printf("請選擇:>");scanf("%d", &input);//1 0 switch (input){case 1:game();break;case 0:printf("退出游戲\n");break;default:printf("選擇錯誤,重新選擇\n");break;}} while (input);//選擇0退出游戲return 0;
}
?結言:
? ? ? ? ? ?快來叫你的好兄弟,好姐妹來玩玩吧~,嘻嘻~