大家好,本篇文章主要讲的是Pygame实现小球躲避实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览。领取资料点击

目录

前言:

结构划分

run.py

setting.py

utils.py

Main.py

总结

效果图:

如何食用:


前言:

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

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

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

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

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

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

结构划分

我分为了

run 入口

setting 设置

main 主逻辑

utils 仓库

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

直接开始贴代码

run.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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

1

2

3

4

5

6

7

8

WIDTH = 900  # 宽

HEIGHT = 600  # 高

SCORE = 0  # 分数

TIME = 0  # 时间

FIRST_STEP = 10  # 到达第二关时间

SECOND_STEP = 20  # 到达第三关时间

FPS = 60  # 刷新率

BG_COLOR = (255, 239, 213 # 背景颜色

utils.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

# -*- 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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

# -*- 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实现小球躲避实例代码相关推荐

  1. python扫雷的代码及原理_基于Python实现的扫雷游戏实例代码

    摘要:这篇Python开发技术栏目下的"基于Python实现的扫雷游戏实例代码",介绍的技术点是"Python实现.Python.实例代码.扫雷游戏.扫雷.游戏" ...

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

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

  3. python界面小游戏贪吃蛇_用Python实现童年贪吃蛇小游戏功能的实例代码

    贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中. 尽管贪吃蛇的历史相对比较久远,但它却有着十分顽强的生命力,保持经久不衰,其中很重要的原因便是游戏厂家不断的 ...

  4. python按键持续按下响应_python按键按住不放持续响应的实例代码

    在学习飞机大战(我也不知道为什么都拿这个练手),飞机左右控制都是按键按一次移动一次,不能按住一个键后持续移动,离开后停止移动. 为了解决这个,查看了参考手册,说让用pygame.key.set_rep ...

  5. python怎么发送代码文件_python 通过 socket 发送文件的实例代码

    目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = ...

  6. php http面向对象编程实例,PHP面向对象编程——PHP对象引用实例代码

    /* ?* WEB开发笔记 www.chhua.com 每日练习 PHP面向对象编程--PHP对象引用实例代码 ?*/ /*代码演示 ?* */ class HelloWorld {//被引用对象 ? ...

  7. 实例代码分享Python实现Linux监控

    本文通过实例代码给大家介绍了Python实现Linux监控的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下. 工作原理:基于/proc 文件系统 Linux 系统为管理员提供了非常好的方 ...

  8. python功能性爬虫案例_Python使用requests及BeautifulSoup构建爬虫实例代码

    本文研究的主要是Python使用requests及BeautifulSoup构建一个网络爬虫,具体步骤如下. 功能说明 在Python下面可使用requests模块请求某个url获取响应的html文件 ...

  9. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  10. html背景mov,科技常识:html5自动播放mov格式视频的实例代码

    今天小编跟大家讲解下有关html5自动播放mov格式视频的实例代码 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关html5自动播放mov格式视频的实例代码 的相关资料,希望小伙伴们看了有 ...

最新文章

  1. 特别完善的面试知识总结
  2. 【转载】看板方式简介
  3. python所有软件都打不开机怎么办_电脑软件,小编教你电脑所有软件都打不开怎么解决...
  4. 零拷贝(Zero Copy)
  5. rip协议的V1和V2的更新机制
  6. VisualStudio2010 SP1 SP1 SDK SQLServer 2008 SP3 下载地址
  7. 机器学习、深度学习方面书籍收集(持续更新……)
  8. 软件设计师考试笔记:UML统一建模语言
  9. Python Tips 01 : 判断两个文件是否相同
  10. 如何用MEF实现Asp.Net MVC框架
  11. binlog 分析及回滚神器Analysisbinlog
  12. 【imessage软件群推送】 “CMCC“ | grep password #待补充 重置后撤销暂存的变更
  13. Wipe In and Wipe Out 抹进、抹出(动画显示、动画隐藏)(展开、折叠)(拉下、收起)
  14. 微信小程序长列表优化方案
  15. 半小时漫画中国史 -- 读书摘记
  16. 基于单片机的CO2温湿度电路设计(#0217)
  17. 青少年护眼灯哪个牌子好?儿童护眼灯品牌推荐
  18. KVM 虚拟化 介绍
  19. java x509certificate2_使用X509Certificate2类操作证书文件
  20. python调用Hanlp做命名实体识别以及词性标注

热门文章

  1. Laravel和Doctrine的测试驱动开发
  2. 技术美术知识学习_04:PBR的个人理解
  3. 火爆全网的动态曲线图是怎么做的?
  4. C#实战004:Excel操作-读取Excel工作簿
  5. 恢复Cisco 2960交换机密码
  6. 实现APNG图片解码及缩放显示
  7. OUC-SE-BLOG1
  8. Docker资源控制的Cgroup--CPU权重等--Block IO、bps和iops 的限制详细操作
  9. TesterHome android app 编写历程(二)
  10. 想成为挣钱的游戏程序员要经历多少阶段?