最近看小甲鱼的视频学习了play the ball游戏。然后就学习了一下就把笔记写了一下。
import pygame
import sys
from pygame.locals import *
from random import *
#面向对象的编程方法,定义一个球的类型
class Ball(pygame.sprite.Sprite):
def __init__(self, grayball_image, greenball_image, position, speed, bg_size, target):
pygame.sprite.Sprite.__init__(self)
self.grayball_image = pygame.image.load(grayball_image).convert_alpha()
self.greenball_image = pygame.image.load(greenball_image).convert_alpha()
self.rect = self.grayball_image.get_rect()
self.rect.left, self.rect.top = position
self.speed = speed
self.target = target
self.control = False
self.collide = False
self.side = [choice([-1, 1]), choice([-1, 1])]
self.width, self.height = bg_size[0], bg_size[1]
self.radius = self.rect.width / 2
#定义一个移动的方法
def move(self):
if self.control:
self.rect = self.rect.move(self.speed)
else:
self.rect = self.rect.move(self.side[0] * self.speed[0], self.side[1] * self.speed[1])
if self.rect.right < 0:
self.rect.left = self.width
if self.rect.left > self.width:
self.rect.right = 0
if self.rect.bottom < 0:
self.rect.top = self.height
if self.rect.top > self.height:
self.rect.bottom = 0
#定义一个检测是否发生碰撞的方法
def check(self, motion):
if self.target - 10 <= motion <= self.target + 10:
return True
else:
return False
#定义一个玻璃的类型
class Glass(pygame.sprite.Sprite):
def __init__(self, glass_image, mouse_image, bg_size):
pygame.sprite.Sprite.__init__(self)
self.glass_image = pygame.image.load(glass_image).convert_alpha()
self.glass_rect = self.glass_image.get_rect()
self.glass_rect.left, self.glass_rect.top = (bg_size[0] - self.glass_rect.width) / 2,\
bg_size[1] - self.glass_rect.height
self.mouse_image = pygame.image.load(mouse_image).convert_alpha()
self.mouse_rect = self.mouse_image.get_rect()
self.mouse_rect.left, self.mouse_rect.top = self.glass_rect.left, self.glass_rect.top
pygame.mouse.set_visible(False)
#主函数
def main():
#将pygame里的各个方法初始化
pygame.init()
#播放背景音乐
pygame.mixer.music.load("bg_music.ogg")
pygame.mixer.music.play()
#初始化音效
hole_sound = pygame.mixer.Sound("hole.wav")
laugh_sound = pygame.mixer.Sound("laugh.wav")
loser_sound = pygame.mixer.Sound("loser.wav")
winner_sound = pygame.mixer.Sound("winner.wav")
#初始化图片
bg_image = "background.png"
grayball_image = "gray_ball.png"
greenball_image = "green_ball.png"
glass_image = "glass.png"
mouse_image = "hand.png"
win_image = "win.png"
#设置屏幕
bg_size = width, height = 1024, 681
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("")
background = pygame.image.load(bg_image).convert_alpha()
#将黑洞的left,top坐标记为列表
hole = [(117, 119, 199, 201),\
(225, 227, 390, 392),\
(503, 505, 320, 322),\
(698, 700, 192, 194),\
(906, 908, 419, 421)]
#设置balls列表
balls = []
#设置碰撞检测的group
group = pygame.sprite.Group()
#将Glass类赋值给glass
glass = Glass(glass_image, mouse_image, bg_size)
#设置一个事件
motion = 0
#定义一个msgs列表用于存放游戏结束后的图片等
msgs = []
#自定义一个GAMEOVER事件event(24)
GAMEOVER = USEREVENT
pygame.mixer.music.set_endevent(GAMEOVER)
#自定义一个MYTIMER事件event(24+1)
MYTIMER = USEREVENT + 1
pygame.time.set_timer(MYTIMER, 1000)
#可以100ms检测一次按键是否按下,用于小球的加速度
pygame.key.set_repeat(100, 100)
#迭代出5个小球
for i in range(5):
position = randint(0, width - 100), randint(0, height - 100)
speed = [randint(1, 10), randint(1, 10)]
ball = Ball(grayball_image, greenball_image, position, speed, bg_size, 5 * (i + 1))
while pygame.sprite.spritecollide(ball, group, False, pygame.sprite.collide_circle):
ball.rect.left, ball.rect.top = randint(0, width - 100), randint(0, height - 100)
balls.append(ball)
group.add(ball)
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if event.type == GAMEOVER:
pygame.mixer.music.stop()
laugh_sound.play()
pygame.time.delay(4000)
loser_sound.play()
pygame.time.delay(4000)
running = False
if event.type == KEYDOWN:
if event.key == K_w:
for each in group:
if each.control:
each.speed[1] -= 1
if event.key == K_s:
for each in group:
if each.control:
each.speed[1] += 1
if event.key == K_a:
for each in group:
if each.control:
each.speed[0] -= 1
if event.key == K_d:
for each in group:
if each.control:
each.speed[0] += 1
if event.key == K_SPACE:
for each in group:
if each.control:
for i in hole:
if i[0] - 5 <= each.rect.left <= i[1] + 5 and i[2] - 5 <= each.rect.top <= i[3] + 5:
each.speed = [0, 0]
hole_sound.play()
group.remove(each)
temp = balls.pop(balls.index(each))
balls.insert(0, temp)
hole.remove(i)
if not hole:
pygame.mixer.music.stop()
winner_sound.play()
pygame.time.delay(3000)
laugh_sound.play()
msg = pygame.image.load(win_image).convert_alpha()
msg_pos = (width - msg.get_width()) / 2, (height - msg.get_height()) / 2
msgs.append((msg, msg_pos))
if event.type == MYTIMER:
if motion:
for each in group:
if each.check(motion):
each.speed = [0, 0]
each.control = True
motion = 0
if event.type == MOUSEMOTION:
motion += 1
screen.blit(background, (0, 0))
screen.blit(glass.glass_image, glass.glass_rect)
#将鼠标的位置传给mouse_rect,然后检测鼠标的位置是否出边界
glass.mouse_rect.left, glass.mouse_rect.top = pygame.mouse.get_pos()
if glass.mouse_rect.left <= glass.glass_rect.left:
glass.mouse_rect.left = glass.glass_rect.left
if glass.mouse_rect.right >= glass.glass_rect.right:
glass.mouse_rect.right = glass.glass_rect.right
if glass.mouse_rect.top <= glass.glass_rect.top:
glass.mouse_rect.top = glass.glass_rect.top
if glass.mouse_rect.bottom >= glass.glass_rect.bottom:
glass.mouse_rect.bottom = glass.glass_rect.bottom
screen.blit(glass.mouse_image, glass.mouse_rect)
for each in balls:
each.move()
if each.collide:
each.speed = [randint(1, 10), randint(1, 10)]
each.collide = False
if each.control:
screen.blit(each.greenball_image, each.rect)
else:
screen.blit(each.grayball_image, each.rect)
for each in group:
group.remove(each)
if pygame.sprite.spritecollide(each, group, False, pygame.sprite.collide_circle):
each.side[0] = -each.side[0]
each.side[1] = -each.side[1]
each.collide = True
if each.control:
each.side[0] = -1
each.side[1] = -1
each.control = False
group.add(each)
for msg in msgs:
screen.blit(msg[0], msg[1])
pygame.display.flip()
clock.tick(30)
if __name__ == '__main__':
main()