Pygame实现小球躲避实例代码

目录
  • 前言:
  • 结构划分
    • run.py
    • setting.py
    • utils.py
    • Main.py
  • 总结
    • 效果图:
    • 如何食用:

前言:

这学期的Python课,要写代码是真的多…

课程实验一是一个五子棋,但是发了代码。

至于代码质量嘛~ 我直接全部根据自己划分的结构改了

这里吐槽下 (真的发下来的代码 惨不忍睹 )

我改了快4个小时 后面功能不想加了…

这次是自己写嘛~ 那就写个想样的。

结构划分

我分为了

run 入口

setting 设置

main 主逻辑

utils 仓库

其实我想的是:全部设置到页面上去,但是偷懒~ (期末要去弄绩点)

直接开始贴代码

run.py

import sys

from main import main

banner = """ ____        _ _ _____
| __ )  __ _| | | ____|___  ___
|  _ \ / _` | | |  _| / __|/ __|
| |_) | (_| | | | |___\__ \ (__
|____/ \__,_|_|_|_____|___/\___|
"""

if __name__ == '__main__':
    print(banner)
    print("Author: HengYi")
    print("[*] 简单:输入 1")
    print("[*] 普通:输入 2")
    print("[*] 困难:输入 3")
    try:
        num = int(input("请选择难度:"))
        if num in [1, 2, 3]:
            main(num)
        else:
            print("无法处理~")
            sys.exit()
    except Exception as e:
        raise Exception("无法处理~")

setting.py

WIDTH = 900  # 宽
HEIGHT = 600  # 高
SCORE = 0  # 分数
TIME = 0  # 时间
FIRST_STEP = 10  # 到达第二关时间
SECOND_STEP = 20  # 到达第三关时间
FPS = 60  # 刷新率
BG_COLOR = (255, 239, 213)  # 背景颜色

utils.py

# -*- coding: utf-8 -*-
import pygame
from setting import FIRST_STEP, SECOND_STEP, BG_COLOR, WIDTH, HEIGHT

# Note: 根据难度生成对应的小球
# Time: 2021/12/17 8:35 下午
# Author: HengYi
def ballNum(ladderNum, time):
    index = 0
    if FIRST_STEP <= time < SECOND_STEP:
        index = 1
    if SECOND_STEP <= time:
        index = 2
    numMap = [
        [2, 3, 5],
        [3, 5, 6],
        [4, 6, 7]
    ]
    return numMap[ladderNum - 1][index]

# Note: 根据小球个数设置防止误触时间
# Time: 2021/12/17 8:43 下午
# Author: HengYi
def protectTime(ballsNum):
    if ballsNum in [2, 3, 4]:
        return 1
    else:
        return 2

# Note: 根据时间设置小球大小
# Time: 2021/12/17 8:58 下午
# Author: HengYi
def howBigBallIs(ladderNum, time):
    index = 0
    if FIRST_STEP <= time < SECOND_STEP:
        index = 1
    if SECOND_STEP <= time:
        index = 2
    numMap = [
        [25, 20, 15],
        [24, 20, 16],
        [26, 20, 16]
    ]
    return numMap[ladderNum - 1][index]

# Note: 根据时间难度计算球体的大小和速度
# Time: 2021/12/17 9:15 下午
# Author: HengYi
def judgeDiff(ladderNum, time):
    index = 0
    if FIRST_STEP <= time < SECOND_STEP:
        index = 1
    if SECOND_STEP <= time:
        index = 2
    numMap = [
        [(30, 30, 3.5, 3.5), (28, 28, 6, 6), (26, 26, 9, 9)],
        [(30, 30, 4.5, 4.5), (27, 27, 8, 8), (25, 25, 10, 10)],
        [(30, 30, 5, 5), (26, 26, 9, 9), (24, 24, 12, 12)]
    ]
    return numMap[ladderNum - 1][index]

# Note: 创建平台窗口
# Time: 2021/12/17 2:58 下午
# Author: HengYi
def makeGameBg(width, height):
    pygame.init()
    screen = pygame.display.set_mode((width, height))  # 设置窗口大小
    pygame.display.set_caption('小球逃逃逃')  # 设置窗口标题
    background = pygame.Surface(screen.get_size())  # 填充背景
    return screen, background

# Note: 添加小球产生的事件
# Time: 2021/12/17 3:06 下午
# Author: HengYi
def ballCome():
    COME_AGAIN = pygame.USEREVENT
    pygame.time.set_timer(COME_AGAIN, 1000)
    return COME_AGAIN

# Note: 提示字体
# Time: 2021/12/17 3:11 下午
# Author: HengYi
def makeTips(content, size, color, position, screen):
    font = pygame.font.SysFont('arial', size)
    text_sf = font.render(content, True, color, BG_COLOR)
    screen.blit(text_sf, position)

# Note: 字体展示
# Time: 2021/12/18 4:20 下午
# Author: HengYi
def draw(screen, SCORE, TIME):
    screen.fill(BG_COLOR)  # 防止出现拖影
    makeTips('SCORE: ', 30, (34, 139, 34), (5, 40), screen)
    makeTips('TIME(s): ', 30, (64, 158, 255), (5, 75), screen)
    makeTips(str(int(SCORE)), 30, (34, 139, 34), (135, 40), screen)
    makeTips(str(int(TIME)), 30, (64, 158, 255), (135, 75), screen)
    if TIME in [FIRST_STEP, FIRST_STEP + 1]:
        makeTips('Ops! LEVEL_2~', 30, (60, 179, 113), (WIDTH / 2 - 30 * 3.5, HEIGHT / 2 - 50), screen)
    elif TIME in [SECOND_STEP, SECOND_STEP + 1]:
        makeTips('Congratulations! LEVEL_3', 25, (60, 179, 113), (WIDTH / 2 - 25 * 6.25, HEIGHT / 2 - 50), screen)

Main.py

# -*- coding: utf-8 -*-
import random
from setting import *
from utils import *

class Ball(pygame.sprite.Sprite):
    def __init__(self, *keys):  # 创建球
        super().__init__()
        self.timeSec = 0
        w, h, xs, ys = keys[0]
        self.w = w
        self.h = h
        self.xs = xs
        self.ys = ys
        x = random.randint(0, WIDTH - self.w)
        y = random.randint(0, HEIGHT - self.h)
        self.rect = pygame.Rect(x, y, self.w * 2, self.h * 2)

    def update(self, screen, *args):
        # 根据设置的速度进行运动
        self.rect.x += self.xs
        self.rect.y += self.ys
        # 当遇到墙的时候进行反弹
        if self.rect.x > WIDTH - self.w or self.rect.x < 0:
            self.xs = -self.xs
        elif self.rect.y > HEIGHT - self.h or self.rect.y < 0:
            self.ys = -self.ys
        if self.timeSec <= args[0]:
            pygame.draw.rect(screen, (100, 149, 237), [self.rect.x, self.rect.y, self.rect.w, self.rect.h], 2)
        pygame.draw.circle(screen, (255, 0, 0), [self.rect.center[0], self.rect.center[1]], self.w)

    def timerAdd(self):
        self.timeSec += 1
        return self.timeSec

    def __del__(self):  # 销毁的时候
        pass

class Mouse(pygame.sprite.Sprite):
    def __init__(self, *keys):
        super().__init__()
        self.size = keys[0]  # 设置圆的大小
        self.rect = pygame.Rect(WIDTH / 2 - self.size, HEIGHT / 2 - self.size, self.size * 2, self.size * 2)  # 实则是一个正方形

    def update(self, screen, *args):
        if pygame.mouse.get_focused():  # 如果存在于页面内
            self.rect.center = pygame.mouse.get_pos()
        # 限制球不能半身跑到边框上
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.x > WIDTH - self.rect.w:
            self.rect.x = WIDTH - self.rect.w
        elif self.rect.y < 0:
            self.rect.y = 0
        elif self.rect.y > HEIGHT - self.rect.h:
            self.rect.y = HEIGHT - self.rect.h
        pygame.draw.circle(screen, (255, 0, 0), [self.rect.center[0], self.rect.center[1]], self.size)  # 根据圆心画圆

def main(ladderNum):
    # -------------------画布初始化-----------------------
    screen, background = makeGameBg(WIDTH, HEIGHT)
    clock = pygame.time.Clock()
    comeAgain = ballCome()
    # --------------------------------------------------

    # --------------------对象存储-------------------------
    global TIME, SCORE
    balls = pygame.sprite.Group(Ball(judgeDiff(ladderNum, TIME)))
    mouse = Mouse(howBigBallIs(ladderNum, TIME))
    mouseObject = pygame.sprite.Group(mouse)
    # --------------------------------------------------

    # ---------------------游戏主程序-----------------------
    RUNNING = True
    SHOWINFO = False
    while True:
        draw(screen, SCORE, TIME)  # 动态添加文字
        if SHOWINFO:
            makeTips('Please Press The Space To Restart', 30, (255, 99, 71), (WIDTH / 2 - 240, HEIGHT / 2 - 50),
                     screen)
        for each in balls:
            if pygame.sprite.spritecollide(each, mouseObject, False, collided=None) and each.timeSec > 2:
                RUNNING = False
                SHOWINFO = True
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit(0)
            elif event.type == pygame.KEYDOWN:  # 重新开始
                if event.key == pygame.K_SPACE:
                    SCORE = 0
                    TIME = 0
                    for each in balls.sprites():
                        balls.remove(each)
                    SHOWINFO = False
                    RUNNING = True
            elif event.type == comeAgain and RUNNING:  # 每秒增加
                TIME += 1
                ballsNum = ballNum(ladderNum, TIME)
                diff = judgeDiff(ladderNum, TIME)
                SCORE += (ballsNum * diff[3])
                if TIME in [10, 20]:
                    mouseObject.remove(mouseObject.sprites()[0])
                    mouseObject.add(Mouse(howBigBallIs(ladderNum, TIME)))
                if len(balls) < ballsNum:
                    balls.add(Ball(diff))
                for each in balls:  # 防止误触的保护罩
                    each.timerAdd()
        balls.update(screen, protectTime(ballNum(ladderNum, TIME)))
        mouseObject.update(screen)
        clock.tick(FPS)
        pygame.display.update()  # 刷新
    print('游戏结束')

总结

效果图:

如何食用:

把上面4处代码Copy下来在用run.py启动

里面设计的 如何判断;如何重来;… (我觉得我的变量名字已经够清楚了)

到此这篇关于Pygame实现小球躲避实例代码的文章就介绍到这了,更多相关Pygame小球躲避内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python pygame实现方向键控制小球

    最后一个项目用到了pygame,  实现方向键控制小球,对于模块不熟悉的我还是查询了一些资料介绍. import sys import pygame from pygame.locals import * def control_ball(event): speed = [x,y] =[0,0]# 设置相对位移 speed_offset = 1 #小球的速度 # 如果事件的类型是 键盘输入,就根据方向键来求出速度的方向(默认是从左往右为1,从上往下为1) if event.type == KEY

  • python3 pygame实现接小球游戏

    本文实例为大家分享了python3 pygame接小球游戏的具体代码,供大家参考,具体内容如下 操作方法:鼠标操作 截图: 直接放代码: # -*- coding:utf-8 -*- import sys,pygame,random #导入库 from pygame.locals import * def print_text(font,x,y,text,color=(255,255,255)): imgText = font.render(text,True,color) # 创建字体,三个参

  • 教你利用pygame模块制作跳跃小球小游戏

    前言 pygame是用来开发游戏的一套基于SDL的模板,它可以是python创建完全界面化的游戏和多媒体程序,而且它基本上可以在任何系统上运行.本文将详细介绍你利用pygame模块制作跳跃小球小游戏的相关内容,下面来一起看看吧 实现方法 首先创建一个游戏窗口,然后再窗口内创建一个小球.以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续移动.可以按照如下步骤实现该功能. (1)首先来创建一个游戏窗口,宽和高设置为640×480.代码如下: import sys #导入sys模块 im

  • Pygame实现小球躲避实例代码

    目录 前言: 结构划分 run.py setting.py utils.py Main.py 总结 效果图: 如何食用: 前言: 这学期的Python课,要写代码是真的多- 课程实验一是一个五子棋,但是发了代码. 至于代码质量嘛- 我直接全部根据自己划分的结构改了 这里吐槽下 (真的发下来的代码 惨不忍睹 ) 我改了快4个小时 后面功能不想加了- 这次是自己写嘛- 那就写个想样的. 结构划分 我分为了 run 入口 setting 设置 main 主逻辑 utils 仓库 其实我想的是:全部设置

  • Python+Pygame绘制小球的实例详解

    目录 1.准备工作 2.开始制作 1.创建一个小球 2.创建逐渐变大的小球 3.创建一个自由下落的小球 4.用if语句实现循环下落 5.做一个循环上下反弹的小球 1.准备工作 1.在文件里找到设置 2.在项目里找到python解释器,点击右边的加号 3.搜素pygame并安装 同理下载pgzero安装包 2.开始制作 1.创建一个小球 代码 import pgzrun def draw(): screen.fill('green') screen.draw.filled_circle((400,

  • Android仿视频加载旋转小球动画效果的实例代码

    先上个效果图,以免大家跑错地了. 嗯,除了只能录三秒,其他没啥问题. 下面分析一下怎么实现上面这个效果. 理性分析后我们可以看到是几个小球绕着一个圆进行运动,那这里面的重点我们看看什么. 绘制五个球,没什么难度,让球绕圆进行运动,这个好像我们没有见到是怎么去实现了,那下就说这个. 从本质上看,球绕圆运动,其实我们可以看作是一个物体绕指定的路劲运动,那我们就有下面几个东西需要说一下: 1:Path 2:ValueAnimator 3:PathMeasure 前两个大家应该都见过,一个是路径,就是可

  • Python通过Pygame绘制移动的矩形实例代码

    Pygame是一个多用于游戏开发的模块. 本文实例主要是在演示框里实现一个移动的矩形实例代码,完整代码如下: #moving rectangle project import pygame from pygame.locals import * pygame.init() screen = pygame.display.set_mode((600,500)) pygame.display.set_caption("Drawing Rectangles") pos_x = 300 pos

  • vue框架制作购物车小球动画效果实例代码

    最近在学习前端制作了一个购物车小球的动画效果 直接上图看看效果 下面介绍一下制作这个动画的详细过程: 1.因为使用vue锁业需要使用transition标签包裹 并指定动画三个动画生命周期函数 <transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter"> <div class="ball" v-if=&quo

  • vue操作动画的记录animate.css实例代码

    transition动画 //使用动画库animate.css <transition enter-active-class='animated bounceIn' leave-active-class='animated bounceOut' :duration='200'> //其中duration是绑定动画的时间 统一设置进入与出去的时间 <h3 v-if='flag'>这里是动画的内容</h3> </transition > //也可以这样使用 &l

  • python按键按住不放持续响应的实例代码

    在学习飞机大战(我也不知道为什么都拿这个练手),飞机左右控制都是按键按一次移动一次,不能按住一个键后持续移动,离开后停止移动. 为了解决这个,查看了参考手册,说让用pygame.key.set_repeat() 方法,奈何我刚开始学也看不太明白,只能看懂一些.并且看别人的代码也比较费劲,毕竟不是自己的逻辑,得看一会儿,最后还是自己想了一个办法,用flag标签: 大体思路是这样的,比如向左持续移动,先在hero定一个属性标签设置布尔值为False,然后定义移动方法,在为真时,移动:再然后定义键盘的

  • C++小游戏BrickHit实例代码

    打砖块小游戏.材料:EasyX图形库. 碰撞的处理,木板移动方法还需要优化. //定义 Circle,Brick,Broad #include<cmath> #include<graphics.h> #ifndef _PROPERTY_H_ #define _PROPERTY_H_ struct Circle { int x0, y0, r; int mvX, mvY; COLORREF color; virtual ~Circle() {} Circle(int x0_, int

  • 用Python实现童年贪吃蛇小游戏功能的实例代码

    贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中. 尽管贪吃蛇的历史相对比较久远,但它却有着十分顽强的生命力,保持经久不衰,其中很重要的原因便是游戏厂家不断的对其进行更新迭代.现在,这款游戏无论是游戏场景.规则等都变得十分丰富. 接下来,我们看一下如何通过 Python 简单的实现这款小游戏. 规则 要有游戏主界面.贪吃蛇.食物 能够控制贪吃蛇移动并获取食物 贪吃蛇吃了食物后,增加自身长度.分数,食物消失并随机生成新的食物 贪吃蛇触碰到周围边界或自己身体

  • Angularjs2不同组件间的通信实例代码

    AngualrJs2官方方法是以@Input,@Output来实现组件间的相互传值,而且组件之间必须父子关系,下面给大家提供一个简单的方法,实现组件间的传值,不仅仅是父子组件,跨模块的组件也可以实现传值 /** *1.定义一个服务,作为传递参数的媒介 */ @Injectable() export class PrepService{ //定义一个属性,作为组件之间的传递参数,也可以是一个对象或方法 profileInfo: any; } /** *2.传递参数的组件,我这边简单演示,直接就在构

随机推荐