你不会还不知道如何用Python写一个切水果的小游戏吧

news2024/11/23 13:36:20

 目录

 

引言

一、需要导入的包

二、窗口界面设置  

三、随机生成水果位置    

四、绘制字体 

五、玩家生命的提示

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

七、游戏主循环  


引言

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

今天小五就用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秒后更新一次。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux centos 安装zookeeper服务

一、进入官网&#xff1a;Apache ZooKeeper 二、下载安装包 可以使用wget 下载&#xff0c;我这里服务器的原因就不使用了&#xff0c;直接在网页使用http下载&#xff0c;然后通过xftp上传到服务器 下载完成后通过xftp上传到linux服务器 三、解压 tar -zxvf apache-zookeepe…

520中国劲酒携手撒贝宁直播探厂,共同见证健康跑活动启幕

5月20日是“网络情人节”,每年一度的 520,所有人都沉在真爱告白的浓情氛围当中,对于全中国的劲酒爱好者来说,520 却有着不一样的意义,每年 520 劲粉节,中国劲酒以爱之名,号召和鼓励劲粉们培养持之以恒的健康生活方式。      520 当日,总台央视主持人撒贝宁来到了湖北大冶市…

新手要学网络安全应该从哪学起?

写在开篇 本人10 年工作经验&#xff0c; 擅长 Web 安全攻防、渗透领域&#xff0c; 在金融领域的安全有丰富的实战经验。从事在线教育 3 年多培养学员过万&#xff0c;讲解清晰透彻&#xff0c;课程干货内容多&#xff0c;辅导学员耐心细致 我为啥说自学黑客&网络安全&a…

SSM框架学习之Mybatis

SSM Spring SpringMVC Mybatis&#xff0c;这是一种常用的Java Web开发框架组合。Spring是一个轻量级的IoC和AOP容器框架&#xff0c;SpringMVC是基于Spring的MVC框架&#xff0c;Mybatis是一种ORM(Object Relational Mapping)框架&#xff0c;用于在Java应用中管理数据库。…

libvirt job机制浅析

libvirt 中&#xff0c;job 机制用于处理和跟踪针对虚拟机域&#xff08;domain&#xff09;的长时间操作&#xff0c;如迁移、快照、保存&#xff0c;热插拔等。job 机制的主要目的是确保在同一时间只有一个长时间操作可以执行&#xff0c;从而避免竞争条件和不一致性问题。 …

C嘎嘎~~[类和对象 精华篇]

类和对象 精华篇 static成员引入特点问题收尾 友元友元函数友元类 内部类理解 类和对象 static成员 引入 &#x1f5e8;️[题目] 实现一个类&#xff0c;计算程序中创建出了多少个类对象 先分析一下题目: 程序运行中, 有对象的创建, 也有对象的销毁 ⇒ 对应下来就是 构造,拷…

linux服务器断电重启后,发现时间误差八小时

文章目录 问题现象排查与解决时间同步与设置服务器时钟介绍 问题现象 客户的服务器已部署好平台&#xff0c;放入了机房&#xff0c;运行正常。服务器系统时间设置东八区&#xff08;CST&#xff09;&#xff0c;时间日期也已修改正确客户是我省的某小县城&#xff0c;某台晚上…

28 KVM管理系统资源-绑定QEMU进程至物理CPU

文章目录 28 KVM管理系统资源-绑定QEMU进程至物理CPU28.1 概述28.2 操作步骤 28 KVM管理系统资源-绑定QEMU进程至物理CPU 28.1 概述 QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内&#xff0c;从而保证了运行不同业务的虚拟机不会干扰到邻位虚拟机。例如在一个…

ArcMap:第一届全国大学生GIS技能大赛(滁州学院)详解-下午题

目录 01 题目 02 数据 2.1 主要沟谷文件 2.2 DEM数字高程文件 2.3 气象站点数据 2.4 系统设计相关的DLL等文件 03 思路 3.1 作物生长条件的思路 3.1.1 对于条件1 3.1.2 对于条件2 3.1.3 对于条件3 3.1.4 对于条件4 3.2 水系的提取 3.3 种植面积的计算 04 实操 …

