脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python中的pygame实现接球小游戏

python中的pygame实现接球小游戏

2022-12-05 10:32牧子川 Python

这篇文章主要介绍了python中的pygame实现接球小游戏,文章基于python的相关资料展开详细的内容,具有一定的参考价值,需要的小伙伴可以参考一下

一、介绍模块

最小开发框架:

基于python 的Pygame最小开发框架

1、Pygame和sys模块

?
1
2
import pygame #制作游戏时要使用的模块
import sys #python的标准库,对内部各功能模块进行初始化创建,系统模块

2、random模块

需要在屏幕上随机生成小球

?
1
from random import randint

详情请看此文章:python中的随机数 Random介绍

二、相关功能

1、窗口尺寸改变

可以调节游戏屏幕的大小

?
1
2
3
4
# 改变窗口尺寸
        elif event.type == pygame.VIDEORESIZE:
            size = w,h = event.w,event.h
            screen = pygame.display.set_mode(size,pygame.RESIZABLE)

pygame.VIDEORESIZE 这是窗口大小改变事件,事件发生后,返回event.size元组,包含新窗口的宽度和高度。 .size[0] 高度,也可以用event.w表示 .size[1] 宽度,也可以用event.h表示 返回参数仅在事件发生时有用

2、键盘控制挡板

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# 键盘控制挡板
        elif event.type == pygame.KEYDOWN: #键盘按下事件检测
            if event.key == pygame.K_LEFT:  # 判断挡板是否左移
                if board_rect.left > 0 and board_rect.left <= w - 186:
                    board_rect.left -= board_x
                elif board_rect.left <= 0# 判断挡板左边的坐标是否小于0
                    board_rect.left = 0
                    board_rect.top -= board_y
            elif event.key == pygame.K_RIGHT:  # 判断挡板是否右移
                if board_rect.right >= 186 and board_rect.right < w:
                    board_rect.right += board_x
                elif board_rect.right >= w:  # 判断挡板右边的坐标是否大于屏幕的宽度                        board_rect.right = w
                    board_rect.bottom += board_y

3、鼠标控制

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#鼠标控制挡板
        elif event.type == pygame.MOUSEMOTION:
            # 鼠标左键按下并跟随鼠标移动
            if event.buttons[0] == 1:
                if event.pos[0] >= 0 and event.pos[0] < w - 186:#判断鼠标的位置
                    board_rect.left = event.pos[0] #将鼠标的x坐标给Rect对象的左边
                elif event.pos[0] >= w - 186 and event.pos[0] <= w:
                    board_rect.left = w - 186
                # board_rect.top = h - 17 #档板位置在底部
        elif event.type == pygame.MOUSEBUTTONDOWN:  #鼠标按键按下
            # 将鼠标当前位置给挡板
            if event.button == 1:
                if event.pos[0] >= 0 and event.pos[0] < w - 186:#判断鼠标的位置
                    board_rect.left = event.pos[0] #将鼠标的x坐标给Rect对象的左边
                if event.pos[0] >= w - 186 and event.pos[0] <= w:
                    board_rect.left = w - 186
                # board_rect.top = h - 17

4、挡板接住小球并得分

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下方挡板接到小球
    if ball_y >= h - 37 and (ball_x >= board_rect.left - 20 and ball_x <= board_rect.left + 206):
        move_y = - move_y  # y方向速度反向
        score += points  #得分
        count += 1   #次数增加1次
        if count == 5# 每满五次,难度和单次接球得分增加
            count = 0  # 接球得分的次数清零
            points += points
            # x方向速度增加
            if move_x > 0:
                move_x += 1
            else:
                move_x -= 1
            move_y -= 1

5、小球未接住小球

?
1
2
3
4
5
# 下方挡板未接到小球
    if ball_y > h - 27 and (ball_x < board_rect.left - 20 or ball_x > board_rect.left + 206):
        # 游戏结束
        ball_y = 200  #小球所在的位置
        break

6、小球移动

