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解析并修改XML文档的方法
Oct 15 Python
Python简单连接MongoDB数据库的方法
Mar 15 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
Python shelve模块实现解析
Aug 28 Python
python文字转语音实现过程解析
Nov 12 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
基于jupyter代码无法在pycharm中运行的解决方法
Apr 21 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
python归并排序算法过程实例讲解
Nov 04 Python
详解python的内存分配机制
May 10 Python
Python预测分词的实现
Jun 18 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 模拟登陆MSN并获得用户信息
2009/05/16 PHP
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
2014/06/05 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
javascript数组输出的两种方式
2015/01/13 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
python文件操作整理汇总
2014/10/21 Python
Python实现股市信息下载的方法
2015/06/15 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
互动出版网:专业书籍
2017/03/21 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
Hibernate持久层技术
2013/12/16 面试题
门卫人员岗位职责
2013/12/24 职场文书
管道维修工岗位职责
2013/12/27 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
请假条的格式
2014/04/11 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
运动会运动员赞词
2015/07/22 职场文书
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers