Python小遊戲——猜數字教程(random庫教程)
今天來開發一個簡單的數字邏輯遊戲,猜數字(數字炸彈)
首先開發遊戲第一件事,瞭解需求。
猜數字遊戲規則:
計算機隨機生成一個指定範圍的數字,由玩家來猜測,
之後計算機會根據玩家提供數字來與自己生成的數字進行對比,並返回結果太大或者太小
例:計算機隨機生成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)
&n