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中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
Python线程指南详细介绍
Jan 05 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
BP神经网络原理及Python实现代码
Dec 18 Python
20行python代码的入门级小游戏的详解
May 05 Python
在python中用url_for构造URL的方法
Jul 25 Python
TensorFlow:将ckpt文件固化成pb文件教程
Feb 11 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
Python在线和离线安装第三方库的方法
Oct 31 Python
Python对excel的基本操作方法
Feb 18 Python
pytorch 实现变分自动编码器的操作
May 24 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类
2006/07/15 PHP
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
php 判断数组是几维数组
2013/03/20 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
2020/08/06 PHP
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
python实现神经网络感知器算法
2017/12/20 Python
python读取几个G的csv文件方法
2019/01/07 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
德国家具在线:Fashion For Home
2017/03/11 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
小学班长竞选演讲稿
2014/04/24 职场文书
应届生自荐书
2014/06/23 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
万里长城导游词
2015/01/30 职场文书