import pygame
import sys
import random
from pygame.locals import *
class SkierClass(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
#滑雪者的朝向
self.direction = 0
self.imgs = ["./images/skier_forward.png", "./images/skier_right1.png", "./images/skier_right2.png", "./images/skier_left2.png", "./images/skier_left1.png"]
self.person = pygame.image.load(self.imgs[self.direction])
#获取矩形的位置
self.rect = self.person.get_rect()
self.rect.center = [320,100]
self.speed = [self.direction,6-abs(self.direction)*2]
#改变滑雪者的朝向,负数为向左,正数为向右 0为直行
def turn(self,num):
self.direction += num
self.direction = max(-2,self.direction)
self.direction = min(2,self.direction)
#设置小人的位置
center = self.rect.center
#加载位图
self.person = pygame.image.load(self.imgs[self.direction])
#获取位图的矩形
self.rect = self.person.get_rect()
#获取小人的中心点位置
self.rect.center = center
self.speed = [self.direction,6-abs(self.direction)*2]
return self.speed
#移动滑雪者
def move(self):
self.rect.centerx += self.speed[0]
self.rect.centerx = max(20,self.rect.centerx)
self.rect.centerx = min(620,self.rect.centerx)
#障碍物类
class ObstacleClass(pygame.sprite.Sprite):
def __init__(self,img_path,location,attribute):
pygame.sprite.Sprite.__init__(self)
self.img_path = img_path
self.image = pygame.image.load(self.img_path)
self.location = location
self.rect = self.image.get_rect()
self.rect.center = self.location
self.attribute = attribute
self.passed = False
#移动方法
def move(self,num):
self.rect.centery = self.location[1] - num
def create_obstacles(s,e):
obstacles = pygame.sprite.Group()
locations = []
for i in range(20):
row = random.randint(s,e)
col = random.randint(0,9)
location = [col*64+20,row*64+20]
if location not in locations:
locations.append(location)
attribute = random.choice(['tree','flag'])
if attribute == 'tree':
img_path = './images/tree.png'
else:
img_path = './images/flag.png'
obstacle = ObstacleClass(img_path,location,attribute)
obstacles.add(obstacle)
return obstacles
def AddObstacles(obstacle0,obstacle1):
obstacles = pygame.sprite.Group()
for obstacle in obstacle0:
obstacles.add(obstacle)
for obstacle in obstacle1:
obstacles.add(obstacle)
return obstacles
#显示结束页面
def over(Demo,width,height):
Demo.fill((125,125,125))
vrert = pygame.font.Font('./font/abc.ttf',width//4)
vrerx = vrert.render('游戏结束',True,(255,0,255))
vrerg = vrerx.get_rect()
vrerg.midtop = (width/2,height)
Demo.blit(vrerx,vrerg)
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#显示游戏界面
def Show_Start_Interface(Demo,width,height):
tfont = pygame.font.Font('./font/abc.ttf',width//4)
cfont = pygame.font.Font('./font/simkai.ttf',width//20)
title = tfont.render(u'滑雪游戏',True,(255,255,255))
content = cfont.render(u'按任意键开始游戏',True,(255,255,255))
trect = title.get_rect()
trect.midtop = (width/2,height/10)
crect = content.get_rect()
crect.midtop = (width/2,height/2.2)
Demo.blit(title,trect)
Demo.blit(content,crect)
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
return
#主程序
def main():
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load('./music/bg_music.mp3')
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
screen = pygame.display.set_mode([640,640])
pygame.display.set_caption('滑雪游戏')
#创建时钟对象(控制循环频率)
clock = pygame.time.Clock()
#滑雪者实例化
skier = SkierClass()
#记录滑雪距离
distance = 0
#速度
speed = [0,6]
#分数
font = pygame.font.Font(None ,50)
score = 0
score_text = font.render('Score:' + str(score),True,((0,0,0)))
Show_Start_Interface(screen,640,640)
#创建障碍物
obstacle1 = create_obstacles(0,9)
obstacle2 = create_obstacles(10,19)
obstacles = AddObstacles(obstacle1,obstacle2)
#更新屏幕
def update():
screen.fill([random.randint(0,255),random.randint(0,255),random.randint(0,255)])
pygame.display.update(obstacles.draw(screen))
#绘制位图(加载图片,和图片的矩形大小)
screen.blit(skier.person,skier.rect)
screen.blit(score_text,[10,10])
pygame.display.flip()
while True:
# 左右键控制人物方向
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
speed = skier.turn(-1)
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
speed = skier.turn(1)
skier.move()
distance +=speed[1]
if distance >= 640:
distance = 0
for obstacle in obstacle2:
obstacle.location[1] -= 640
obstacle1 = obstacle2
obstacle2 = create_obstacles(10,19)
obstacles = AddObstacles(obstacle1,obstacle2)
for obstacle in obstacles:
obstacle.move(distance)
is_hit = pygame.sprite.spritecollide(skier,obstacles,True)
if is_hit:
if is_hit[0].attribute == 'tree':
score -= 50
skier.person = pygame.image.load('./images/skier_fall.png')
update()
pygame.time.delay(1000)
skier.person = pygame.image.load('./images/skier_fall.png')
update()
skier.direction = 0
speed = [0,6]
elif is_hit[0].attribute == 'flag':
score += 10
score_text = font.render('Score:' + str(score),True,(0,0,0))
if score < 0:
over(screen,640,640)
update()
clock.tick(40)
main()