python实现滑雪者小游戏


Posted in Python onFebruary 22, 2020

引言

这是一个用pygame写的滑雪者的游戏。

skier从上向下滑,途中会遇到树和旗子,捡起一个旗子得10分,碰到一颗树扣100分,可以用左右箭头控制skier方向。

python实现滑雪者小游戏

安装pygame

pip install pygame

用pip或设置界面安装,可自行百度

以下是主界面代码,每一个类都是一个py文件,需要导包

import pygame
import random
from settings import Settings
from skier import Skier
from treeFlag import TreeFlagClass
# pygame.display.set_icon()
# background_image = pygame.image.load('timg.jpg').convert()#背景图
# 画图
# pygame.draw.circle(window,[0,0,0],[50,50],50,0)
my_set = Settings() # 用的是设置类 系统外观设置
skier_images = ['./skier_crash.png', './skier_down.png', './skier_left1.png', './skier_left2.png',
  './skier_right1.png', './skier_right2.png', ] #滑雪者的图

if __name__ == '__main__':
 # 初始化
 pygame.init()
 pygame.mixer.init()
 # 游戏窗口初始化
 window = pygame.display.set_mode((my_set.screen_width, my_set.screen_height)) # 窗口大小
 screen = pygame.display.get_surface()
 pygame.display.set_caption(my_set.name) # 窗口名字
 clock = pygame.time.Clock() # 帧率显示,先定义一个时间对象
 treeFlag_sprites = pygame.sprite.RenderUpdates() # 创建sprite容器 树
 # 添加树或旗子创建自定义事件
 AddEnemy = pygame.USEREVENT + 1
 pygame.time.set_timer(AddEnemy, 20)
 # 音乐
 # pygame.mixer.muisc.load('bg_music.mp3')
 skier = Skier(1) # 创建滑雪小人
 # 左上角计算分数
 # countObj = pygame.font.SysFont('方正兰亭超细黑简体',30)
 countObj = pygame.font.Font(None, 60)
 # countObj.set_bold(True) #加粗
 print(pygame.font.get_fonts())
 textObj = countObj.render('SCORE:0', True, (255, 0, 0))
 textRectObj = textObj.get_rect()
 # 这个是计算分数
 count_num = 0
 # 计算碰撞次数,10次场景加一次速度,最多叠加10次
 hit_count = 0
 # 显示当前速度
 speedObj = pygame.font.Font(None, 40)
 speed_text = speedObj.render('SPEED:1', True, (255, 0, 0))
 speedRectObj = speed_text.get_rect()
 speedRectObj.top = 60
 #运行游戏
 while True:
 # 先加载背景图
 clock.tick(60)
 window.fill(my_set.bg_color) # 填充,参数填写的是rgb值
 # window.blit(background_image,(0,0))
 ret = pygame.event.get() # 事件
 # 退出游戏判断
 for obj in ret:
  if obj.type == pygame.QUIT:
  print('关闭窗口')
  exit()
 # 获取键盘状态
 pressed_keys = pygame.key.get_pressed()
 #调用方法更新
 skier.update(pressed_keys)
 #判断事件,生成场景
 for event in pygame.event.get():
  if event.type == AddEnemy:
  if random.randint(1,10) %2:
   treeFlag_sprites.add(TreeFlagClass(1,1))
  else:
   treeFlag_sprites.add(TreeFlagClass(1,0))
 #判断与树或者旗子碰撞
 hit = pygame.sprite.spritecollide(skier, treeFlag_sprites, False)
 if hit:
  if hit[0].type == 'tree':
  count_num -= 100
  hit_count += 1
  hit[0].kill()
  skier.image = pygame.image.load(skier_images[0]).convert()
  # skier.image = pygame.image.load(skier_images[1]).convert()
  else:
  count_num += 10
  hit_count += 1
  hit[0].kill()
 #判断累计碰撞次数:
 if hit_count <50 and hit_count > 10:
  hit_num = hit_count//10
  for obj in treeFlag_sprites:
  obj.speed = hit_num
  skier.speed = hit_num
 elif hit_count >= 50:
  for obj in treeFlag_sprites:
  obj.speed = 5
  skier.speed = 5
 #场景动画更新
 treeFlag_sprites.update()
 tree_updates = treeFlag_sprites.draw(window)
 pygame.display.update(tree_updates)
 #添加画面以及帧率
 window.blit(skier.image, skier.rect) # 添加小人画面
 textObj = countObj.render('SCORE:%d' % count_num, False, (255, 0, 0)) #显示得分内容
 textRectObj = textObj.get_rect()
 window.blit(textObj, textRectObj) #这是得分
 speed_text = speedObj.render('SPEED:%d'%skier.speed, True, (255, 0, 0)) #显示速度内容
 speedRectObj = speed_text.get_rect()
 speedRectObj.top = 60
 window.blit(speed_text,speedRectObj) #显示速度
 pygame.display.update() # 必须要更新显示的内容

