基于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函数缺省值与引用学习笔记分享
Feb 10 Python
python绘制双柱形图代码实例
Dec 14 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
jupyter note 实现将数据保存为word
Apr 14 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
python 基于wx实现音乐播放
Nov 24 Python
Python基于Faker假数据构造库
Nov 30 Python
Python离线安装openpyxl模块的步骤
Mar 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
PHP如何使用Memcached
2016/04/05 PHP
PHP Include文件实例讲解
2019/02/15 PHP
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
Bootstrap图片轮播效果详解
2017/10/17 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
十个Python程序员易犯的错误
2015/12/15 Python
python常用函数详解
2016/09/13 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
Python with语句用法原理详解
2020/07/03 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
JAVA招聘远程笔试题
2015/07/23 面试题
乳制品整治工作方案
2014/05/29 职场文书
2014年工会工作总结
2014/11/12 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书