基于Python-Pycharm实现的猴子摘桃小游戏(源代码)


Posted in Python onFebruary 20, 2021

源码及注释:

import pygame
from sys import exit
from random import randint
import time
import os

# 定义窗口分辨率
SCREEN_WIDTH = 700
SCREEN_HEIGHT = 600

current_path = os.path.abspath(os.path.dirname(__file__))
root_path = current_path[:current_path.find("monkey-picking-peach\\") + len("monkey-picking-peach\\")] \
   + "resource\\images\\"
# 图片
BACKGROUND_IMAGE_PATH = root_path + "background.jpg"
MONKEY_IMAGE_PATH = root_path + "monkey.png"
APPLE_IMAGE_PATH = root_path + "apple.png"
JUMP_STATUS = False
OVER_FLAG = False
START_TIME = None
offset = {pygame.K_LEFT: 0, pygame.K_RIGHT: 0, pygame.K_UP: 0, pygame.K_DOWN: 0}

# 定义画面帧率
FRAME_RATE = 60

# 定义动画周期(帧数)
ANIMATE_CYCLE = 30

ticks = 0
clock = pygame.time.Clock()


# 猴子类
class Monkey(pygame.sprite.Sprite):
 # 苹果的数量
 apple_num = 0

 def __init__(self, mon_surface, monkey_pos):
  pygame.sprite.Sprite.__init__(self)
  self.image = mon_surface
  self.rect = self.image.get_rect()
  self.rect.topleft = monkey_pos
  self.speed = 5

 # 控制猴子的移动
 def move(self, _offset):
  global JUMP_STATUS
  x = self.rect.left + _offset[pygame.K_RIGHT] - _offset[pygame.K_LEFT]
  y = self.rect.top + _offset[pygame.K_DOWN] - _offset[pygame.K_UP]
  if y < 0:
   self.rect.top = 0
   JUMP_STATUS = True
  elif y >= SCREEN_HEIGHT - self.rect.height:
   self.rect.top = SCREEN_HEIGHT - self.rect.height
   JUMP_STATUS = False
  else:
   self.rect.top = y
   JUMP_STATUS = True

  if x < 0:
   self.rect.left = 0
  elif x > SCREEN_WIDTH - self.rect.width:
   self.rect.left = SCREEN_WIDTH - self.rect.width
  else:
   self.rect.left = x

 # 接苹果
 def picking_apple(self, app_group):

  # 判断接到几个苹果
  picked_apples = pygame.sprite.spritecollide(self, app_group, True)

  # 添加分数
  self.apple_num += len(picked_apples)

  # 接到的苹果消失
  for picked_apple in picked_apples:
   picked_apple.kill()


# 苹果类
class Apple(pygame.sprite.Sprite):
 def __init__(self, app_surface, apple_pos):
  pygame.sprite.Sprite.__init__(self)
  self.image = app_surface
  self.rect = self.image.get_rect()
  self.rect.topleft = apple_pos
  self.speed = 1

 def update(self):
  global START_TIME
  if START_TIME is None:
   START_TIME = time.time()
  self.rect.top += (self.speed * (1 + (time.time() - START_TIME) / 40))
  if self.rect.top > SCREEN_HEIGHT:
   # 苹果落地游戏结束
   global OVER_FLAG
   OVER_FLAG = True
   self.kill()


# 初始化游戏
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("猴子接苹果")

# 载入图片
background_surface = pygame.image.load(BACKGROUND_IMAGE_PATH).convert()
monkey_surface = pygame.image.load(MONKEY_IMAGE_PATH).convert_alpha()
apple_surface = pygame.image.load(APPLE_IMAGE_PATH).convert_alpha()

# 创建猴子
monkey = Monkey(monkey_surface, (200, 500))

# 创建苹果组
apple_group = pygame.sprite.Group()

# 分数字体
score_font = pygame.font.SysFont("arial", 40)

