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基于pygame实现的弹力球效果(附源码)
Nov 11 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
Jun 27 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
对python:threading.Thread类的使用方法详解
Jan 31 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 Python
python实现智能语音天气预报
Dec 02 Python
Python实现屏幕录制功能的代码
Mar 02 Python
Python打印不合法的文件名
Jul 31 Python
python中pivot()函数基础知识点
Jan 03 Python
OpenCV-Python实现人脸美白算法的实例
Jun 11 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仿盗链代码
2012/06/03 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
另一个javascript小测验(代码集合)
2011/07/27 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
jquery创建一个ajax关键词数据搜索实现思路
2013/02/26 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
很酷的星级评分系统原生JS实现
2016/08/25 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
全面解析vue中的数据双向绑定
2017/05/10 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
微信小程序动态添加分享数据
2017/06/14 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python内置的字符串处理函数整理
2013/01/29 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
Python中join函数简单代码示例
2018/01/09 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL