python 写一个水果忍者游戏


Posted in Python onJanuary 13, 2021

水果忍者的玩法很简单,尽可能的切开抛出的水果就行。

今天我们就用python简单的模拟一下这个游戏。在这个简单的项目中,我们用鼠标选择水果来切割,同时炸弹也会隐藏在水果中,如果切开了三次炸弹,玩家就会失败。

python 写一个水果忍者游戏

一、需要导入的包

import pygame, sys
import os
import random

二、窗口界面设置

# 游戏窗口
WIDTH = 800
HEIGHT = 500
FPS = 15             # gameDisplay的帧率,1/12秒刷新一次
pygame.init()
pygame.display.set_caption('水果忍者') # 标题
gameDisplay = pygame.display.set_mode((WIDTH, HEIGHT)) # 固定窗口大小
clock = pygame.time.Clock()

# 用到的颜色
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)

background = pygame.image.load('背景.jpg') # 背景
font = pygame.font.Font(os.path.join(os.getcwd(), 'comic.ttf'), 42) # 字体
score_text = font.render('Score : ' + str(score), True, (255, 255, 255)) # 得分字体样式

三、随机生成水果位置

def generate_random_fruits(fruit):
    fruit_path = "images/" + fruit + ".png"
    data[fruit] = {
        'img': pygame.image.load(fruit_path),
        'x' : random.randint(100,500),
        'y' : 800,
        'speed_x': random.randint(-10,10),
        'speed_y': random.randint(-80, -60),
        'throw': False,
        't': 0,
        'hit': False,
    }

    if random.random() >= 0.75:
        data[fruit]['throw'] = True
    else:
        data[fruit]['throw'] = False

data = {}
for fruit in fruits:
    generate_random_fruits(fruit)
  • 这个函数用于随机生成水果和保存水果的数据
  • 'x'和'y'存储水果在x坐标和y坐标上的位置。
  • Speed_x和speed_y是存储水果在x和y方向的移动速度。它也控制水果的对角线移动。
  • throw,用于判断生成的水果坐标是否在游戏之外。如果在外面,那么将被丢弃。
  • data字典用于存放随机生成的水果的数据。

四、绘制字体

font_name = pygame.font.match_font('comic.ttf')

def draw_text(display, text, size, x, y):
    font = pygame.font.Font(font_name, size)
    text_surface = font.render(text, True, WHITE)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    gameDisplay.blit(text_surface, text_rect)
  • Draw_text函数可以在屏幕上绘制文字。
  • get_rect() 返回 Rect 对象。
  • X和y是X方向和Y方向的位置。
  • blit()在屏幕上的指定位置绘制图像或写入文字。

五、玩家生命的提示

# 绘制玩家的生命
def draw_lives(display, x, y, lives, image) :
  for i in range(lives) :
    img = pygame.image.load(image)
    img_rect = img.get_rect()    
    img_rect.x = int(x + 35 * i)  
    img_rect.y = y         
    display.blit(img, img_rect)
def hide_cross_lives(x, y):
  gameDisplay.blit(pygame.image.load("images/red_lives.png"), (x, y))
  • img_rect获取十字图标的(x,y)坐标(位于最右上方)
  • img_rect .x 设置下一个十字图标距离前一个图标35像素。
  • img_rect.y负责确定十字图标从屏幕顶部开始的位置。

六、游戏开始与结束的画面

def show_gameover_screen():
    gameDisplay.blit(background, (0,0))
    draw_text(gameDisplay, "FRUIT NINJA!", 90, WIDTH / 2, HEIGHT / 4)
    if not game_over :
        draw_text(gameDisplay,"Score : " + str(score), 50, WIDTH / 2, HEIGHT /2)

    draw_text(gameDisplay, "Press a key to begin!", 64, WIDTH / 2, HEIGHT * 3 / 4)
    pygame.display.flip()
    waiting = True
    while waiting:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            if event.type == pygame.KEYUP:
                waiting = False
  • show_gameover_screen()函数显示初始游戏画面和游戏结束画面。
  • pygame.display.flip()将只更新屏幕的一部分,但如果没有参数传递,则会更新整个屏幕。
  • pygame.event.get()将返回存储在pygame事件队列中的所有事件。
  • 如果事件类型等于quit,那么pygame将退出。
  • event.KEYUP事件,当按键被按下和释放时发生的事件。

七、游戏主循环

first_round = True
game_over = True        
game_running = True    
while game_running :
    if game_over :
        if first_round :
            show_gameover_screen()
            first_round = False
        game_over = False
        player_lives = 3
        draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')
        score = 0

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            game_running = False

    gameDisplay.blit(background, (0, 0))
    gameDisplay.blit(score_text, (0, 0))
    draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')

    for key, value in data.items():
        if value['throw']:
            value['x'] += value['speed_x']
            value['y'] += value['speed_y']
            value['speed_y'] += (1 * value['t'])
            value['t'] += 1

            if value['y'] <= 800:
                gameDisplay.blit(value['img'], (value['x'], value['y']))
            else:
                generate_random_fruits(key)

            current_position = pygame.mouse.get_pos()

            if not value['hit'] and current_position[0] > value['x'] and current_position[0] < value['x']+60 \
                    and current_position[1] > value['y'] and current_position[1] < value['y']+60:
                if key == 'bomb':
                    player_lives -= 1
                    if player_lives == 0:
                        hide_cross_lives(690, 15)
                    elif player_lives == 1 :
                        hide_cross_lives(725, 15)
                    elif player_lives == 2 :
                        hide_cross_lives(760, 15)
                  
                    if player_lives < 0 :
                        show_gameover_screen()
                        game_over = True

                    half_fruit_path = "images/explosion.png"
                else:
                    half_fruit_path = "images/" + "half_" + key + ".png"

                value['img'] = pygame.image.load(half_fruit_path)
                value['speed_x'] += 10
                if key != 'bomb' :
                    score += 1
                score_text = font.render('Score : ' + str(score), True, (255, 255, 255))
                value['hit'] = True
        else:
            generate_random_fruits(key)

    pygame.display.update()
    clock.tick(FPS)

pygame.quit()
  • 这是游戏的主循环
  • 如果超过3个炸弹被切掉,game_over终止游戏,同时循环。
  • game_running 用于管理游戏循环。
  • 如果事件类型是退出,那么游戏窗口将被关闭。
  • 在这个游戏循环中,我们动态显示屏幕内的水果。
  • 如果一个水果没有被切开,那么它将不会发生任何事情。如果水果被切开,那么一个半切开的水果图像应该出现在该水果的地方
  • 如果用户点击了三次炸弹,将显示GAME OVER信息,并重置窗口。
  • clock.tick()将保持循环以正确的速度运行。循环应该在每1/12秒后更新一次

源码和素材在公众号 Python客栈 后台回复 切水果 获取。感兴趣的童鞋快来试试吧

更多关于python的文章,欢迎关注python客栈。

python 写一个水果忍者游戏

以上就是python 写一个水果忍者游戏的详细内容,更多关于python 水果忍者的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python下rrdtool模块的基本使用方法
Nov 13 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
python调用百度语音REST API
Aug 30 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
对Python 检查文件名是否规范的实例详解
Jun 10 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
python读文件的步骤
Oct 08 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
Python threading.local代码实例及原理解析
Mar 16 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 Python
python Selenium 库的使用技巧
Oct 16 Python
python中编写函数并调用的知识点总结
Jan 13 #Python
Python jieba库分词模式实例用法
Jan 13 #Python
python中yield的用法详解
Jan 13 #Python
利用python+request通过接口实现人员通行记录上传功能
Jan 13 #Python
selenium如何定位span元素的实现
Jan 13 #Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 #Python
python pillow库的基础使用教程
Jan 13 #Python
You might like
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
使用 MySQL Date/Time 类型
2008/03/26 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
基于python log取对数详解
2018/06/08 Python
在python中实现对list求和及求积
2018/11/14 Python
详解Python中的测试工具
2019/06/09 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
2014年五一促销活动方案
2014/03/09 职场文书
新闻编辑求职信
2014/04/09 职场文书
对学校的意见和建议
2015/06/04 职场文书
工程移交协议书
2016/03/24 职场文书
2019年教师入党申请书
2019/06/27 职场文书
Golang: 内建容器的用法
2021/05/05 Golang