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中的字符串操作和编码Unicode详解
Jan 18 Python
python开发利器之ulipad的使用实践
Mar 16 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
详解Python3之数据指纹MD5校验与对比
Jun 11 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
python3 webp转gif格式的实现示例
Dec 10 Python
python使用gdal对shp读取,新建和更新的实例
Mar 10 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
May 26 Python
Python如何读写字节数据
Aug 05 Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 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
PHP文件上传实例详解!!!
2007/01/02 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
php面向对象值单例模式
2016/05/03 PHP
php json转换相关知识(小结)
2018/12/21 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
python 把列表转化为字符串的方法
2018/10/23 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
Python selenium的基本使用方法分析
2019/12/21 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
卫校护理专业毕业生求职信
2013/11/26 职场文书
酒店管理专业毕业生求职自荐信
2014/04/28 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL