在前面的文章《python小欢喜(六)动画 (1) pygame的安装与初步使用》中介绍了如何安装pygame。接下来用pygame开发一个小游戏。
游戏界面如下:
在游戏窗口中有一个运动的足球,碰到边界或挡板会反弹,玩家通过鼠标的移动,可以拖动挡板左右移动。足球如果碰到窗口下边界,则玩家的生命值减1,如果足球被挡板弹回,则得分数加1
。
python代码如下:
ballGame.py
该代码改编自Bryson Payne《Teach Your Kids to Code》第10章的小游戏程序,并在关键处加上了中文注释
# -*- coding:utf-8 -*-
# 挡球游戏
import
pygame
#导入pygame模块
pygame
.
init
(
)
screen
=
pygame
.
display
.
set_mode
(
[
800
,
600
]
)
#设置图形窗口大小为800*600
pygame
.
display
.
set_caption
(
"挡球"
)
#设置图形窗口标题
BLACK
=
(
0
,
0
,
0
)
# 用RGB值定义黑色
WHITE
=
(
255
,
255
,
255
)
# 用RGB值定义白色
BROWN
=
(
166
,
134
,
95
)
# 用RGB值定义棕色
ball
=
pygame
.
image
.
load
(
"ball.png"
)
# 加载足球图片
picx
=
0
#图片的x坐标的初始值设为0
picy
=
0
#图片的y坐标的初始值设为0
picw
=
100
#图片的宽度
pich
=
100
#图片的高度
speedx
=
5
#足球的水平速度值
speedy
=
5
#足球的垂直速度值
paddlex
=
300
#挡板的x坐标的初始值设为300
paddley
=
550
#挡板的y坐标的初始值设为550 ,窗口高度为600,档板靠近窗口底部
paddlew
=
200
#挡板的宽度
paddleh
=
25
#挡板的高度
points
=
0
#游戏得分
lives
=
5
#玩家生命值
font
=
pygame
.
font
.
SysFont
(
"Times"
,
24
)
#设置输出文本所用的字体
timer
=
pygame
.
time
.
Clock
(
)
#生成一个定时器对象
keepGoing
=
True
while
keepGoing
:
# 事件处理循环
for
event
in
pygame
.
event
.
get
(
)
:
if
event
.
type
==
pygame
.
QUIT
:
keepGoing
=
False
#根据速度值修正足球图片的当前位置,如果碰到边缘,则将速度值取反,得到回弹的效果
picx
+=
speedx
picy
+=
speedy
if
picx
<=
0
or
picx
+
ball
.
get_width
(
)
>=
800
:
speedx
=
-
speedx
if
picy
<=
0
:
speedy
=
-
speedy
if
picy
>=
500
:
lives
-=
1
#碰到底边,生命值减1
speedy
=
-
speedy
screen
.
fill
(
BLACK
)
screen
.
blit
(
ball
,
(
picx
,
picy
)
)
# 根据鼠标的当前位置绘制挡板,只使用的鼠标当前位置的x坐标
paddlex
=
pygame
.
mouse
.
get_pos
(
)
[
0
]
paddlex
-=
paddlew
/
2
pygame
.
draw
.
rect
(
screen
,
BROWN
,
(
paddlex
,
paddley
,
paddlew
,
paddleh
)
)
# 检查足球是否与档板发生了碰撞,如果是,则得分数加1,并使足球回弹
if
picy
+
pich
>=
paddley
and
picy
+
pich
<=
paddley
+
paddleh \
and
speedy
>
0
:
if
picx
+
picw
/
2
>=
paddlex
and
picx
+
picw
/
2
<=
paddlex
+
\
paddlew
:
points
+=
1
speedy
=
-
speedy
# 输出提示信息
tip
=
"Lives: "
+
str
(
lives
)
+
" Points: "
+
str
(
points
)
text
=
font
.
render
(
tip
,
True
,
WHITE
)
text_rect
=
text
.
get_rect
(
)
text_rect
.
centerx
=
screen
.
get_rect
(
)
.
centerx
text_rect
.
y
=
10
screen
.
blit
(
text
,
text_rect
)
pygame
.
display
.
update
(
)
#刷新窗口
timer
.
tick
(
60
)
#设置帧率不超过60
pygame
.
quit
(
)
# 退出pygame