今天來開發一個簡單的數字邏輯游戲,猜數字(數字炸彈)

首先開發游戲第一件事,了解需求。
猜數字游戲規則:
計算機隨機生成一個指定范圍的數字,由玩家來猜測,
之后計算機會根據玩家提供數字來與自己生成的數字進行對比,並返回結果太大或者太小
例:計算機隨機生成1-100的數字53,玩家猜測為50,計算機對比結果后返回結果:太小了
多次重復直到玩家猜中數字,游戲結束統計分數。

需求分析:
1.計算機隨機生成數字;
2.與輸入結果進行比較,返回太大太小結果;
3.判定是否回答正確,結束游戲;
3.記錄分數並且輸出;
開發環境:
python版本:IDLE 3.7
開 發 軟 件:sublime_text
技術支持:
隨機數在計算機應用中十分常見,在Python中,通過內置random庫來實現產生各種分布的偽隨機數序列。
random數據庫通過采用梅森旋轉算法,可用於除隨機性要求更高的加密算法外的大多數工程應用。
簡單理解,random庫的作用就是生成隨機數。主要使用函數如下:
1. random.random()
random.random()方法返回一個隨機數,其在[0.0,1.0)的范圍之內的隨機小數。
2. random.uniform(a,b)
random.uniform()是在指定范圍內生成隨機小數,其有兩個參數,一個是范圍上限,一個是范圍下限,范圍為[a,b]。
3. random.randint(a,b)
random.randint()是隨機生成指定范圍內的整數,其有兩個參數,一個是范圍上限,一個是范圍下限制,范圍為[a,b]。
4. random.randrange(start,stop[,step])
random.randrange()是在指定范圍內,按指定基數遞增的集合中獲得一個隨機數,有三個參數,前兩個參數代表范圍上限和下限,第三個參數是遞增增量,默認為1。
5. random.choice(sep)
random.choice()是從序列中獲取一個隨機元素。
6. random.shuffle(sep)
random.shuffle()函數是將一個列表中的元素打亂,隨機排序。
7. random.sample(pop,k)
random.sample()函數是從指定序列中隨機獲取指定長度的片段,原有序列不會改變,有兩個參數,第一個參數代表指定序列,第二個參數是需獲取的片段長度。
8. randm.getrandbits(k)
getrandbits()函數生成一個k比特長度的隨機整數
8. randm.seed(a=None)
seed()函數主要作用為初始化隨機數種子,默認值為當前系統時間
程序開發:
參照需求分析,開發步驟如下
1.創建一個指定范圍內的整數,以1-100為例
首先生成隨機數需要調用random函數,為方便通過關鍵詞as改為r。
其次我們需要生成的數字為整數,且有着明確的范圍,所有應當使用random.randint(a,b)來生成對應整數。
最后輸出檢測是否成功生成。
代碼設計如下
import random as r a = r.randint(1,100) print(a)
注意:有的同學習慣將第二行、第三行寫到一起,即:print(r.random(1,100))
這樣寫是沒有任何問題的,但是由於后期判斷玩家回答是否正確需要用到這一數字,所以還是創建一個變量來保存比較好。
2.接收玩家輸入的數字,並且計較大小
首先創建一個變量來接收玩家輸入的數字,剛剛使用的a來存儲計算機所生成的隨機數,所以這里用b來代表玩家輸入的數字。
之后使用 if 判斷語句來將玩家輸入數字b與計算機生成數據a來作比較 。
當b>a時輸出太大了;當b<a時輸出太小了;當 b=a時輸出猜中了。
代碼如下:
import random as r a = r.randint(1,100) # 方便調試程序、調試結束當將本句注釋掉 print(a) b=int(input("輸入數字")) if b>a: print("太大了") elif b<a: print("太小了") else: print("恭喜答對")
注意:由於b是通過input()函數接收到的數據,所以b默認的數據類型為string,所以會報錯string類型的b不能與int類型的a做比較大小操作。情況如下

