[TOC]
### 课前准确:
* 在`Windows`系统里安装`python`,参考 [安装python](https://www.kancloud.cn/k12edu/k_12/785427#Windowspython_4)
*****
### 本节课参考资料
* `Teach Your Kids to Code.pdf` 第九章:和游戏互动
*****
### 在窗口里点击鼠标画画
```
# chapter9_1.py
import pygame
# Setup
pygame.init()
screen = pygame.display.set_mode([800,600])
pygame.display.set_caption("点击鼠标画画") # 在窗口上写一个题目
keep_going = True
RED = (255,0,0)
radius = 15
while keep_going:
for event in pygame.event.get(): # 处理检测到的行为
if event.type == pygame.QUIT:
keep_going = False
if event.type == pygame.MOUSEBUTTONDOWN: # 如果检测到到按下鼠标
spot = event.pos # 检测鼠标点击的位置
pygame.draw.circle(screen, RED, spot, radius) # 在点击的位置上画圆
pygame.display.update()
pygame.quit()
```
![](https://box.kancloud.cn/e01b2c26902e5310a3c3efa0ca7f307f_659x513.png)
*****
### 在窗口里点击并拖拽鼠标画画
```
# chapter9_2.py
import pygame
pygame.init()
screen = pygame.display.set_mode([800,600])
pygame.display.set_caption("点击并拖拽鼠标画画") # 点击并拖拽鼠标画画
keep_going = True
YELLOW = (255,255,0) # 把颜色设置成黄色
radius = 15
mousedown = False
while keep_going:
for event in pygame.event.get(): # 处理检测到的行为
if event.type == pygame.QUIT:
keep_going = False
if event.type == pygame.MOUSEBUTTONDOWN: #如果检测到按下鼠标
mousedown = True
if event.type == pygame.MOUSEBUTTONUP:
mousedown = False
if mousedown: # 如果mousedown 为 True,则画画
spot = pygame.mouse.get_pos() # 检测鼠标点击的位置
pygame.draw.circle(screen, YELLOW, spot, radius)
pygame.display.update() # Update display
pygame.quit()
```
![](https://box.kancloud.cn/3854ef4dd10deb234a568b1d7e1fdfc7_620x485.png)
*****
### 不断出现的笑脸
```
# chapter9_3.py
import pygame
import random
BLACK = (0,0,0)
pygame.init()
screen = pygame.display.set_mode([800,600])
pygame.display.set_caption("Smiley Explosion")
mousedown = False
keep_going = True
clock = pygame.time.Clock()
pic = pygame.image.load("CrazySmile.bmp")
colorkey = pic.get_at((0,0))
pic.set_colorkey(colorkey)
sprite_list = pygame.sprite.Group()
class Smiley(pygame.sprite.Sprite): # 控制笑脸的大小
pos = (0,0)
xvel = 1
yvel = 1
scale = 100
def __init__(self, pos, xvel, yvel):
pygame.sprite.Sprite.__init__(self)
self.image = pic
self.scale = random.randrange(10,100)
self.image = pygame.transform.scale(self.image, (self.scale,self.scale))
self.rect = self.image.get_rect()
self.pos = pos
self.rect.x = pos[0] - self.scale/2
self.rect.y = pos[1] - self.scale/2
self.xvel = xvel
self.yvel = yvel
def update(self):
self.rect.x += self.xvel
self.rect.y += self.yvel
if self.rect.x <= 0 or self.rect.x > screen.get_width() - self.scale:
self.xvel = -self.xvel
if self.rect.y <= 0 or self.rect.y > screen.get_height() - self.scale:
self.yvel = -self.yvel
while keep_going:
for event in pygame.event.get():
if event.type == pygame.QUIT:
keep_going = False
if event.type == pygame.MOUSEBUTTONDOWN:
mousedown = True
if event.type == pygame.MOUSEBUTTONUP:
mousedown = False
screen.fill(BLACK)
sprite_list.update()
sprite_list.draw(screen)
clock.tick(60)
pygame.display.update()
if mousedown:
speedx = random.randint(-5, 5)
speedy = random.randint(-5, 5)
newSmiley = Smiley(pygame.mouse.get_pos(),speedx,speedy)
sprite_list.add(newSmiley)
pygame.quit()
```
![](https://box.kancloud.cn/7f2ba88c93235d2fe9444ca5bf5a0bd8_584x456.png)
*****
```
# chapter9_4.py
# SmileyPop.py
import pygame
import random
BLACK = (0,0,0)
pygame.init()
screen = pygame.display.set_mode([800,600])
pygame.display.set_caption("Pop a Smiley")
mousedown = False
keep_going = True
clock = pygame.time.Clock()
pic = pygame.image.load("CrazySmile.bmp")
colorkey = pic.get_at((0,0))
pic.set_colorkey(colorkey)
sprite_list = pygame.sprite.Group()
class Smiley(pygame.sprite.Sprite):
pos = (0,0)
xvel = 1
yvel = 1
scale = 100
def __init__(self, pos, xvel, yvel):
pygame.sprite.Sprite.__init__(self)
self.image = pic
self.scale = random.randrange(10,100)
self.image = pygame.transform.scale(self.image, (self.scale,self.scale))
self.rect = self.image.get_rect()
self.pos = pos
self.rect.x = pos[0] - self.scale/2
self.rect.y = pos[1] - self.scale/2
self.xvel = xvel
self.yvel = yvel
def update(self):
self.rect.x += self.xvel
self.rect.y += self.yvel
if self.rect.x <= 0 or self.rect.x > screen.get_width() - self.scale:
self.xvel = -self.xvel
if self.rect.y <= 0 or self.rect.y > screen.get_height() - self.scale:
self.yvel = -self.yvel
while keep_going:
for event in pygame.event.get():
if event.type == pygame.QUIT:
keep_going = False
if event.type == pygame.MOUSEBUTTONDOWN:
if pygame.mouse.get_pressed()[0]: # 左键画笑脸
mousedown = True
elif pygame.mouse.get_pressed()[2]: # 右键画笑脸
pos = pygame.mouse.get_pos()
clicked_smileys = [s for s in sprite_list if s.rect.collidepoint(pos)]
sprite_list.remove(clicked_smileys)
if event.type == pygame.MOUSEBUTTONUP:
mousedown = False
screen.fill(BLACK)
sprite_list.update()
sprite_list.draw(screen)
clock.tick(60)
pygame.display.update()
if mousedown:
speedx = random.randint(-5, 5)
speedy = random.randint(-5, 5)
newSmiley = Smiley(pygame.mouse.get_pos(),speedx,speedy)
sprite_list.add(newSmiley)
pygame.quit()
```
### 课程小结
这节课我们仍然使用 `pygame` 完成一些有趣的游戏,包括:
* 如何利用鼠标画画
* 如何控制图形的大小
* 如何去除图形