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发送邮件接收邮件示例分享
Jan 21 Python
跟老齐学Python之传说中的函数编写条规
Oct 11 Python
让Python代码更快运行的5种方法
Jun 21 Python
Sanic框架路由用法实例分析
Jul 16 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
关于Keras模型可视化教程及关键问题的解决
Jan 24 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
django 数据库返回queryset实现封装为字典
May 19 Python
Python中SQLite如何使用
May 27 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
php xml-rpc远程调用
2008/12/19 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
2010/10/12 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
js Dialog 实践分享
2012/10/22 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
PyMongo安装使用笔记
2015/04/27 Python
Python闭包实现计数器的方法
2015/05/05 Python
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
Python计算字符宽度的方法
2016/06/14 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
flask项目集成swagger的方法
2020/12/09 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
药品促销活动方案
2014/02/14 职场文书
课前三分钟演讲稿
2014/04/24 职场文书
艾滋病宣传标语
2014/06/25 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python