【Python】【Pygame】游戏:抓球

2023-05-16

来源:《Python编程 从入门到实践》13-5/14-1、14-2/

我感觉这个题目继续学习还可以优化,是一个不错的小游戏。等我学了记分再来继续改进。

抓球(13-5)

碗在底部左右移动,顶端随机掉落小球(有三次抓不住的机会),失败以后画面静止。
在这里插入图片描述

catch_ball.py

import pygame
from setting import Settings
import functions as f
from bowl import Bowl
from ball import Ball

def catch_ball():
    pygame.init()

    sets = Settings()

    screen = pygame.display.set_mode((sets.bg_width, sets.bg_height))
    pygame.display.set_caption('GAME: Catch Ball')

    bowl = Bowl(screen=screen, sets=sets)
    ball = Ball(screen=screen, sets=sets)

    while True:
        f.check_event(bowl=bowl) # 检测屏幕是否退出

        if sets.gameover == False :
            bowl.move_bowl(sets=sets) # 移动碗
            ball.drop_ball(sets=sets) # 掉落球
            f.update_ball(ball=ball, bowl=bowl, sets=sets)

        f.update_screen(screen=screen, sets=sets, bowl=bowl, ball=ball) #更新屏幕


        pygame.display.flip()

catch_ball()

setting.py

import pygame

class Settings():
    def __init__(self):
        self.gameover = False # 游戏结束标志
        self.catch_number = 0 # 接住的球数目

        self.bg_width = 800
        self.bg_height = 600
        self.bg_color = (255, 255, 255)

        self.ball_image = pygame.image.load('weixiao.bmp')
        self.ball_speed = 1
        self.ball_number = 3 # 球的数量

        self.bowl_image = pygame.image.load('wan.bmp')
        self.bowl_speed = 10

ball.py

import pygame
from pygame.sprite import Sprite
from random import randint

class Ball(Sprite):
    def __init__(self, sets, screen):
        super(Ball, self).__init__()
        self.image = sets.ball_image
        self.rect = self.image.get_rect()
        self.screen = screen
        self.screen_rect = self.screen.get_rect()
        self.number = sets.ball_number

        self.rect_width = self.rect.width
        self.rect_height = self.rect.height

        # 初始位置
        distant_x = randint(-4, 4) * self.rect_width
        self.rect.x = self.screen_rect.centerx + distant_x
        self.rect.y = 0

    def print_ball(self):
        self.screen.blit(self.image, self.rect)

    def drop_ball(self, sets):
        self.rect.y += sets.ball_speed

    def change_ball(self, sets):
        distant_x = randint(-4, 4) * self.rect_width
        self.rect.x = self.screen_rect.centerx + distant_x
        self.rect.y = 0

bowl.py

import pygame

class Bowl:
    def __init__(self, sets, screen):
        self.image = sets.bowl_image
        self.rect = self.image.get_rect()
        self.screen = screen
        self.moving = 0

        # 初始位置,屏幕底部中间
        self.rect.centerx = sets.bg_width / 2
        self.rect.centery = sets.bg_height - self.rect.height / 2

    def print_bowl(self):
        self.screen.blit(self.image, self.rect)

    def move_bowl(self, sets):
        if self.moving != 0 :
            if self.moving == 1 and self.rect.right < sets.bg_width:
                self.rect.centerx += sets.bowl_speed
            elif self.moving == -1 and self.rect.left > 0:
                self.rect.centerx -= sets.bowl_speed


functions.py

import sys
import pygame

# 检测屏幕退出
def check_event(bowl):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                sys.exit()
            if event.key == pygame.K_LEFT:
                bowl.moving = -1
            elif event.key == pygame.K_RIGHT:
                bowl.moving = 1
        elif event.type == pygame.KEYUP:
            bowl.moving = 0

# 更新屏幕
def update_screen(screen, sets, bowl, ball):
    screen.fill(sets.bg_color)
    bowl.print_bowl()
    ball.print_ball()

# 更新球
def update_ball(ball, bowl, sets):
    if pygame.sprite.collide_rect(ball ,bowl): # 碗接住了球
        ball.change_ball(sets)
        sets.catch_number += 1
        #print(sets.catch_number)
    if check_ball_edge(ball, sets): # 球到底了
        if ball.number > 0:
            ball.number -= 1
            #print(ball.number)
            ball.change_ball(sets)
        else:
            sets.gameover = True

def check_ball_edge(ball, sets):
    if ball.rect.bottom >= sets.bg_height:
        return True
    else:
        return False

结果

在这里插入图片描述

改进1(14-1)

开始显示按钮(按下p游戏开始),游戏失败以后结束游戏并且重新显示p,再按一次重新开始。
只重写改进模块。

catch_ball.py

import pygame
from setting import Settings
import functions as f
from bowl import Bowl
from ball import Ball
from button import Button

def catch_ball():
    pygame.init()

    sets = Settings()

    screen = pygame.display.set_mode((sets.bg_width, sets.bg_height))
    pygame.display.set_caption('GAME: Catch Ball')

    bowl = Bowl(screen=screen, sets=sets)
    ball = Ball(screen=screen, sets=sets)
    star_button = Button(screen=screen, sets=sets, test="Star(P)")

    while True:
        f.check_event(bowl=bowl, sets=sets, ball=ball) # 检测屏幕是否退出

        if sets.gameover == False :
            bowl.move_bowl(sets=sets) # 移动碗
            ball.drop_ball(sets=sets) # 掉落球
            f.update_ball(ball=ball, bowl=bowl, sets=sets)

        # 更新屏幕
        f.update_screen(screen=screen, sets=sets, bowl=bowl, ball=ball, button=star_button)

        pygame.display.flip()

catch_ball()

setting.py

import pygame

class Settings():
    def __init__(self):
        self.gameover = True # 游戏结束标志
        self.catch_number = 0 # 接住的球数目

        self.bg_width = 800
        self.bg_height = 600
        self.bg_color = (255, 255, 255)

        self.ball_image = pygame.image.load('weixiao.bmp')
        self.ball_speed = 1
        self.ball_number = 3 # 球的数量

        self.bowl_image = pygame.image.load('wan.bmp')
        self.bowl_speed = 10

        self.button_width = 200
        self.button_height = 50
        self.button_bg_color = (0, 0, 0)
        self.button_word_color = (200, 0, 0)

functions.py

import sys
import pygame

# 检测屏幕退出
def check_event(bowl, sets, ball):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                sys.exit()
            if event.key == pygame.K_LEFT:
                bowl.moving = -1
            if event.key == pygame.K_RIGHT:
                bowl.moving = 1
            if event.key == pygame.K_p: # 按下P开始
                reset_game(sets, ball) # 重置游戏
        elif event.type == pygame.KEYUP:
            bowl.moving = 0

def reset_game(sets, ball):
    sets.gameover = False
    ball.number = 3

# 更新屏幕
def update_screen(screen, sets, bowl, ball, button):
    screen.fill(sets.bg_color)
    bowl.print_bowl()
    ball.print_ball()
    if sets.gameover == True:
        button.draw_button()

# 更新球
def update_ball(ball, bowl, sets):
    if pygame.sprite.collide_rect(ball ,bowl): # 碗接住了球
        ball.change_ball(sets)
        sets.catch_number += 1
        #print(sets.catch_number)
    if check_ball_edge(ball, sets): # 球到底了
        if ball.number > 0:
            ball.number -= 1
            #print(ball.number)
            ball.change_ball(sets)
        else:
            sets.gameover = True

def check_ball_edge(ball, sets):
    if ball.rect.bottom >= sets.bg_height:
        return True
    else:
        return False

button.py

这个是新加的

import pygame.font

class Button():
    def  __init__(self, screen, sets, test):
        self.screen = screen
        self.screen_rect = self.screen.get_rect()
        self.sets = sets
        self.test = test # 文字

        self.width = self.sets.button_width
        self.height = self.sets.button_height
        self.button_bg_color = self.sets.button_bg_color
        self.button_word_color = self.sets.button_word_color
        self.font = pygame.font.SysFont(None, 48)

        # rect对象
        self.rect = pygame.Rect(0, 0, self.width, self.height)
        self.rect.center = self.screen_rect.center

        self.prep_test(test) # 建立按钮标签,只需要建立一次

    # 建立按钮
    def prep_test(self, test):
        # 将文本转化为图像
        self.test_image = self.font.render(self.test, True, self.button_word_color,self.button_bg_color)
        self.test_image_rect = self.test_image.get_rect()
        self.test_image_rect.center = self.rect.center

    # 绘制按钮
    def draw_button(self):
        self.screen.fill(self.button_bg_color, self.rect)
        self.screen.blit(self.test_image, self.test_image_rect)

结果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】【Pygame】游戏:抓球 的相关文章

  • 如何编写嵌套的 __init__.py 文件

    我正在努力解决嵌套问题 init py在我正在编写的Python包中 该包具有以下架构 module init py submodule1 init py source py submodule2 init py source py sub
  • python sys.path 故障排除

    python 文档位于http docs python org library sys html http docs python org library sys html比如说sys path is 从环境变量 PYTHONPATH 以及
  • Virtualenv 在 OS X Yosemite 上失败并出现 OSError

    我最近更新到 OSX Yosemite 现在无法使用virtualenv pip 每当我执行 virtualenv env 它抛出一个 OSError Command Users administrator ux env bin pytho
  • 将非常大的Python列表输出保存到mysql表中

    我想将 python 生成的列表的输出保存在 mysql 数据库的表中 该表如下所示 mysql 中的 myapc8 表 https i stack imgur com 4B4Hz png这是Python代码 在此输入图像描述 https
  • 将 numpy 数组合并为单个 int

    numpy 数组怎么可以这样 10 22 37 45 转换为单个 int32 数字 如下所示 10223745 这可以工作 gt gt gt int join map str 10 22 37 45 10223745 基本上你使用map s
  • 如何返回 cost, grad 作为 scipy 的 fmin_cg 函数的元组

    我怎样才能使 scipy 的fmin cg使用一个返回的函数cost and gradient作为元组 问题是有f对于成本和fprime对于梯度 我可能必须执行两次操作 非常昂贵 grad and cost被计算 此外 在它们之间共享变量可
  • Mypy 无法从文字列表推断项目的类型

    我有一个变量x和一个文字列表 例如 0 1 2 我想转换x这些文字之一 如果x在列表中 我将其退回 否则我返回一个后备值 from typing import Literal Set Foo Literal 0 1 2 foos Set F
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • 在 python pandas 中,如何保存“网格图”?

    我对 pandas 绘图工具很陌生 在文档中 以下命令非常方便 myplot rts ret hist bins 50 by rts primary mic 然而 当我尝试从图中获取图形参考并保存它时 问题就出现了 myfigure myp
  • 类型错误:需要二进制或 unicode 字符串,得到 618.0

    I ve been trying to implement this ML Linear Model into my dataset https www tensorflow org tutorials estimator linear L
  • Python Anaconda:如何测试更新的库是否与我现有的代码兼容?

    我在 Windows 7 机器上使用 Python 2 7 Anaconda 安装进行数据分析和科学计算 当新的库发布时 例如新版本的 pandas patsy 等 您建议我如何测试新版本与现有代码的兼容性 是否可以在同一台机器上安装两个
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • pandas 相当于 np.where

    np where具有向量化 if else 的语义 类似于 Apache Spark 的when otherwise数据帧方法 我知道我可以使用np where on pandas Series but pandas通常定义自己的 API
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 如何给URL添加变量?

    我正在尝试从网站收集数据 我有一个 Excel 文件 其中包含该网站的所有不同扩展名 F i www example com example2 我有一个脚本可以成功从网站中提取 HTML 但现在我想为所有扩展自动执行此操作 然而 当我说 s
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发

随机推荐

  • 【LeetCode】《LeetCode 101》第七章:动态规划

    文章目录 7 1 算法解释7 2 基本动态规划 xff1a 一维70 爬楼梯 xff08 简单 xff09 198 打家劫舍 xff08 中等 xff09 413 等差数列划分 xff08 中等 xff09 7 3 基本动态规划 xff1a
  • CentOS使用Nginx反向代理Tomcat部署Java Web项目

    CentOS使用Nginx反向代理Tomcat部署Java Web项目 今天我舍友问我 xff1a CSDN是什么意思 xff1f 床上等你吗 文章目录 CentOS使用Nginx反向代理Tomcat部署Java Web项目一 安装Tomc
  • yield函数在Python中的使用方式探究

    Python之yield学习 Python之yield1 问题描述2 yield版解决方案3 yield与generator4 总结 Python之yield 1 问题描述 在之前的学习中 xff0c 对于返回需要进行迭代序列的函数 xff
  • eslint报错解决

    Unexpected control character s in regular expression x00 no control regex eslint disable next line no control regex 用这个
  • Mac中brew的安装和常用命令

    brew是MAC中的一个包管理工具 类似于Linux中的那些自动下载yum包 通过brew可以自动下载安装很多软件包在 https brew sh 中有它的具体内容 在页面里可以找到所有安装步骤和可安装的包 安装brew 终端输入以下命令行
  • 华为2288v5服务器安装Centos7系统

    1 安装准备 1 1 硬件 以虚拟光驱 虚拟软驱为例介绍操作系统的安装过程 xff0c 如果使用物理光驱 物理软驱则以实际的光盘 软盘代替 1 2 软件 xff08 1 xff09 准备好操作系统的 ISO 镜像包 xff08 2 xff0
  • 设置docker自启动

    1 设置docker自启动 sudo systemctl enable docker 2 查看docker中的镜像 sudo docker images 3 配置默认的镜像加速 sudo mkdir p etc docker sudo te
  • ESLint 报错:error Unreachable code no-unreachable

    大多出错的原因都与 return 有关 xff0c 可能是带有返回值的方法之中调用另一个方法的时候 把方法写在了 return 后面 代码的意思就是没有执行到这个方法 xff1b 还有可能就是在遍历判断中使用了 return xff0c 符
  • 程序员:每一份不忘初心的情怀, 都是对技术的追求

    1 真正的情怀 xff0c 是从不矫情 这几年 情怀 大约快成了贬义 创业讲情怀 xff0c 产品讲情怀 xff0c 好像没点情怀都不好意思出门见人 我们曾经充满热情 xff0c 是一位开源软件倡导者 xff0c 我们崇尚全栈工程师才有未来
  • ubuntu 如何用root身份进行登录

    公司有个小项目 需要用python调用 sh脚本来执行一些东西 执行脚本的时候需要输入密码 类似 sudo S paaswd 43 脚本 但是给客户部署的话 再让客户客户 保存密码到配置文件 就显得麻烦 就想到用root方式去登陆系统 结果
  • 创建Maven项目时候弹出setup maven plugin connection解决方案

    今天创建一个maven项目的时候弹出了setup maven plugin connection xff0c 然后有两个选择 xff0c 我们直接选择auto select继续下一步 xff0c 然后等待一下 xff0c 把此页面关掉 然后
  • 基于BERT的知识库问答系统(KBQA)

    基于BERT的知识库问答系统 xff08 KBQA xff09 简介 知识库问答系统主要要做的两点分别是识别问题中的实体和提取问题中我们需要从知识库中查找的属性 xff0c 针对这两个方面我采用了NLP预训练模型BERT分别训练了基于BER
  • libc6-dev : 依赖: libc6 (= 2.23-0ubuntu3) 但是 2.23-0ubuntu10 正要被安装

    无法安装libc6 dev 如果出现下面错误 xff1a 在装libc6 dev时下列的软件包有不能满足的依赖关系 xff1a libc6 dev 依赖 libc6 61 2 23 0ubuntu3 但是 2 23 0ubuntu10 正要
  • VScode使用sftp远程修改文件

    一 下载插件 二 创建任意一个文件夹 sftp插件是在文件夹下生效的 因为你要在文件夹下进行sftp的配置 以及打开远程文件 三 配置远程连接配置 快捷键 Ctrl 43 Shift 43 P 打开config span class tok
  • iOS 上接入Lottie动画 接入Json动画

    iOS设备上的动画借助官方SDK xff1a CoreAnimation那一套已经比较强大了 xff0c 基本上的动效都能实现 xff0c 就是1 开发这边比较累 xff1b 2 安卓那边也比较累况且 俩平台最后展示的可能有些细节还不一样
  • 安装pysyft联邦框架和pysyft代码案例

    pysyft联邦框架 1 新建虚拟环境2 安装pysyft3 安装jaxlib4 安装完成5 安装结果测试6 注意事项7 pysyft框架联邦案例8 一些优秀教程9 报错解决办法 1 新建虚拟环境 由于pysyft和pytorch之间有版本
  • Ps1终端提示符的参数设置

    1 了解PS1 PS1 61 u 64 h W PS1的常用参数以及含义 d xff1a 代表日期 xff0c 格式为weekday month date xff0c 例如 xff1a Mon Aug 1 H xff1a 完整的主机名称 h
  • Python3 实现简单的生命游戏

    Python3 实现简单的生命游戏 生命游戏是英国数学家约翰 何顿 康威在1970年发明的细胞自动机 生命游戏原理 细胞自动机 xff08 又称元胞自动机 xff09 xff0c 名字虽然很深奥 xff0c 但是它的行为却是非常美妙的 所有
  • 图论

    图是数据结构和算法学中最强大的框架之一 xff08 或许没有之一 xff09 图 xff08 graph xff09 并不是指图形图像 xff08 image xff09 或地图 xff08 map xff09 通常来说 xff0c 我们会
  • 【Python】【Pygame】游戏:抓球

    来源 xff1a Python编程 从入门到实践 13 5 14 1 14 2 我感觉这个题目继续学习还可以优化 xff0c 是一个不错的小游戏 等我学了记分再来继续改进 抓球 xff08 13 5 xff09 碗在底部左右移动 xff0c