学会用Python实现滑雪小游戏,再也不用去北海道啦

作者:程序猿中的BUG 时间:2023-07-05 03:25:11 

一、效果图

学会用Python实现滑雪小游戏,再也不用去北海道啦

二、必要工具

Python3.7

pycharm2019

再然后配置它的文件,设置游戏屏幕的大小,图片路径。

代码如下


'''配置文件'''
import os

'''FPS'''
FPS = 40
'''游戏屏幕大小'''
SCREENSIZE = (640, 640)
'''图片路径'''
SKIER_IMAGE_PATHS = [
   os.path.join(os.getcwd(), 'resources/images/skier_forward.png'),
   os.path.join(os.getcwd(), 'resources/images/skier_right1.png'),
   os.path.join(os.getcwd(), 'resources/images/skier_right2.png'),
   os.path.join(os.getcwd(), 'resources/images/skier_left2.png'),
   os.path.join(os.getcwd(), 'resources/images/skier_left1.png'),
   os.path.join(os.getcwd(), 'resources/images/skier_fall.png')
]
OBSTACLE_PATHS = {
   'tree': os.path.join(os.getcwd(), 'resources/images/tree.png'),
   'flag': os.path.join(os.getcwd(), 'resources/images/flag.png')
}
'''背景音乐路径'''
BGMPATH = os.path.join(os.getcwd(), 'resources/music/bgm.mp3')
'''字体路径'''
FONTPATH = os.path.join(os.getcwd(), 'resources/font/FZSTK.TTF')

三、全部源码


'''滑雪者类'''
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)

来源:https://blog.csdn.net/A_7878520/article/details/116998963

标签:Python,滑雪,小游戏
0
投稿

猜你喜欢

  • 定义列表: DL DT DD

    2009-05-06 13:08:00
  • Matplotlib绘制雷达图和三维图的示例代码

    2022-09-04 03:31:33
  • Ubuntu 16.04/18.04 安装Pycharm及Ipython的教程

    2023-11-03 03:49:29
  • 关于Python Tkinter Button控件command传参问题的解决方式

    2021-08-18 23:10:09
  • Mysql更新自增主键id遇到的问题

    2024-01-17 23:56:02
  • [译文]The seven rules of Unobtrusive JavaScript

    2008-09-29 12:10:00
  • python网络编程学习笔记(五):socket的一些补充

    2022-02-03 23:22:48
  • python光学仿真学习wxpython创建手速测试程序

    2023-12-06 20:57:28
  • 谈非线性任务流程的窗口打开方式

    2008-08-28 12:47:00
  • 我的javascript小扎

    2008-08-12 13:04:00
  • python3爬虫获取html内容及各属性值的方法

    2021-08-23 02:37:33
  • MySQL数据库中表的操作详解

    2024-01-26 20:37:27
  • 浏览器 cookie 限制

    2008-05-23 13:09:00
  • Golang中Delve版本太低无法Debug的问题

    2024-04-25 15:18:05
  • MySQL开发规范与使用技巧总结

    2024-01-19 00:44:00
  • python算法题 链表反转详解

    2021-01-26 11:47:35
  • Python中顺序表的实现简单代码分享

    2022-08-31 22:26:36
  • Python内存映射文件读写方式

    2023-07-07 23:32:36
  • div+css实现圆角边框

    2007-10-21 08:55:00
  • 备战618!用Python脚本帮你实现淘宝秒杀

    2022-05-15 04:43:40
  • asp之家 网络编程 m.aspxhome.com