在講述[有關list的時候,提到做游戲的事情](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/115.md),后來這個事情一直沒有接續。不是忘記了,是在想在哪個階段做最合適。經過一段時間學習,看官已經不是純粹小白了,已經屬于python初級者了。現在就是開始做那個游戲的時候了。
## [](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/129.md#游戲內容猜數字游戲)游戲內容:猜數字游戲
太簡單了吧。是的,游戲難度不大,不過這個游戲中蘊含的東西可是值得玩味的。
### 游戲過程描述
1. 程序運行起來,隨機在某個范圍內選擇一個整數。
2. 提示用戶輸入數字,也就是猜程序隨即選的那個數字。
3. 程序將用戶輸入的數字與自己選定的對比,一樣則用戶完成游戲,否則繼續猜。
4. 使用次數少的用戶得勝.
## [](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/129.md#分析)分析
在任何形式的程序開發之前,不管是大還是小,都要進行分析。即根據功能需求,將不同功能點進行分解。從而確定開發過程。我們現在做一個很小的程序,也是這樣來做。
### 隨機選擇一個數
要實現隨機選擇一個數字,可以使用python中的一個隨機函數:random。下面對這個函數做簡要介紹,除了針對本次應用之外,還擴展點,也許別處看官能用上。
還是要首先強化一種學習方法,就是要學會查看幫助文檔。
~~~
>>> import random #這個是必須的,因為不是內置函數
>>> dir(random)
['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST', 'SystemRandom', 'TWOPI', 'WichmannHill', '_BuiltinMethodType', '_MethodType', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_acos', '_ceil', '_cos', '_e', '_exp', '_hashlib', '_hexlify', '_inst', '_log', '_pi', '_random', '_sin', '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice', 'division', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'jumpahead', 'lognormvariate', 'normalvariate', 'paretovariate', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']
>>> help(random.randint)
Help on method randint in module random:
randint(self, a, b) method of random.Random instance
Return random integer in range [a, b], including both end points.
~~~
耐心地看文檔,就明白怎么用了。不過,還是把主要的東西列出來,但仍然建議看官在看每個函數的使用之前,在交互模式下通過help來查看文檔。
**隨機整數:**
~~~
>>> import random
>>> random.randint(0,99)
21
~~~
**隨機選取0到100間的偶數:**
~~~
>>> import random
>>> random.randrange(0, 101, 2)
42
~~~
**隨機浮點數:**
~~~
>>> import random
>>> random.random()
0.85415370477785668
>>> random.uniform(1, 10)
5.4221167969800881
~~~
**隨機字符:**
~~~
>>> import random
>>> random.choice('qiwsir.github.io')
'g'
~~~
**多個字符中選取特定數量的字符:**
~~~
>>> import random
random.sample('qiwsir.github.io',3)
['w', 's', 'b']
~~~
**隨機選取字符串:**
~~~
>>> import random
>>> random.choice ( ['apple', 'pear', 'peach', 'orange', 'lemon'] )
'lemon'
~~~
**洗牌:**把原有的順序打亂,按照隨機順序排列
~~~
>>> import random
>>> items = [1, 2, 3, 4, 5, 6]
>>> random.shuffle(items)
>>> items
[3, 2, 5, 6, 4, 1]
~~~
有點多了。不過,本次實驗中,值用到了random.randint()即可。多出來是買一送一的(哦。忘記了,沒有人買呢,本課程全是白送的)。
關鍵技術點之一已經突破。可以編程了。再梳理一下流程。畫個圖展示:
(備注:這里我先懶惰一下吧,看官能不能畫出這個程序的流程圖呢?特別是如果是一個初學者,流程圖一定要自己畫哦。剛才看到網上一個朋友說自己學編程,但是邏輯思維差,所以沒有學好。其實,畫流程圖就是幫助提高邏輯思維的一種好方式,請畫圖吧。)
圖畫好了,按照直觀的理解,下面的代碼是一個初學者常常寫出來的(老鳥們不要噴,因為是代表初學者的)。
~~~
#!/usr/bin/env python
#coding:utf-8
import random
number = random.randint(1,100)
print "請輸入一個100以內的自然數:"
input_number = raw_input()
if number == int(input_number):
print "猜對了,這個數是:"
print number
else:
print "錯了。"
~~~
上面的程序已經能夠基本走通,但是,還有很多缺陷。
最明顯的就是只能讓人猜一次,不能多次。怎么修改,能夠多次猜呢?動動腦筋之后看代碼,或者看官在自己的代碼上改改,能不能實現多次猜測?
另外,能不能增強一些友好性呢,讓用戶知道自己輸入的數是大了,還是小了。
根據上述修改想法,新代碼如下:
~~~
#!/usr/bin/env python
#coding:utf-8
import random
number = random.randint(1,100)
print "請輸入一個100以內的自然數:"
input_number = raw_input()
if number == int(input_number):
print "猜對了,這個數是:"
print number
elif number > int(input_number):
print "小了"
input_number = raw_input()
elif number < int(input_number):
print "大了"
input_number = raw_input()
else:
print "錯了。"
~~~
嗯,似乎比原來進步一點點,因為允許用戶輸入第二次了。同時也告訴用戶輸入的是大還是小了。但,這也不行呀。應該能夠輸入很多次,直到正確為止。
是的。這就要用到一個新的東西:循環。如果看官心急,可以google一下while或者for循環,來進一步完善這個游戲,如果不著急,可以等等,隨后我也會講到這部分。
這個游戲還沒有完呢,即使用了循環,后面還會繼續。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python