Python实现滑雪小游戏

作者:红目香薰 时间:2023-08-10 15:30:03 

本文实例为大家分享了Python实现滑雪小游戏的具体代码,供大家参考,具体内容如下

Python实现滑雪小游戏

源码分享:


import sys
import cfg
import pygame
import random

'''滑雪者类'''
class SkierClass(pygame.sprite.Sprite):
   def __init__(self):
       pygame.sprite.Sprite.__init__(self)
       # 滑雪者的朝向(-2到2)
       self.direction = 0
       self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
       self.image = pygame.image.load(self.imagepaths[self.direction])
       self.rect = self.image.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.image = pygame.image.load(self.imagepaths[self.direction])
       self.rect = self.image.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)
   '''设置为摔倒状态'''
   def setFall(self):
       self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
   '''设置为站立状态'''
   def setForward(self):
       self.direction = 0
       self.image = pygame.image.load(self.imagepaths[self.direction])

'''
Function:
   障碍物类
Input:
   img_path: 障碍物图片路径
   location: 障碍物位置
   attribute: 障碍物类别属性
'''
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 createObstacles(s, e, num=10):
   obstacles = pygame.sprite.Group()
   locations = []
   for i in range(num):
       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(list(cfg.OBSTACLE_PATHS.keys()))
           img_path = cfg.OBSTACLE_PATHS[attribute]
           obstacle = ObstacleClass(img_path, location, attribute)
           obstacles.add(obstacle)
   return obstacles

'''合并障碍物'''
def AddObstacles(obstacles0, obstacles1):
   obstacles = pygame.sprite.Group()
   for obstacle in obstacles0:
       obstacles.add(obstacle)
   for obstacle in obstacles1:
       obstacles.add(obstacle)
   return obstacles

'''显示游戏开始界面'''
def ShowStartInterface(screen, screensize):
   screen.fill((255, 255, 255))
   tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
   cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
   title = tfont.render(u'滑雪游戏', True, (255, 0, 0))
   content = cfont.render(u'按任意键开始游戏', True, (0, 0, 255))
   trect = title.get_rect()
   trect.midtop = (screensize[0]/2, screensize[1]/5)
   crect = content.get_rect()
   crect.midtop = (screensize[0]/2, screensize[1]/2)
   screen.blit(title, trect)
   screen.blit(content, crect)
   while True:
       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               pygame.quit()
               sys.exit()
           elif event.type == pygame.KEYDOWN:
               return
       pygame.display.update()

'''显示分数'''
def showScore(screen, score, pos=(10, 10)):
   font = pygame.font.Font(cfg.FONTPATH, 30)
   score_text = font.render("Score: %s" % score, True, (0, 0, 0))
   screen.blit(score_text, pos)

'''更新当前帧的游戏画面'''
def updateFrame(screen, obstacles, skier, score):
   screen.fill((255, 255, 255))
   obstacles.draw(screen)
   screen.blit(skier.image, skier.rect)
   showScore(screen, score)
   pygame.display.update()

'''主程序'''
def main():
   # 游戏初始化
   pygame.init()
   pygame.mixer.init()
   pygame.mixer.music.load(cfg.BGMPATH)
   pygame.mixer.music.set_volume(0.4)
   pygame.mixer.music.play(-1)
   # 设置屏幕
   screen = pygame.display.set_mode(cfg.SCREENSIZE)
   pygame.display.set_caption('滑雪游戏 —— 九歌')
   # 游戏开始界面
   ShowStartInterface(screen, cfg.SCREENSIZE)
   # 实例化游戏精灵
   # --滑雪者
   skier = SkierClass()
   # --创建障碍物
   obstacles0 = createObstacles(20, 29)
   obstacles1 = createObstacles(10, 19)
   obstaclesflag = 0
   obstacles = AddObstacles(obstacles0, obstacles1)
   # 游戏clock
   clock = pygame.time.Clock()
   # 记录滑雪的距离
   distance = 0
   # 记录当前的分数
   score = 0
   # 记录当前的速度
   speed = [0, 6]
   # 游戏主循环
   while True:
       # --事件捕获
       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               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 and obstaclesflag == 0:
           obstaclesflag = 1
           obstacles0 = createObstacles(20, 29)
           obstacles = AddObstacles(obstacles0, obstacles1)
       if distance >= 1280 and obstaclesflag == 1:
           obstaclesflag = 0
           distance -= 1280
           for obstacle in obstacles0:
               obstacle.location[1] = obstacle.location[1] - 1280
           obstacles1 = createObstacles(10, 19)
           obstacles = AddObstacles(obstacles0, obstacles1)
       for obstacle in obstacles:
           obstacle.move(distance)
       # --碰撞检测
       hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
       if hitted_obstacles:
           if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:
               score -= 50
               skier.setFall()
               updateFrame(screen, obstacles, skier, score)
               pygame.time.delay(1000)
               skier.setForward()
               speed = [0, 6]
               hitted_obstacles[0].passed = True
           elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:
               score += 10
               obstacles.remove(hitted_obstacles[0])
       # --更新屏幕
       updateFrame(screen, obstacles, skier, score)
       clock.tick(cfg.FPS)

'''run'''
if __name__ == '__main__':
   main();

来源:https://laoshifu.blog.csdn.net/article/details/120425190

标签:Python,滑雪
0
投稿

猜你喜欢

  • 树莓派使用python-librtmp实现rtmp推流h264的方法

    2021-10-24 13:50:15
  • Python数据可视化编程通过Matplotlib创建散点图代码示例

    2022-01-04 17:23:34
  • asp如何制作一个简单的翻页程序?

    2010-06-29 21:26:00
  • Python编程之变量赋值操作实例分析

    2021-09-20 12:12:01
  • python爬取亚马逊书籍信息代码分享

    2021-03-25 09:38:14
  • python实现文本界面网络聊天室

    2022-04-13 19:43:54
  • 使用实例管理器轻松管理多个MySQL实例

    2009-03-25 17:07:00
  • python学习之读取配置文件

    2021-05-11 11:42:20
  • AlternatingItemTemplate类似于 ItemTemplate 元素

    2023-07-14 13:09:07
  • Python第三方包PrettyTable安装及用法解析

    2023-02-22 03:19:16
  • 使用numpy.mean() 计算矩阵均值方式

    2021-12-17 03:55:53
  • 做了CDN加速的ASP网站获取用户真实IP程序

    2011-02-16 10:59:00
  • 深入认识javascript中的eval函数

    2008-08-03 16:44:00
  • python图形开发GUI库pyqt5的基本使用方法详解

    2022-07-08 02:31:55
  • MySQL 数据库存储和分支

    2011-03-11 19:01:00
  • 5个很好的Python面试题问题答案及分析

    2023-05-12 18:45:23
  • Python+Pygame实战之24点游戏的实现

    2023-11-07 21:14:12
  • js中关于Blob对象的介绍与使用

    2024-04-18 09:49:00
  • Chrome插件开发系列一:弹窗终结者开发实战

    2024-04-29 13:42:04
  • vue el-upload上传文件的示例代码

    2024-05-11 09:13:47
  • asp之家 网络编程 m.aspxhome.com