一、介绍模块
最小开发框架:
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