?
1
2
3
4
5
6
7
# 移动小球
    ball_x += move_x
    ball_y += move_y
    if ball_x <= 20 or ball_x >= w - 20# 碰到左右两侧墙壁
        move_x = - move_x  # x方向速度反向
    if ball_y <= 20# 碰到上方墙壁
        move_y = - move_y  # y方向速度反向

7、显示分数

?
1
2
my_score = font.render(str(score), False, (255, 255, 0))  # 创建文字对象(文字,是否平滑,文字颜色)
    screen.blit(my_score, (w - 100, 30))  # 将文字添加到窗口上

三、完整代码

?
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
117
import sys
from random import randint
import pygame
 
pygame.init() # 初始化
 
size = w, h = (600,500) # 屏幕显示的区域,高度和宽度
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
pygame.display.set_caption("接球游戏") # 屏幕的标题
fpsClock = pygame.time.Clock() # 帧速率 窗口刷新速度 越大运行越快
 
board = pygame.image.load(r"D:\pycharm\WorkTime(大二上)\挡板.jpg")
board_rect = board.get_rect() #对图片进行加框 利用surface生成rect
 
color = pygame.Color(255,255,255) # 屏幕(窗口)的颜色:白色
Green = pygame.Color('green') # 小球的颜色:绿色
 
# 随机生成小球的x、y坐标(整数,包括两端)
ball_x = randint(20,580)
ball_y = randint(20,200)
 
# 小球x、y坐标变化量
move_x = 1
move_y = 1
 
# 挡板x、y坐标变化量
board_x = 46
board_y = 0
 
score=0 #得分
font=pygame.font.Font(r'D:\字库\书法和新增字库\微软雅黑.ttf',60) #设置字体(前者是字体路径)和字体大小
points=1 #一次接球的加分
count=0 #接球得分的次数
 
