基于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设计模式之策略模式
Nov 18 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
Python正则表达式指南 推荐
Oct 09 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 Python
Pytest中skip skipif跳过用例详解
Jun 30 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
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
Yii学习总结之安装配置
2015/02/22 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
Python生成器(Generator)详解
2015/04/13 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
python os.fork() 循环输出方法
2019/08/08 Python
Tensorflow累加的实现案例
2020/02/05 Python
python中数据库like模糊查询方式
2020/03/02 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
综合办公室岗位职责
2015/04/11 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python
欧元符号 €
2022/02/17 杂记
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript