1. 程式人生 > >Python小遊戲——猜數字教程(random庫教程)

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