以下是滑雪者类代码

# 定义一个雪人类
import pygame
from settings import Settings

my_set = Settings()
skier_images = ['./skier_crash.png', './skier_down.png', './skier_left1.png', './skier_left2.png',
  './skier_right1.png', './skier_right2.png', ]
down_image = pygame.image.load(skier_images[1])
# 雪人初始位置
begin_top = 0
begin_left = my_set.screen_width / 2 - down_image.get_width() / 2

class Skier(pygame.sprite.Sprite):
 def __init__(self,speed):
 pygame.sprite.Sprite.__init__(self)
 '''
 :param image:指的是图片路径
 :param rect:位置
 :param down_speed:是往下的速度
 '''
 self.image = pygame.image.load(skier_images[1])
 self.rect = self.image.get_rect()
 self.rect.top = begin_top # 雪人初始位置
 self.rect.left = begin_left
 # 移动速度
 self.speed = speed
 #场景生成时间 也就是速度
 self.time_set = 40
 #根据按键事件来移动
 def update(self, pressed_keys):
 # 按键事件
 if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
  if self.rect.left > 0:
  self.image = pygame.image.load(skier_images[2]).convert()
  self.rect.left -= self.speed
 elif pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
  if self.rect.left < my_set.screen_width - self.image.get_width():
  self.image = pygame.image.load(skier_images[4]).convert()
  self.rect.left += self.speed
 if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
  if self.rect.top > 0 :
  self.image = pygame.image.load(skier_images[1]).convert()
  self.rect.top -= self.speed
 elif pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
  if self.rect.top < my_set.screen_height - self.image.get_height():
  self.image = pygame.image.load(skier_images[1]).convert()
  self.rect.top += self.speed
 if not (pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a] or pressed_keys[pygame.K_RIGHT] or
  pressed_keys[pygame.K_d] or pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w] or
  pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]):
  self.image = pygame.image.load(skier_images[1]).convert()

树和旗子类

import pygame
from random import randrange
from settings import Settings

my_set = Settings()
# 定义一个场景类
class TreeFlagClass(pygame.sprite.Sprite):

 def __init__(self,speed,treeFlag): #传入两个参数,初始速度和bool值树或旗子
 pygame.sprite.Sprite.__init__(self) #父类的初始化方法要调用
 '''
 :param image =图片
 :param type 判断是树还是旗子
 :param speed 速度
 '''
 if treeFlag:
  self.image = pygame.image.load('./skier_tree.png')
  self.type = 'tree'
 else:
  self.image = pygame.image.load('./skier_flag.png')
  self.type = 'flag'
 self.rect = self.image.get_rect()
 self.rect.top = self.rect.height + my_set.screen_height
 self.rect.centerx = randrange(my_set.screen_width - self.rect.width) + self.rect.width / 2
 self.speed = speed

 def update(self, *args):
 self.rect.top -= self.speed
 if self.rect.top < -self.rect.height:
  self.kill()

设置类

class Settings(object):
 def __init__(self):
 #这是一个设置类,用来管理游戏的外观
 self.screen_width = 600
 self.screen_height = 800
 self.bg_color = [255,255,255]
 self.name = 'skier'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 实现堆排序算法代码
Jun 05 Python
用Django写天气预报查询网站
Oct 21 Python
Python3爬虫学习入门教程
Dec 11 Python
Pycharm 设置默认头的图文教程
Jan 17 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
利用python实现PSO算法优化二元函数
Nov 13 Python
np.dot()函数的用法详解
Jan 17 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
详解pytorch tensor和ndarray转换相关总结
Sep 03 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 Python
浅析Python OpenCV三种滤镜效果
Apr 11 Python
python实现拼图小游戏
Feb 22 #Python
Python双链表原理与实现方法详解
Feb 22 #Python
Python单链表原理与实现方法详解
Feb 22 #Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 #Python
python通过文本在一个图中画多条线的实例
Feb 21 #Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 #Python
python-sys.stdout作为默认函数参数的实现
Feb 21 #Python
You might like
如何利用PHP执行.SQL文件
2013/07/05 PHP
分享php分页的功能模块
2015/06/16 PHP
PHP发送短信代码分享
2015/08/11 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
php DES加密算法实例分析
2019/09/18 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
python实现加密的方式总结
2020/01/19 Python
python with (as)语句实例详解
2020/02/04 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
最新远光软件笔试题面试题内容
2013/11/08 面试题
电子商务网站的创业计划书
2014/01/05 职场文书
装修致歉信
2014/01/15 职场文书
敬老模范事迹
2014/05/21 职场文书
个人职业及收入证明
2014/10/13 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript
TV动画《间谍过家家》公开PV
2022/03/20 日漫