# 主循环
while True:

 if OVER_FLAG:
  break

 # 控制游戏最大帧率
 clock.tick(FRAME_RATE)

 # 绘制背景
 screen.blit(background_surface, (0, 0))

 if ticks >= ANIMATE_CYCLE:
  ticks = 0

 # 产生苹果
 if ticks % 30 == 0:
  apple = Apple(apple_surface,
      [randint(0, SCREEN_WIDTH - apple_surface.get_width()), -apple_surface.get_height()])
  apple_group.add(apple)

 # 控制苹果
 apple_group.update()

 # 绘制苹果组
 apple_group.draw(screen)

 # 绘制猴子
 screen.blit(monkey_surface, monkey.rect)
 ticks += 1

 # 接苹果
 monkey.picking_apple(apple_group)

 # 更新分数
 score_surface = score_font.render(str(monkey.apple_num), True, (0, 0, 255))
 screen.blit(score_surface, (620, 10))
 # 更新屏幕
 pygame.display.update()

 for event in pygame.event.get():
  if event.type == pygame.QUIT:
   pygame.quit()
   exit()

  # 控制方向
  if event.type == pygame.KEYDOWN:
   if event.key in offset:
    if event.key == pygame.K_UP:
     offset[event.key] = 80
    else:
     offset[event.key] = monkey.speed
  elif event.type == pygame.KEYUP:
   if event.key in offset:
    offset[event.key] = 0

 # 移动猴子
 if JUMP_STATUS:
  offset[pygame.K_DOWN] = 5
  offset[pygame.K_UP] = 0
 monkey.move(offset)

# 游戏结束推出界面
score_surface = score_font.render(str(monkey.apple_num), True, (0, 0, 255))
over_surface = score_font.render(u"Game Over!", True, (0, 0, 255))
screen.blit(background_surface, (0, 0))
screen.blit(score_surface, (620, 10))
screen.blit(over_surface, (250, 270))

while True:

 pygame.display.update()
 for event in pygame.event.get():
  if event.type == pygame.QUIT:
   pygame.quit()
   exit()

食用指南: 使用的图片

monkey.png:

基于Python-Pycharm实现的猴子摘桃小游戏(源代码)

background.jpg:

基于Python-Pycharm实现的猴子摘桃小游戏(源代码)

apple.png:

基于Python-Pycharm实现的猴子摘桃小游戏(源代码)

这是我的文件目录,学习者也可改为自己的:

基于Python-Pycharm实现的猴子摘桃小游戏(源代码)

更改的代码位置:

root_path = current_path[:current_path.find("monkey-picking-peach\\") + len("monkey-picking-peach\\")] \
   + "resource\\images\\"

游戏截图:

基于Python-Pycharm实现的猴子摘桃小游戏(源代码)

到此这篇关于基于Python-Pycharm实现的猴子摘桃小游戏的文章就介绍到这了,更多相关Python 猴子摘桃小游戏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python清除字符串中间空格的实例讲解
May 11 Python
python实现字符串和字典的转换
Sep 29 Python
Django 路由系统URLconf的使用
Oct 11 Python
解读python如何实现决策树算法
Oct 11 Python
python使用xlrd模块读取xlsx文件中的ip方法
Jan 11 Python
详解Python做一个名片管理系统
Mar 14 Python
python画图的函数用法以及技巧
Jun 28 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
Django 返回json数据的实现示例
Mar 05 Python
tensorflow常用函数API介绍
Apr 19 Python
容易被忽略的Python内置类型
Sep 03 Python
Python 串口通信的实现
Sep 29 Python
pandas按条件筛选数据的实现
Feb 20 #Python
python实现b站直播自动发送弹幕功能
Feb 20 #Python
如何用 Python 制作 GitHub 消息助手
Feb 20 #Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 #Python
Python 的 f-string 可以连接字符串与数字的原因解析
Feb 20 #Python
安装不同版本的tensorflow与models方法实现
Feb 20 #Python
python爬虫scrapy基本使用超详细教程
Feb 20 #Python
You might like
PHP 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
如何做到多笔资料的同步
2006/10/09 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
Javascript 写的简单进度条控件
2008/01/22 Javascript
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
vue实现购物车加减
2020/05/30 Javascript
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
Python Mysql自动备份脚本
2008/07/14 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python全局变量用法实例分析
2016/07/19 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
python实现杨氏矩阵查找
2019/03/02 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
《花木兰》教学反思
2014/04/09 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书