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编程过程中用单元测试法调试代码的介绍
Apr 02 Python
python实现linux下抓包并存库功能
Jul 18 Python
Python实现常见的回文字符串算法
Nov 14 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
python socket 聊天室实例代码详解
Nov 14 Python
pytorch之ImageFolder使用详解
Jan 06 Python
如何把外网python虚拟环境迁移到内网
May 18 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
Jun 22 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
通过实例了解python__slots__使用方法
Sep 14 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 表单提交给自己
2008/07/24 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
JS跨域总结
2012/08/30 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
Bootstrap每天必学之js插件
2015/11/30 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
Django的信号机制详解
2017/05/05 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
装饰资料员岗位职责
2013/12/30 职场文书
信访工作者先进事迹
2014/01/17 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
团结主题班会
2015/08/13 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python