網站首頁 編程語言 正文
1 猜數字游戲-問題描述
這個游戲一點都不陌生,猜價格是一度很火的綜藝節目。很多老師也用這個案例作為課堂案例。在這里,我想把重點放到“思維層面上”,即:為什么要這樣寫代碼,就實現了猜數字游戲的功能。
我們先來說真人版的猜數字游戲:
A:心里默默出一個數字(約定一個范圍,假設[1-100]之間),開始猜把
B猜:50
A: 大了
B猜:25
A:小了
B猜:150
A:你違規了
B猜:30
A:猜對了!正確答案就是30!是否繼續猜?
B:需要
…
2 問題分析
從前面的真人版,換成人機版:
現實世界 | 程序模擬 | 實現途徑 |
---|---|---|
A | 電腦 | ? |
心里默默出一個數字 | 一個變量的值 | 隨機數/手動在程序里悄悄定義的變量值/其他(總之就是你解決:產生一個數的方法) |
B猜 | B敲鍵盤 | scanf掃描鍵盤 |
A說大了、小了、對了 | 計算機判斷并輸出判斷結果 | if判斷 |
A和B之間的繼續猜 | 重復事件 | 循環 |
所謂“天下大事必做于易,天下難事必做于細”,
有了一個對現實問題的一個分析,你還可以把一個問題進行逐層簡化,然后再逐層豐富其功能:
1)猜一次
2)直到猜到為止
3)限定猜的次數,并顯示當前是第幾次猜
4)處理特殊情況:如果你提前猜到了;如果你猜的數超出了范圍
5)猜更多的數
6)對游戲計時、一分鐘猜對得越多還可以設關卡
…
這樣,就會對一個較為綜合的問題,有了一個自己的方案,接下來就可以開始嘗試逐個擊破了。
3 問題解決
3.1 猜一次
用IPO的思維,繼續分析這種情況,其故事流程是不是這樣的:
// I:輸入
1)計算機:出一個數
2)用戶: 鍵盤輸一個數(猜)
3)計算機:獲得這個數
//處理并輸出
4)計算機:判斷這個數和自己出的數的大小關系
5)計算機:根據不同的關系,告訴你猜大了、小了、對了
6)計算機:告訴你正確答案
根據輸入與輸出,確定要定義的變量:計算機出的數、用于猜的數
程序員要做的:就是把上面的故事流程,用一種編程語言描述出來。
而故事的流程就是:算法;
編程語言描述出來的就是:程序
那么,我們就可以得到以下程序了:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int guess,magic; //magic計算機想的數
srand(time(NULL)); //用時間做種子,產生一個隨機數
magic = rand()%100+1; //隨機數落到1-100之間
printf("guess a number:\n"); //用戶猜一個數
scanf("%d",&guess);
if(guess>magic) //計算機判斷,并告訴你猜的情況
printf("too big!\n");
else if(guess<magic)
printf("too small!\n");
else
printf("right!\n");
printf("the right number is %d\n",magic);
return 0;
}
3.2 直到猜到為止
接著上面的故事。
還要繼續猜:
1)計算機出的數是否應該變化? ——顯然,不能變,變了就作弊了
2)用戶還要繼續猜 —— 那么就還要再敲鍵盤、計算機還要繼續獲得這個數(3.1節代碼:Line9-10)
3)計算機還要繼續判斷——還要判斷大小關系(3.1節代碼:Line11-16)
因此,3.1節代碼Line9-16就應該反復做,循環體就確定了;
直到猜到為止: 循環條件則是magic!=guess
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int guess,magic;
srand(time(NULL));
magic = rand()%100+1;
do{ ///用戶和計算機判斷是循環體
printf("guess a number:\n");
scanf("%d",&guess);
if(guess>magic)
printf("too big!\n");
else if(guess<magic)
printf("too small!\n");
else
printf("right!\n");
}while(guess!=magic); //循環條件
printf("the right number is %d\n",magic);
return 0;
}
}
3.3 限定猜10次
循環結束條件就變為:猜了10次結束
那么就需要一個計數器,每猜一次,計數器+1, 到10次,循環結束;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int guess,magic;
int count=0; //計數器,一次都還沒有猜,初始為0
srand(time(NULL));
magic = rand()%100+1;
do{
count++; //猜1次,計數器加1
printf("the %dth: guess a number:\n",count); //顯示第幾次猜
scanf("%d",&guess);
if(guess>magic)
printf("too big!\n");
else if(guess<magic)
printf("too small!\n");
else
printf("right!\n");
}while(count<=10); //判斷猜到10次了沒有
printf("the right number is %d\n",magic);
return 0;
}
3.4 處理特殊情況
情況1:如果用于猜的范圍超出[1,100],給出提示
顯然,從鍵盤獲得用戶猜的數(3.3節代碼Line13)后,就應判斷:
—— a)是否超過了[1,100]的范圍,是,本次不判斷猜的情況,用戶重新猜下一次;
——b)否,則判斷用戶猜的情況。
情況2:如果不到10次就猜到了,提前結束循環;
這就是代碼輸出“right!”的情況(3.3節代碼Line19),同時加上結束循環的語句break就ok。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int guess,magic;
int count=0;
srand(time(NULL));
magic = rand()%100+1;
do{
count++;
printf("the %dth: guess a number:\n",count);
scanf("%d",&guess);
if(guess>100 ||guess<1) //處理情況1
{
printf("You guess the number should be in the range [1,100]:\n");
continue; //跳過本次循環
}
if(guess>magic)
printf("too big!\n");
else if(guess<magic)
printf("too small!\n");
else
{
printf("right!\n");
break; //處理情況2
}
}while(count<=10);
printf("the right number is %d\n",magic);
return 0;
}
3.5 猜下一個數
分析:
1) 上一個數的猜,已經結束;—— 3.4節代碼中的Line29
2) 詢問用戶,是否繼續進行游戲; ——輸出一條詢問語句
3) 輸入用戶的意愿; —— scanf輸入
4) 如果是,則繼續做游戲;否則游戲結束 ——新的循環是否繼續的條件
5) 重新給10次猜的機會 ——計數器清0
6) 計算機再重新想一個數; ——3.4節代碼中的Line 8-9
7) 繼續猜; ——3.4節代碼中的Line 10-29
于是3.4節代碼的Line8-29是需要繼續作為新的循環的循環體。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int guess,magic;
int count;
int reply=0; //用戶是否繼續游戲
do{
count=0; //每猜一個新的數,計數器清0
srand(time(NULL)); //重新產生一個新的數來猜
magic = rand()%100+1;
do{
count++; //猜1次,計數器加1
printf("the %dth: guess a number:\n",count);
scanf("%d",&guess);
if(guess>100 ||guess<1)
{
printf("You guess the number should be in the range [1,100]:\n");
continue;
}
if(guess>magic)
printf("too big!\n");
else if(guess<magic)
printf("too small!\n");
else
{
printf("right!\n");
break;
}
}while(count<=10);
printf("the right number is %d\n",magic);
printf("Is the game continue? 1(yes) or 0(no):\n"); //詢問是否繼續游戲
scanf("%d",&reply); //獲得用戶的意愿
}while(reply==1); //如果意愿是1,則繼續游戲;否則,整個程序結束
return 0;
}
小結:
程序其實就是用計算機的語言,描述你要解決的問題。
所以,對初學者來說,學好程序有如下點:
1)學會把現實問題和計算機世界做一個抽象,如上面的表格
2)把一個大的問題逐層簡化
3)從小問題入手,層進式解決問題
當然,分析問題是整個過程的重點,切勿拿著個問題,就想著代碼怎么寫,算法才是程序的靈魂。
同學們還可以在上面代碼的基礎上,讓這個游戲的功能更加豐富,繼續加油吧!
原文鏈接:https://blog.csdn.net/ypandam/article/details/124167464
相關推薦
- 2022-03-15 巧用Redis實現分布式鎖詳細介紹_Redis
- 2022-07-16 new FileOutputStream(“data\\test2.txt“,true),true是
- 2022-05-21 DaemonSet服務守護進程的使用場景_服務器其它
- 2023-02-02 C語言求素數的幾種方式總結_C 語言
- 2022-04-28 WPF使用Grid網格面板布局_實用技巧
- 2022-09-26 Qt如何實現輸入框@聯系人的@檢測的示例_C 語言
- 2023-05-31 Pandas多個條件(AND,OR,NOT)中提取行_python
- 2022-04-11 獲取base64編碼格式的圖片大小
- 最近更新
-
- 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同步修改后的遠程分支