[TOC]
### 課前準確:
* 在`Windows`系統里安裝`python`,參考 [安裝python](http://www.hmoore.net/k12edu/k_12/785427#Windowspython_4)
*****
### 本節課參考書目
* `Teach Your Kids to Code.pdf` 第六章:隨機數和游戲
*****
> Go ahead,Take a Chance! ——加油,抓住機會!
### 什么是隨機數
隨機數和骰子有些類似。在擲骰子之前,我們并不知道擲出的結果是什么,只知道可能的結果是 1~6 之間的某個整數。
隨機數的作用非常大。例如銀行卡的密碼都是用隨機數進行加密的,科學實驗也大量使用隨機數。

`python` 自帶隨機數生成器工具`random`,這個工具有很多方法。下面這個例子,描述了如何用`randint`方法生成一個 1~10 之間的隨機數。
```
>>> import random
>>> random.randint(1, 10)
```
#### 猜數字
```
# GuessingGame_6_1.py
import random
the_number = random.randint(1, 10)
guess = int(input("猜一個 1~10 之間的數字: "))
while guess != the_number:
if guess > the_number:
print(guess, "太大了,再猜猜看。")
if guess < the_number:
print(guess, "太小了,再猜猜看。")
guess = int(input("再猜猜看: "))
print(guess, " ,就是這個數字!你贏了!")
```
#### 從一組數字中隨機選擇顏色
下面這個例子,描述了如何從一個顏色列表里,用`choice`方法隨機選擇一種顏色。
```
>>> colors = ["red", "yellow", "blue", "green", "orange", "purple", "white", "gray"]
>>> random.choice(colors)
'orange'
>>> random.choice(colors)
'blue'
>>> random.choice(colors)
'white'
>>> random.choice(colors)
'purple'
>>>
```
### 石頭剪刀布
這個游戲和我們平時玩的游戲是一樣的,只是這一回和我們游戲的對手不是其他小朋友,而是一部電腦。
這個編程,要完成一些任務:
1. 使用`while`循環控制游戲是繼續還是結束
2. 如果你出的不是"石頭"、"布"、"剪刀"中的一種,電腦要能識別出來,并提醒你這樣是不對的
3. 其他的游戲規則和我們平時用的規則是一樣的。例如,石頭可以打敗剪刀、剪刀可以打敗布、布可以打敗石頭
```
# RockPaperScissors_6_2.py
import random
choices = ["石頭", "布", "剪刀"]
print("石頭打敗剪刀,剪刀打敗布,布包住石頭。")
player = input("你想是石頭、布、 剪刀 (還是退出)? ")
while player != "退出":
player = player
computer = random.choice(choices)
print("你選擇了 " +player+ ",計算機選擇了 " +computer+ "。")
if player == computer:
print("平局!")
elif player == "石頭":
if computer == "剪刀":
print("你贏了!")
else:
print("計算機贏了!")
elif player == "布":
if computer == "石頭":
print("你贏了!")
else:
print("計算機贏了!")
elif player == "剪刀":
if computer == "布":
print("你贏了!")
else:
print("計算機贏了!")
else:
print("我猜這里面出了點問題。。。")
print()
player = input("你想是石頭、布、 剪刀 (還是退出)?")
```
### 打撲克
一副撲克,除了大小王之外,還有52張牌,它們有四種花色,分別是"梅花"、"方塊"、"紅桃"、"黑桃",每種花色有13張牌,分別是"二"、"三"、"四"、"五"、"六"、"七"、"八"、"九"、"十"、"J"、"Q"、"K"、"ace"。
如果我們想在計算機里建立一副撲克,一種方法是把所有的牌寫到一個列表里,就像下面:
```
cards = ["方塊二","方塊三","方塊五",# 剩下的牌...]
```
不過這種方法太麻煩了,我們觀察一下牌面的特征,一個是花色,一個是面值,所以,我們把花色寫到`suits`這個列表里,把面值寫到`faces`這個列表里,就像下面:
```
suits = ["梅花", "方塊", "紅桃", "黑桃"]
faces = ["二", "三", "四", "五", "六", "七", "八", "九",
"十", "J", "Q", "K", "ace"]
```
接下來,我們就可以使用`choice`方法隨機抽取一張撲克牌。
```
# chapter6_1.py
import random
suits = ["梅花", "方塊", "紅桃", "黑桃"]
faces = ["二", "三", "四", "五", "六", "七", "八", "九",
"十", "J", "Q", "K", "ace"]
my_face = random.choice(faces)
my_suit = random.choice(suits)
print("我的牌是", my_suit, my_face)
```
如果我們想比較哪個花色比較厲害,怎么讓電腦知道“黑桃”比“梅花”厲害呢?
使用`index`方法就可以做到,`index`就是索引的意思,有點類似字典的頁碼,因為“黑桃”的索引是3,“梅花”的索引是0,所以電腦就知道“黑桃”比“梅花”厲害了。
```
>>> suits = ["梅花", "方塊", "紅桃", "黑桃"]
>>> suits.index("梅花")
0
>>> suits.index("黑桃")
3
```
下面是和電腦比牌面大小:
```
import random
faces = ["二", "三", "四", "五", "六", "七", "八", "九",
"十", "J", "Q", "K", "ace"]
my_face = random.choice(faces)
your_face = random.choice(faces)
if faces.index(my_face) > faces.index(your_face):
print("我贏了!")
elif faces.index(my_face) < faces.index(your_face):
print("你贏了!")
```
如果我們想和電腦有個交互的過程,例如,電腦問我們,還要不要在打牌?然后我們輸入一個答案`answer`,電腦根據`answer`的結果,給一個控制變量,這里是`keep_going`,賦予一個值`True`或者`False`,就像下面:
```
answer = input("按 [Enter]繼續,或者按其他鍵退出: ")
if answer == "":
keep_going = True
else:
keep_going = False
```
更簡單的寫法:
```
answer = input("按 [Enter]繼續,或者按其他鍵退出: ")
keep_going = (answer == "")
```
然后我們把`while`語句給加上,這樣電腦循環問要不要繼續打牌:
```
keep_going = True
while keep_going:
answer = input("按 [Enter]繼續,或者按其他鍵退出: ")
keep_going = (answer == "")
```
把上面幾段代碼加在一起,有好像真的和人一樣打牌了:
```
import random
suits = ["梅花", "方塊", "紅桃", "黑桃"]
faces = ["二", "三", "四", "五", "六", "七", "八", "九",
"十", "J", "Q", "K", "ace"]
keep_going = True
while keep_going:
my_face = random.choice(faces)
my_suit = random.choice(suits)
your_face = random.choice(faces)
your_suit = random.choice(suits)
print("我的牌是", my_suit, my_face)
print("你的牌是", your_suit, your_face)
if faces.index(my_face) > faces.index(your_face):
print("我贏了!")
elif faces.index(my_face) < faces.index(your_face):
print("你贏了!")
else:
print("平局")
answer = input("按 [Enter]繼續,或者按其他鍵退出: ")
keep_going = (answer == "")
```
### 課程小結
這節課,我們學習了`python`自帶的隨機數`random`,有了這個工具,我們就能做一些簡單的仿真游戲。很多科學實驗,為了節約成本,也會用隨機數的原理,設計成仿真實驗。