# size1 = board.get_size() #获取图片大小
# print(size1)
while True:
    board_rect.top = h - 17
    for event in pygame.event.get(): # pygame.event.get() 从事件队列中取出事件,并从队列中删除该事件
        if event.type == pygame.QUIT:
            sys.exit()
 
        # 改变窗口尺寸
        elif event.type == pygame.VIDEORESIZE:
            size = w,h = event.w,event.h
            screen = pygame.display.set_mode(size,pygame.RESIZABLE)
 
 
        # 键盘控制挡板
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:  # 挡板左移
                if board_rect.left > 0 and board_rect.left <= w - 186:
                    board_rect.left -= board_x
                elif board_rect.left <= 0# 判断挡板左边的坐标是否小于0
                    board_rect.left = 0
                    board_rect.top -= board_y
            elif event.key == pygame.K_RIGHT:  # 挡板右移
                if board_rect.right >= 186 and board_rect.right < w:
                    board_rect.right += board_x
                elif board_rect.right >= w:  # 判断挡板右边的坐标是否大于屏幕的宽度                        board_rect.right = w
                    board_rect.bottom += board_y
 
        #鼠标控制挡板
        elif event.type == pygame.MOUSEMOTION:
            # 鼠标左键按下并跟随鼠标移动
            if event.buttons[0] == 1:
                if event.pos[0] >= 0 and event.pos[0] < w - 186:#判断鼠标的位置
                    board_rect.left = event.pos[0] #将鼠标的x坐标给Rect对象的左边
                elif event.pos[0] >= w - 186 and event.pos[0] <= w:
                    board_rect.left = w - 186
                # board_rect.top = h - 17 #档板位置在底部
        elif event.type == pygame.MOUSEBUTTONDOWN:  #鼠标按键按下
            # 将鼠标当前位置给挡板
            if event.button == 1:
                if event.pos[0] >= 0 and event.pos[0] < w - 186:#判断鼠标的位置
                    board_rect.left = event.pos[0] #将鼠标的x坐标给Rect对象的左边
                if event.pos[0] >= w - 186 and event.pos[0] <= w:
                    board_rect.left = w - 186
                # board_rect.top = h - 17
 
    # 下方挡板接到小球
    if ball_y >= h - 37 and (ball_x >= board_rect.left - 20 and ball_x <= board_rect.left + 206):
        move_y = - move_y  # y方向速度反向
        score += points
        count += 1
        if count == 5# 每满五次,难度和单次接球得分增加
            count = 0  # 接球得分的次数清零
            points += points
            # x方向速度增加
            if move_x > 0:
                move_x += 1
            else:
                move_x -= 1
            move_y -= 1
 
    # 下方挡板未接到小球
    if ball_y > h - 27 and (ball_x < board_rect.left - 20 or ball_x > board_rect.left + 206):
        # 游戏结束
        ball_y = 200
        break
 
    # 移动小球
    ball_x += move_x
    ball_y += move_y
    if ball_x <= 20 or ball_x >= w - 20# 碰到左右两侧墙壁
        move_x = - move_x  # x方向速度反向
    if ball_y <= 20# 碰到上方墙壁
        move_y = - move_y  # y方向速度反向
 
    fpsClock.tick(200)
    screen.fill(color)
    # 显示分数
    my_score = font.render(str(score), False, (255, 255, 0))  # 创建文字对象(文字,是否平滑,文字颜色)
    screen.blit(my_score, (w - 100, 30))  # 将文字添加到窗口上
    screen.blit(board,board_rect)  #将一个图像绘制在另一个图像上 把surface对象覆盖到移动后的rect对象
    pygame.draw.circle(screen, Green, (ball_x, ball_y), 20# 绘制小球
    pygame.display.update() # 对显示窗口进行更新,默认窗口全部重绘

到此这篇关于python中的pygame实现接球小游戏的文章就介绍到这了,更多相关pygame接球游戏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7083024810321641509

延伸 · 阅读

精彩推荐
  • PythonPython爬虫信息输入及页面的切换方法

    Python爬虫信息输入及页面的切换方法

    今天小编就为大家分享一篇Python爬虫信息输入及页面的切换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    小炉灶5982021-02-20
  • Pythonpython logging重复记录日志问题的解决方法

    python logging重复记录日志问题的解决方法

    python的logging模块是python使用过程中打印日志的利器,下面这篇文章主要给大家介绍了关于python logging重复记录日志问题的解决方法,文中通过示例代码介绍...

    huilan_same4622021-03-16
  • Pythonpython缩进长度是否统一

    python缩进长度是否统一

    在本篇内容里小编给大家整理的是一篇关于python缩进长度是否统一的相关知识点,需要的朋友们可以学习下。...

    yang6392020-08-02
  • Pythonpython编程冒泡排序法实现动图排序示例解析

    python编程冒泡排序法实现动图排序示例解析

    这篇文章主要介绍了python编程中如何使用冒泡排序法实现动图排序的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...

    Hann Yang12212022-01-18
  • PythonDjango实现学员管理系统

    Django实现学员管理系统

    这篇文章主要为大家详细介绍了Django实现学员管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    425981337092021-06-02
  • Pythonpython进度条库tqdm的基本操作方法

    python进度条库tqdm的基本操作方法

    这篇文章主要介绍了python进度条库tqdm的基本操作方法,tqdm实时输出处理进度而且占用的CPU资源非常少,支持windows、Linux、mac等系统,支持循环处理、多进...

    周兵7252022-11-12
  • Pythonpython实现类的静态变量用法实例

    python实现类的静态变量用法实例

    这篇文章主要介绍了python实现类的静态变量用法,实例分析了Python中基于数组实现静态队列的相关使用技巧,需要的朋友可以参考下...

    igoo2102020-06-24
  • Python为Python程序添加图形化界面的教程

    为Python程序添加图形化界面的教程

    这篇文章主要介绍了为Python程序添加图形化界面的教程,图形化界面编程是开发Python本地应用的必备,需要的朋友可以参考下 ...

    廖雪峰26962020-06-17