python实现吃苹果小游戏


Posted in Python onMarch 21, 2020

本文实例为大家分享了python实现吃苹果小游戏的具体代码,供大家参考,具体内容如下

1.公共类模块

import pygame
from pygame.rect import Rect
 
 
def print_text(font, x, y, text, color=(255, 255, 255)):
 imgText=font.render(text, True, color)
 screen=pygame.display.get_surface()
 screen.blit(imgText,(x, y))
 
class MySprite(pygame.sprite.Sprite):
 def __init__(self):
  pygame.sprite.Sprite.__init__(self)
  self.master_image=None
  self.frame = 0
  self.old_frame = -1
  self.frame_width = 1
  self.frame_height = 1
  self.first_frame = 0
  self.last_frame = 0
  self.columns = 0
  self.last_time = 1
  self.direction = 0
  self.velocity = 0
 
 def _getx(self): return self.rect.x
 def _gety(self): return self.rect.y
 
 def _setx(self, value): self.rect.x = value
 def _sety(self, value): self.rect.y = value
 """
 描述
 property() 函数的作用是在新式类中返回属性值。
 
 语法
 以下是 property() 方法的语法:
 
 class property([fget[, fset[, fdel[, doc]]]])
 参数
 fget -- 获取属性值的函数
 fset -- 设置属性值的函数
 fdel -- 删除属性值函数
 doc -- 属性描述信息
 返回值
 返回新式类属性。
 """
 X = property(_getx, _setx)
 Y = property(_gety, _sety)
 
 #位置属性
 def _getpos(self): return self.rect.topleft
 def _setpos(self, pos): self.rect.topleft = pos
 position = property(_getpos, _setpos)
 
 def load(self, filename, width, height, columns):
  self.master_image=pygame.image.load(filename).convert_alpha()
  self.frame_height = height
  self.frame_width = width
  self.rect = Rect(0, 0, width, height)
  self.columns = columns
 
  rect = self.master_image.get_rect()
  self.last_frame = (rect.width//width)*(rect.height//height) - 1
 
 def update(self, current_time, rate=30):
  #跟新动画帧
  if current_time > self.last_time + rate:
   self.frame += 1
   if self.frame > self.last_frame:
    self.frame = self.first_frame
   self.last_time = current_time
  #仅当更改时才创建帧
  if self.frame != self.old_frame:
   frame_x = (self.frame % self.columns) * self.frame_width
   frame_y = (self.frame // self.columns) * self.frame_height
   rect=Rect(frame_x, frame_y, self.frame_width, self.frame_height)
   self.image = self.master_image.subsurface(rect)
   self.old_frame = self.frame
class Point(object):
 def __init__(self, x, y):
  self.x = x
  self.y = y
 def getx(self): return self.x
 def gety(self): return self.y
 def setx(self,value): self.x=value
 def sety(self,value): self.y=value
 
 x=property(getx,setx)
 y=property(gety,sety)
 
 def __str__(self):
  return 'x:'+"{:.0f}".format(self.x) + 'y:'+"{:.0f}".format(self.y)

2.首先生成随机苹果,然后监听键盘移动,播放动画。精灵和苹果碰撞检测,检测是吃掉苹果

import pygame
from pygame.rect import Rect
 
from . import MyLibrary
import random
import sys
 
 
def calc_velocity(direction, vel=1.0):
 velocity = MyLibrary.Point(0, 0)
 if direction == 0:#上
  velocity.y = -vel
 elif direction == 2:#右
  velocity.x = vel
 elif direction == 4:#下
  velocity.y == vel
 elif direction == 6:#左
  velocity.x == -vel
 return velocity
 
pygame.init()
screen = pygame.display.set_mode(800,600)
font=pygame.font.Font(None, 36)
timer=pygame.time.Clock()
 
#创建精灵组
player_group=pygame.sprite.Group()
food_group=pygame.sprite.Group()
 
#初始化玩家精灵组
player=MyLibrary.MySprite()
player.load('farmer.png',96,96,8)############-----------------图片
player.position=80, 80
player.direction= 4
player_group.add(player)
 
#初始化food精灵组
for n in range(1, 50):
 food= MyLibrary.MySprite()
 food.load('food.png',35,35,1) #################-----------食物图片
 food.position=random.randint(0, 780), random.randint(0, 580)
 food_group.add(food)
 
game_over= False
player_moving = False
plyer_health = False
 
while True:
 timer.tick(30)
 ticks = pygame.time.get_ticks()
 
 for event in pygame.event.get():
  if event.type == pygame.QUIT:
   pygame.quit()
   sys.exit()
 keys = pygame.key.get_pressed()
 if keys[pygame.key.K_UP]:
  player.direction=0
  player_moving = True
 elif keys[pygame.key.k_DOWN]:
  player_moving = True
  player.direction=4
 elif keys[pygame.key.K_RIGHT]:
  player.direction = 2
  player_moving = True
 elif keys[pygame.key.K_LEFT]:
  player.direction = 6
  player_moving = True
 else:
  player_moving = False
 
 if not game_over:
  # 根据不同的方向,角色移动不同的动画帧
  player.first_frame = player.direction*player.columns
  player.last_time = player.first_frame + player.columns -1
  if player.frame < player.first_frame:
   player.frame = player.first_frame
 
  if not player_moving:
   #停止更新动画帧
   player.frame = player.first_frame=player.last_frame
  else:
   player.velocity = calc_velocity(player.direction,1.5)
   player.velocity.x*=1.5
   player.velocity.y*=1.5
 
  #跟新玩家精灵组
  player_group.update(ticks,50)
 
  #移动玩家
  if player_moving:
   player.X += player.velocity.x
   player.Y += player.velocity.y
   if player.X < 0: player.X = 0
   elif player.X >700: player.X =700
   if player.Y < 0: player.Y = 0
   elif player.Y >500:player.Y =500
 
  #检测玩家是否与食物冲突,是否吃到苹果
  attacker = None
  attacker = pygame.sprite.spritecollideany(player,food_group)
  if attacker != None:
   if pygame.sprite.collide_circle_ratio(0.65)(player,food_group):
    plyer_health += 2
    food_group.remove(attacker)
  if plyer_health > 100:
   plyer_health=100
   #跟新食物精灵组
   food_group.update(ticks, 50)
   if food_group.__len__() == 0:
    game_over = True
 
  screen.fill((50,50,100))
  food_group.draw(screen)
  player_group.draw(screen)
 
  pygame.draw.rect(screen,(510,150,50,180),Rect(300,570,plyer_health*2,25))
  pygame.draw.rect(screen, (100, 200, 100, 180), Rect(300, 570, 200, 2))
 
  if game_over:
   MyLibrary.print_text(font, 300, 100,'Game Over!')
  pygame.display.update()

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

Python 相关文章推荐
python使用range函数计算一组数和的方法
May 07 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
Python编程求质数实例代码
Jan 31 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 Python
利用Python将文本中的中英文分离方法
Oct 31 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 Python
Pycharm中配置远程Docker运行环境的教程图解
Jun 11 Python
Python创建文件夹与文件的快捷方法
Dec 08 Python
python实现贪吃蛇游戏源码
Mar 21 #Python
python实现微信打飞机游戏
Mar 24 #Python
Python类的动态绑定实现原理
Mar 21 #Python
Python类和实例的属性机制原理详解
Mar 21 #Python
Python生成器常见问题及解决方案
Mar 21 #Python
Python作用域与名字空间原理详解
Mar 21 #Python
Python小整数对象池和字符串intern实例解析
Mar 21 #Python
You might like
thinkphp缓存技术详解
2014/12/09 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
python搭建简易服务器分析与实现
2012/12/15 Python
python实现RSA加密(解密)算法
2016/02/17 Python
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
python序列化与数据持久化实例详解
2019/12/20 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
大二法学专业职业生涯规划范文
2014/02/12 职场文书
实习指导老师评语
2014/04/26 职场文书
优秀应届毕业生自荐书
2014/06/29 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
正规借条模板
2015/05/26 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python