上篇文章:Python游戏如何开发?本篇文章带你玩转pygame
滑雪大冒险
1.第一节课
# -*-coding:GBK -*-# 导入pygameimport pygame# 导入时间库import time# 滑雪者方向不同对应不同的图片skier_images = ['./ images/skier_forward.png',"./ images/skier_right1.png","./ images/skier_right2.png","./ images/skier_left2.png","./ images/skier_left1.png"]# 滑雪者类classSkierClass(pygame.sprite.Sprite):def__init__(self):# 创建一个pygame Sprite类的子类 pygame.sprite.Sprite.__init__(self)# 初始化加载滑雪者向下滑的图片self.image = pygame.image.load('./ images/skier_fall.png')# 初始化获取图片的矩形大小self.rect = self.image.get_rect()# 指定滑雪者的中心位置self.rect.center = [320, 100]# 初始化默认标记滑雪者当前面对的方向(0:代表向下滑)self.angle = 0# 转弯defturn(self, direction):# 滑雪者当前的移动速度self.angle += direction# 用于将滑雪者的移动方式固定到这3个方式当中ifself.angle < -2:self.angle = -2ifself.angle > 2:self.angle = 2#获取人的位置 center = self.rect.center# 加载滑雪者此时应有的图片self.image = pygame.image.load(skier_images[self.angle])#初始化图形,注意这里改变了位置self.rect = self.image.get_rect()#重新定位到人的位置self.rect.center = center# # # 滑雪者左右移动defmove(self, speed):# 更改滑雪者所在的横向位置self.rect.centerx += speed# 滑雪者所在位置不应该超过的最大最小值ifself.rect.centerx < 20:self.rect.centerx = 20ifself.rect.centerx > 620:self.rect.centerx = 620# 初始化游戏pygame.init()# 游戏窗口screen = pygame.display.set_mode((640, 640)) # 宽:640,高:640# 窗口标题pygame.display.set_caption('滑雪大冒险')# 创建滑雪者类的实例对象skier = SkierClass()# 设置移动的x轴距离speed = 0#设置时钟clock = pygame.time.Clock()#循环whileTrue: clock.tick(30) #每秒钟执行30次# 监听所有事件for event in pygame.event.get():# 点击?号关闭,退出游戏if event.type == pygame.QUIT:#游戏退出 pygame.quit()if event.type == pygame.KEYDOWN:# 如果点击左键则向左转if event.key == pygame.K_LEFT: skier.turn(-1) speed = -1# 如果点击右键则向右转elif event.key == pygame.K_RIGHT: skier.turn(1) speed = 1# 滑雪者移动 skier.move(speed)# 白色背景 screen.fill([255, 255, 255])# 绘制滑雪者 screen.blit(skier.image,skier.rect)# 刷新屏幕 pygame.display.flip()
2.第二节课
# -*-coding:GBK -*-# 导入pygameimport pygame# 导入时间库import time# 导入随机库import random# 滑雪者方向不同对应不同的图片skier_images = ['./ images/skier_forward.png',"./ images/skier_right1.png","./ images/skier_right2.png","./ images/skier_left2.png","./ images/skier_left1.png"]# 滑雪者类classSkierClass(pygame.sprite.Sprite):def__init__(self):# 创建一个pygame Sprite类的子类 pygame.sprite.Sprite.__init__(self)# 初始化加载滑雪者向下滑的图片self.image = pygame.image.load('./ images/skier_fall.png')# 初始化获取图片的矩形大小self.rect = self.image.get_rect()# 指定滑雪者的中心位置self.rect.center = [320, 100]# 初始化默认标记滑雪者当前面对的方向(0:代表向下滑)self.angle = 0# 转弯defturn(self, direction):# 滑雪者当前的移动速度self.angle += direction# 用于将滑雪者的移动方式固定到这3个方式当中ifself.angle < -2:self.angle = -2ifself.angle > 2:self.angle = 2#获取人的位置 center = self.rect.center# 加载滑雪者此时应有的图片self.image = pygame.image.load(skier_images[self.angle])#初始化图形,注意这里改变了位置self.rect = self.image.get_rect()#重新定位到人的位置self.rect.center = center# # # 滑雪者左右移动defmove(self, speed):# 更改滑雪者所在的横向位置self.rect.centerx += speed# 滑雪者所在位置不应该超过的最大最小值ifself.rect.centerx < 20:self.rect.centerx = 20ifself.rect.centerx > 620:self.rect.centerx = 620# 树类classTreeClass(pygame.sprite.Sprite):def__init__(self, location): pygame.sprite.Sprite.__init__(self)# 加载树的图片self.image = pygame.image.load('./ images/tree.png')# 初始化树的位置self.location = location# 获取图片大小self.rect = self.image.get_rect()# 指定图片中心位置self.rect.center = location# 移动defupdate(self):global speedyself.rect.centery -=speedy# 判断树是否移除屏幕ifself.rect.centery < -32:self.kill()# 旗子类classFlagClass(pygame.sprite.Sprite):def__init__(self, location): pygame.sprite.Sprite.__init__(self)# 加载旗子的图片self.image = pygame.image.load('./ images/flag.png')# 初始化位置self.location = location# 获取图片大小self.rect = self.image.get_rect()# 指定图片中心位置self.rect.center = location# 移动defupdate(self):global speedyself.rect.centery -=speedy# 判断树是否移除屏幕ifself.rect.centery < -32:self.kill()# 创建一个窗口,生成随机的树和小旗defcreate_map():global obstacles # 全局变量声明 locations = []for i inrange(30): # 每屏30个障碍物 row = random.randint(0, 9) # 获得随机数在 start-end之间 col = random.randint(0, 9) location = [row * 64 + 32, col * 64 + 32 + 640] # 确定障碍物所在位置(x,y)ifnot (location in locations): # 确保没有将两个障碍物放在同一个位置 locations.append(location)# 将树添加到游戏 obstacle_tree = TreeClass(location)# 将旗子添加到游戏 obstacle_flag = FlagClass(location)# 将树或者旗子随机放入 obstacles.add(random.choice([obstacle_tree,obstacle_flag]))# 初始化游戏pygame.init()# 游戏窗口screen = pygame.display.set_mode((640, 640)) # 宽:640,高:640# 窗口标题pygame.display.set_caption('滑雪大冒险')# 创建滑雪者类的实例对象skier = SkierClass()# 设置移动的x轴距离speed = 0#设置时钟clock = pygame.time.Clock()# 创建独立运动的组织obstacles = pygame.sprite.Group()# 调用函数,生成树和旗子create_map()# 设置移动的x轴距离speedy = 6# 创建一个记录树和旗子移动到哪里的变量map_position = 0#循环whileTrue:# time.sleep(0.03) map_position += speedyif map_position >=640: create_map() map_position = 0 clock.tick(30) #每秒钟执行30次# 监听所有事件for event in pygame.event.get():# 点击?号关闭,退出游戏if event.type == pygame.QUIT:#游戏退出 pygame.quit()if event.type == pygame.KEYDOWN:# 如果点击左键则向左转if event.key == pygame.K_LEFT: skier.turn(-1) speed = -1# 如果点击右键则向右转elif event.key == pygame.K_RIGHT: skier.turn(1) speed = 1# 滑雪者移动 skier.move(speed)# 白色背景 screen.fill([255, 255, 255])# 把树和旗子绘制到窗口 obstacles.draw(screen)# 屏幕更新显示 obstacles.update()# 绘制滑雪者 screen.blit(skier.image,skier.rect)# 刷新屏幕 pygame.display.flip()
3.第三节课
# -*-coding:GBK -*-# 导入pygameimport pygame# 导入时间库import time# 导入随机库import random# 滑雪者方向不同对应不同的图片skier_images = ['./ images/skier_forward.png',"./ images/skier_right1.png","./ images/skier_right2.png","./ images/skier_left2.png","./ images/skier_left1.png"]# 滑雪者类classSkierClass(pygame.sprite.Sprite):def__init__(self):# 创建一个pygame Sprite类的子类 pygame.sprite.Sprite.__init__(self)# 初始化加载滑雪者向下滑的图片self.image = pygame.image.load('./ images/skier_fall.png')# 初始化获取图片的矩形大小self.rect = self.image.get_rect()# 指定滑雪者的中心位置self.rect.center = [320, 100]# 初始化默认标记滑雪者当前面对的方向(0:代表向下滑)self.angle = 0# 转弯defturn(self, direction):# 滑雪者当前的移动速度self.angle += direction# 用于将滑雪者的移动方式固定到这3个方式当中ifself.angle < -2:self.angle = -2ifself.angle > 2:self.angle = 2#获取人的位置 center = self.rect.center# 加载滑雪者此时应有的图片self.image = pygame.image.load(skier_images[self.angle])#初始化图形,注意这里改变了位置self.rect = self.image.get_rect()#重新定位到人的位置self.rect.center = center# 滑雪者左右移动defmove(self, speed):# 更改滑雪者所在的横向位置self.rect.centerx += speed# 滑雪者所在位置不应该超过的最大最小值ifself.rect.centerx < 20:self.rect.centerx = 20ifself.rect.centerx > 620:self.rect.centerx = 620# 树类classTreeClass(pygame.sprite.Sprite):def__init__(self, location): pygame.sprite.Sprite.__init__(self)# 加载树的图片self.image = pygame.image.load('./ images/tree.png')# 初始化树的位置self.location = location# 获取图片大小self.rect = self.image.get_rect()# 指定图片中心位置self.rect.center = locationself.type = 'tree'# 移动defupdate(self):global speedyself.rect.centery -=speedy# 判断树是否移除屏幕ifself.rect.centery < -32:self.kill()# 旗子类classFlagClass(pygame.sprite.Sprite):def__init__(self, location): pygame.sprite.Sprite.__init__(self)# 加载旗子的图片self.image = pygame.image.load('./ images/flag.png')# 初始化位置self.location = location# 获取图片大小self.rect = self.image.get_rect()# 指定图片中心位置self.rect.center = locationself.type = 'flag'# 移动defupdate(self):global speedyself.rect.centery -=speedy# 判断树是否移除屏幕ifself.rect.centery < -32:self.kill()# 创建一个窗口,生成随机的树和小旗defcreate_map():global obstacles # 全局变量声明 locations = []for i inrange(30): # 每屏30个障碍物 row = random.randint(0, 9) # 获得随机数在 start-end之间 col = random.randint(0, 9) location = [row * 64 + 32, col * 64 + 32 + 640] # 确定障碍物所在位置(x,y)ifnot (location in locations): # 确保没有将两个障碍物放在同一个位置 locations.append(location)# 将树添加到游戏 obstacle_tree = TreeClass(location)# 将旗子添加到游戏 obstacle_flag = FlagClass(location)# 将树或者旗子随机放入 obstacles.add(random.choice([obstacle_tree,obstacle_flag]))# 更新游戏页面defupdateGame(): skier.move(speed) # 滑雪者移动# 指定背景颜色为白色 screen.fill([255, 255, 255]) obstacles.draw(screen) # 绘制障碍物在窗口中 obstacles.update() # 屏幕更新显示# 绘制图 screen.blit(skier.image, skier.rect)# 屏幕更新显示 pygame.display.update()# 初始化游戏pygame.init()# 初始化音频pygame.mixer.init()pygame.mixer.music.load("./music/bg_music.mp3") # 加载音乐pygame.mixer.music.set_volume(0.4) # 音量设置为0.4pygame.mixer.music.play(-1) # 无线循环播放# 游戏窗口screen = pygame.display.set_mode((640, 640)) # 宽:640,高:640# 窗口标题pygame.display.set_caption('滑雪大冒险')# 创建滑雪者类的实例对象skier = SkierClass()# 设置移动的x轴距离speed = 0#设置时钟clock = pygame.time.Clock()# 创建独立运动的组织obstacles = pygame.sprite.Group()# 调用函数,生成树和旗子create_map()# 设置移动的x轴距离speedy = 6# 创建一个记录树和旗子移动到哪里的变量map_position = 0# 创建分数变量scorescore = 0# 创建一个font对象,控制字体大小font = pygame.font.Font(None, 50)#循环whileTrue:# time.sleep(0.03) map_position += speedyif map_position >=640: create_map() map_position = 0 clock.tick(30) #每秒钟执行30次# 监听所有事件for event in pygame.event.get():# 点击?号关闭,退出游戏if event.type == pygame.QUIT:#游戏退出 pygame.quit()if event.type == pygame.KEYDOWN:# 如果点击左键则向左转if event.key == pygame.K_LEFT: skier.turn(-1) speed = -1# 如果点击右键则向右转elif event.key == pygame.K_RIGHT: skier.turn(1) speed = 1# 碰撞检测 hit = pygame.sprite.spritecollide(skier, obstacles, False)if hit:# 如果碰到树if hit[0].type == 'tree': score -=50# 将树隐藏 hit[0].kill()# 显示碰撞的图片 skier.image = pygame.image.load("./ images/skier_fall.png") updateGame()# 摔倒后暂停一会重新再站起来 time.sleep(1) skier.image = pygame.image.load('./ images/skier_forward.png') skier.angle = 0 speed = 0elif hit[0].type == 'flag': score += 10 hit[0].kill() updateGame()# 滑雪者移动 skier.move(speed)# 白色背景 screen.fill([255, 255, 255])# 把树和旗子绘制到窗口 obstacles.draw(screen)# 屏幕更新显示 obstacles.update()# 绘制滑雪者 screen.blit(skier.image,skier.rect)# 显示得分 score_text = font.render("Score: " + str(score), 1, (0, 0, 0))# 将分数绘制在指定位置 screen.blit(score_text, [10, 10])# 刷新屏幕 pygame.display.flip()