[TOC]
### 课前准确:
* 在`Windows`系统里安装`python`,参考 [安装python](https://www.kancloud.cn/k12edu/k_12/785427#Windowspython_4)
*****
### 本节课参考书目
* `Teach Your Kids to Code.pdf` 第六章:随机数和游戏
*****
> Go ahead,Take a Chance! ——加油,抓住机会!
### 什么是随机数
随机数和骰子有些类似。在掷骰子之前,我们并不知道掷出的结果是什么,只知道可能的结果是 1~6 之间的某个整数。
随机数的作用非常大。例如银行卡的密码都是用随机数进行加密的,科学实验也大量使用随机数。
![](https://box.kancloud.cn/0fa9aadf6e6ea776de7c4b1f64163e03_375x236.png)
`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`,有了这个工具,我们就能做一些简单的仿真游戏。很多科学实验,为了节约成本,也会用随机数的原理,设计成仿真实验。