linux下cpu占用率100%怎么解决?

在实际的生产环境中&#xff0c;常常会遇到服务器CPU爆满的问题&#xff0c;这时候&#xff0c;正确的排查方法&#xff0c;有助于快速的定位问题。 1、找到最耗CPU的进程 使用top命令查看系统总体的CPU和内存使用情况&#xff0c;以及各个进程的资源使用情况。 2、找到最耗…

迈向5.5G丨美格智能持续创新,为智能世界创造新价值

5月11日&#xff0c;2023 “高通&美格智能物联网技术开放日”深圳站活动举行&#xff0c;美格智能高级产品总监在活动中发表题为《迈向5.5G&#xff0c;智联新未来》的主题演讲&#xff0c;分享了美格智能在5G技术演进中的创新实践。 ▲美格智能高级产品总监 刘伟鹏 ▌技术…

【基础折线图】学习使用flask、echarts搭建数据可视化图表网页

文章目录 前言Apache EchartsNPM 安装 ECharts在线定制 ECharts使用 Echarts Flaskpip安装flask 学习案例案例目录html代码flask代码 源码地址 前言 本文中的所有代码&#xff0c;全部都有详细注释&#xff0c;有需要的同学可以在文末领取&#xff01; 数据可视化是数据分析必…

19-01 技术选型的道与术

系列目录导航&#x1f449; 什么是技术选型&#xff0c;技术选型的重要性 根据实际业务管理的需要&#xff0c;对硬件、软件以及所要用到的技术进行规格的选择狭义上的技术选型&#xff1a;团队决定选用哪种技术去解决问题&#xff0c;比如选用某个技术语言、某个技术框架去开…

Android12之模板类单例模式实现原理(一百五十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

openGauss 年度大型开发者会议来袭,快来看看都有哪些SIG组参加!

openGauss Developer Day 2023 将于5月26日在北京举办。作为大会的重要环节&#xff0c; SIG组版本规划工作会议 将汇聚社区各个SIG 组的用户与开发者&#xff0c;与大家见面&#xff0c;共同讨论开源数据库的技术发展与创新。属于开发者的狂欢日&#xff0c;期待大家的到…

CMAKE命令详解

目录 CMake 语法 案例&#xff1a; 面试中给可能会问的问题和回答&#xff1a; 总结&#xff1a; CMake 是一个用于构建和管理跨平台软件项目的开源工具。它使用名为 CMakeLists.txt 的文本文件来描述项目的构建过程。 CMake 语法 当使用 CMake 构建项目时&#xff0c;可以…

数据库索引结构(1)概念

常见的索引 主键和二级索引 MySQL学习笔记-主键索引和二级索引_mysql中主键索引和二级索引的区别_爱因诗贤的博客-CSDN博客 MYSQL-主键索引与二级索引_mysql二级索引存在哪个文件_青苔小榭的博客-CSDN博客 采用主键索引的好处&#xff1a;如果元素的位置发生修改&#xff0c;那…

华为OD机试真题 Java 实现【组合出合法最小数】【2023Q1 200分】

一、题目描述 给一个数组&#xff0c;数组里面都是代表非负整数的字符串&#xff0c;将数组里所有的数值排列组合拼接起来组成一个数字&#xff0c;输出拼接成的最小的数字。 二、输入描述 一个数组&#xff0c;数组不为空&#xff0c;数组里面都是代表非负整数的字符串&…

解读智慧城市建设的关键角色:GIS技术的应用与优势

近年来&#xff0c;随着城市化进程的加快和信息技术的迅猛发展&#xff0c;智慧城市成为了城市发展的重要方向。而在智慧城市建设中&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术的应用正发挥着越来越重要的作用。GIS技术以其独特的地理空间分析能力&#xff0c;为…

龙芯2K1000实战开发-项目整体框架介绍

文章目录 概要整体架构技术名词解释技术细节小结概要 本项目主要以龙芯2k1000为CPU实现整个系统的管理,主要实现数据交换、时间同步和数据监控等功能。项目中龙芯作为一部分存在,考虑到项目涉密的原因,不能将整个项目的应用背景及项目整体方案做介绍,只能将龙芯过程开发做一…