前言:

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

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

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

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

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

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

首发于 https://sleepymonster.cn

结构划分

我分为了

  • run 入口
  • setting 设置
  • main 主逻辑
  • utils 仓库

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

直接开始贴代码

run.py

import sysfrom main import mainbanner = """ ____        _ _ _____
| __ )  __ _| | | ____|___  ___
|  _ \ / _` | | |  _| / __|/ __|
| |_) | (_| | | | |___\__ \ (__
|____/ \__,_|_|_|_____|___/\___|
"""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 = 0if FIRST_STEP <= time < SECOND_STEP:index = 1if SECOND_STEP <= time:index = 2numMap = [[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 1else:return 2# Note: 根据时间设置小球大小
# Time: 2021/12/17 8:58 下午
# Author: HengYi
def howBigBallIs(ladderNum, time):index = 0if FIRST_STEP <= time < SECOND_STEP:index = 1if SECOND_STEP <= time:index = 2numMap = [[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 = 0if FIRST_STEP <= time < SECOND_STEP:index = 1if SECOND_STEP <= time:index = 2numMap = [[(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.USEREVENTpygame.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 = 0w, h, xs, ys = keys[0]self.w = wself.h = hself.xs = xsself.ys = ysx = 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.xsself.rect.y += self.ys# 当遇到墙的时候进行反弹if self.rect.x > WIDTH - self.w or self.rect.x < 0:self.xs = -self.xselif self.rect.y > HEIGHT - self.h or self.rect.y < 0:self.ys = -self.ysif 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 += 1return self.timeSecdef __del__(self):  # 销毁的时候passclass 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 = 0elif self.rect.x > WIDTH - self.rect.w:self.rect.x = WIDTH - self.rect.welif self.rect.y < 0:self.rect.y = 0elif self.rect.y > HEIGHT - self.rect.h:self.rect.y = HEIGHT - self.rect.hpygame.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, SCOREballs = pygame.sprite.Group(Ball(judgeDiff(ladderNum, TIME)))mouse = Mouse(howBigBallIs(ladderNum, TIME))mouseObject = pygame.sprite.Group(mouse)# --------------------------------------------------# ---------------------游戏主程序-----------------------RUNNING = TrueSHOWINFO = Falsewhile 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 = FalseSHOWINFO = Truefor 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 = 0TIME = 0for each in balls.sprites():balls.remove(each)SHOWINFO = FalseRUNNING = Trueelif event.type == comeAgain and RUNNING:  # 每秒增加TIME += 1ballsNum = 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实现小球躲避相关推荐

  1. 【Java小游戏】小球躲避游戏 图片轮播爆炸效果、边缘反弹、计时功能

    功能 Java开发的小球躲避小游戏.通过上下左右按键控制小球移动,小球移动的方向包括:横向.纵向.斜向,小球具有初始生命值.小球通过移动来躲避炮弹,当小球碰到炮弹时,产生爆炸的动画效果. 使用双缓冲方 ...

  2. html5游戏防止作弊,html5 canvas模拟的小球躲避小游戏

    刘泽的canvas游戏咯 var player={ }; var vs={ }; var ball;//只是为了缩短变量访问时间 var H=500; var W=1000; var L=0; var ...

  3. ❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码

    今天正式学习Pygame 学习环境 适合人群 跳跃的小球 实现步骤说明 创建游戏窗口 display模块的常用方法 窗口显示 加载游戏图片 Surface对象的常用方法 移动图片 碰撞检测 限制小球移 ...

  4. 重力感应机制和手机的屏幕绘画

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 利用手机的重力感应机制和手机的屏幕绘画功能,实现一款躲避休闲游戏. 实现平台,工具: 采用java ADT工具,jav ...

  5. Gradle sync failed: No variants found for ':app'. Check build files to ensure at least one varian...

    Gradle sync failed: No variants found for ':app'. Check build files to ensure at least one variant e ...

  6. 自己做的一个超级简单的小游戏

    自己做了一个简单的uniy3d小游戏 方向键控制一个小球躲避别的小球,撞到指定的墙胜利,被别的球撞到失败. 初学者练手 Player move Enemy move Islose_Trigger Sp ...

  7. 交互媒体技术——作品推荐

    交互媒体技术--作品推荐 <Gravity>--融入动画技术的交互应用(数技1602-周际翔) <打群架>--模拟<拥挤城市>(数技1604-江峰) Issac S ...

  8. C语言实现《别碰白块》小游戏!全部代码+思路注释

    今天我们将用C语言实现一个小球跳跃躲避方块的游戏. 就像闯关游戏一样,小球闯关类游戏是休闲游戏的一种,玩家在游戏中需要控制各种不同的小球展开不同的挑战,尽情的闯过重重的关卡,努力的操作小球躲避障碍物以 ...

  9. Easyx 学习笔记

    Easyx 学习记录 1. 创建小球 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xgq8oN2i-1655694620229)(https://i.loli.net ...

  10. pygame 躲避僵尸

    游戏玩法 根据神庙逃亡,实现一个人躲避僵尸的小游戏,主要的是精灵.精灵组之间相撞.相交的处理. 游戏开始随机出现一定的僵尸,随机移动,玩家在一位置上,如果僵尸靠近玩家一定距离,则玩家持续掉血.玩家通过 ...

最新文章

  1. 收藏!PyTorch常用代码段合集
  2. 使用VScode开发ESP32,PlatformIO开发ESP32
  3. 选化学可否报计算机专业,选课选物化生报什么专业前景好
  4. Java数据结构和算法:二叉树
  5. Java基础篇:数组
  6. 20个天才般的走心设计,真是太牛了!
  7. mysql优化 运维_MySQL运维---MySQL优化
  8. [Java] 蓝桥杯PREV-5 历届试题 错误票据
  9. 多线程总结之旅(9):线程同步之事件
  10. MySQL蜜罐在护网中提取攻击者微信ID
  11. 10个WEB设计戒律 和 10个设计师戒律
  12. 如何更改Windows系统登陆界面
  13. 64位CPU对于移动设备是没有意义
  14. 手机浏览网页页面缩放
  15. vue拖动滑块验证组件
  16. 高新技术企业认定领域细分有几项
  17. 分数指数幂计算机,分数指数幂教案
  18. 【LTE】LTE基础知识要点(二)信道物理资源定义(RG/RB/RE/REG)
  19. wordpress获取用户数据函数:get_userdata
  20. python使用_获取常用特定日期(如去年/季度/当月/上月/本周/首日等)

热门文章

  1. 磨金石教育学剪辑是正规的教育机构吗?小白学剪辑怎么样?有什么学习方法?
  2. Servlet思维导图总结
  3. 如何维持手机电池寿命_手机电池寿命怎么延长
  4. VUCA时代,3招让项目计划管理更科学有序!
  5. 接口安全评估基本流程
  6. CAN波特率与负载率
  7. PMP之相关方登记册、相关方参与计划与沟通管理计划的区别
  8. ospf及lsa总结
  9. 生成树协议STP(Spanning Tree Protocol)
  10. web前端第一次作业