当前位置:首页>python>Python游戏开发实战项目---“滑雪大冒险”

Python游戏开发实战项目---“滑雪大冒险”

  • 2026-10-21 13:28:56
Python游戏开发实战项目---“滑雪大冒险”
上篇文章: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()

最新文章

随机文章