解決方法:
1.通過int(),改變b的數據類型,如上文所寫b=int(input("輸入數字"))
2.通過eval(),自動識別接收數據類型
3.創建循環,重復第二部分,直到玩家答對數字
兩種循環,for循環和 while循環哪一個更好一點呢?
for循環的特點為先判斷條件,再執行語句。
while循環的特點為先執行語句,再循環。
猜數字游戲自然是先執行語句再判斷的好所以本處使用while循環
跳出循環的條件為玩家回答正確,跳出的方式也多種多樣
第一種:判斷條件為False
我們可以創建變量 flag,while條件為flag為真
此時只需要在玩家回答正確之后,更改falg值為假即可。
import random as r a = r.randint(1,100) # 方便調試程序、調試結束當將本句注釋掉 print(a) flag = 1 while flag == 1: b=int(input("輸入數字")) if b>a: print("太大了") elif b<a: print("太小了") else: print("恭喜答對") flag = 0
第二種:break跳出
關鍵字break 功能為跳出本循環體,所以這時候可以設定while循環條件恆為真
import random as r a = r.randint(1,100) # 方便調試程序、調試結束當將本句注釋掉 print(a) while True: b=int(input("輸入數字")) if b>a: print("太大了") elif b<a: print("太小了") else: print("恭喜答對") break
4.添加分數、游戲輸出
分數的統計方法十分簡單,只需要統計循環體的循環次數即可。
設定一個變量來統計循環次數,變量初量為“0”,在每次循環前變量+1即可。
當然個人喜好也可以賦初值為100,每次循環-1,最后統計輸出數值即可。
所以最終代碼如下:
import random as r a = r.randint(1,100) # 方便調試程序、調試結束當將本句注釋掉 #print(a) score = 0 while True: b=int(input("輸入數字")) score+=1 if b>a: print("太大了") elif b<a: print("太小了") else: print("恭喜答對") break print("score=%d"%score)
程序優化:
1.手動輸入上下限制
上述程序中,以1-100為例,而我們平常所使用中,可以自主設定上下限。
所以第一步將原來的限制更改為自主輸入。
上述設定a為計算機生成數,b為玩家輸入數字,理所當然c、d承擔起上下限制的重任
首先需要來接收玩家輸入的數據,由於生成的隨機數a需要上下限制的參數,所以接收應當在生成隨機數前面。
之后將random傳入參數改為 變量名c、d
如下代碼所示
import random as r c = int(input("請輸入最小數")) d = int(input("請輸入最大數")) a = r.randint(c,d) # 方便調試程序、調試結束當將本句注釋掉 #print(a) score = 0 while True: b=int(input("輸入數字")) score+=1 if b>a: print("太大了") elif b<a: print("太小了") else: print("恭喜答對") break print("score=%d"%score)
2.顯示數字范圍
每一次都只回應請”輸入數字”,如果可以將之前的數據更新迭代,也就是輸出范圍想來要比原計划好一些。
如果這樣做,最先修改的便是輸入b時候的語句,需要將上下限制加入。
之后上下限制的數據也要對應發生改變,以1-100為范圍,隨機數為60為例:
玩家輸入50,計算機給出回應太小了,之后請求輸入的是51-100的數據。
也就是說最初玩家輸入c(1)~d(100) 當玩家輸入新數據b(50)之后,cd將要根據b的情況來更新
當太小了時候,c=b+1
當太大了時候,d=b-1
代碼以及結果如下:
import random as r c = int(input("請輸入最小數")) d = int(input("請輸入最大數")) a = r.randint(c,d) # 方便調試程序、調試結束當將本句注釋掉 print(a) score = 0 while True: b=int(input("輸入%d到%d數字:"%(c,d))) score+=1 if b>a: print("太大了") d=b-1 elif b<a: print("太小了") c=b+1 else: print("恭喜答對") break print("score=%d"%score)

