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实现向QQ群成员自动发邮件的方法
Nov 19 Python
利用Python实现图书超期提醒
Aug 02 Python
Python原始字符串与Unicode字符串操作符用法实例分析
Jul 22 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
python入门教程 python入门神图一张
Mar 05 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
Jul 11 Python
Python运维开发之psutil库的使用详解
Oct 18 Python
Python3远程监控程序的实现方法
Jul 15 Python
利用python生成照片墙的示例代码
Apr 09 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
python和C++共享内存传输图像的示例
Oct 27 Python
python excel和yaml文件的读取封装
Jan 12 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
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
js中this对象用法分析
2018/01/05 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
python如何实现一个刷网页小程序
2018/11/27 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
Python Django路径配置实现过程解析
2020/11/05 Python
关于box-sizing的全面理解
2016/07/28 HTML / CSS
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
专项法律服务方案
2014/06/11 职场文书
2014年小学工作总结
2014/11/26 职场文书
后备干部推荐材料
2014/12/24 职场文书
力克胡哲观后感
2015/06/10 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang