python开发俄罗斯方块小游戏代码实例

python开发俄罗斯方块小游戏代码实例

1.操作环境

win10系统,python3.5以上系统,

2.相关模块

pyqt5模块;

以及一些Python自带的模块。

3.安装Python并添加到环境变量,pip安装需要的相关模块。

pipinstall-rrequirements.txt
'''
Function:
俄罗斯方块主程序
Author:
Charles
公众号:
Charles的皮卡丘
'''
import
os
import
sys
import
random
from
modules
import
*
from
PyQt5
.
QtGui
import
*
from
PyQt5
.
QtCore
import
*
from
PyQt5
.
QtWidgets
import
*
'''定义俄罗斯方块游戏类'''
class
TetrisGame
(
QMainWindow
):
def
__init__
(
self
,
parent
=
None
):
super
(
TetrisGame
,
self
).
__init__
(
parent
)
#是否暂停ing
self
.
is_paused
=
False
#是否开始ing
self
.
is_started
=
False
self
.
initUI
()
'''界面初始化'''
def
initUI
(
self
):
#icon
self
.
setWindowIcon
(
QIcon
(
os
.
path
.
join
(
os
.
getcwd
(),
'resources/icon.jpg'
)))
#块大小
self
.
grid_size
=
22
#游戏帧率
self
.
fps
=
200
self
.
timer
=
QBasicTimer
()
#焦点
self
.
setFocusPolicy
(
Qt
.
StrongFocus
)
#水平布局
layout_horizontal
=
QHBoxLayout
()
self
.
inner_board
=
InnerBoard
()
self
.
external_board
=
ExternalBoard
(
self
,
self
.
grid_size
,
self
.
inner_board
)
layout_horizontal
.
addWidget
(
self
.
external_board
)
self
.
side_panel
=
SidePanel
(
self
,
self
.
grid_size
,
self
.
inner_board
)
layout_horizontal
.
addWidget
(
self
.
side_panel
)
self
.
status_bar
=
self
.
statusBar
()
self
.
external_board
.
score_signal
[
str
].
connect
(
self
.
status_bar
.
showMessage
)
self
.
start
()
self
.
center
()
self
.
setWindowTitle
(
'Tetris——Charles的皮卡丘'
)
self
.
show
()
self
.
setFixedSize
(
self
.
external_board
.
width
()
+
self
.
side_panel
.
width
(),
self
.
side_panel
.
height
()
+
self
.
status_bar
.
height
())
'''游戏界面移动到屏幕中间'''
def
center
(
self
):
screen
=
QDesktopWidget
().
screenGeometry
()
size
=
self
.
geometry
()
self
.
move
((
screen
.
width
()
-
size
.
width
())
//
2
,(
screen
.
height
()
-
size
.
height
())
//
2
)
'''更新界面'''
def
updateWindow
(
self
):
self
.
external_board
.
updateData
()
self
.
side_panel
.
updateData
()
self
.
update
()
'''开始'''
def
start
(
self
):
if
self
.
is_started
:
return
self
.
is_started
=
True
self
.
inner_board
.
createNewTetris
()
self
.
timer
.
start
(
self
.
fps
,
self
)
'''暂停/不暂停'''
def
pause
(
self
):
if
not
self
.
is_started
:
return
self
.
is_paused
=
not
self
.
is_paused
if
self
.
is_paused
:
self
.
timer
.
stop
()
self
.
external_board
.
score_signal
.
emit
(
'Paused'
)
else
:
self
.
timer
.
start
(
self
.
fps
,
self
)
self
.
updateWindow
()
'''计时器事件'''
def
timerEvent
(
self
,
event
):
if
event
.
timerId
()
==
self
.
timer
.
timerId
():
removed_lines
=
self
.
inner_board
.
moveDown
()
self
.
external_board
.
score
+=
removed_lines
self
.
updateWindow
()
else
:
super
(
TetrisGame
,
self
).
timerEvent
(
event
)
'''按键事件'''
def
keyPressEvent
(
self
,
event
):
if
not
self
.
is_started
or
self
.
inner_board
.
current_tetris
==
tetrisShape
().
shape_empty
:
super
(
TetrisGame
,
self
).
keyPressEvent
(
event
)
return
key
=
event
.
key
()
#P键暂停
if
key
==
Qt
.
Key_P
:
self
.
pause
()
return
if
self
.
is_paused
:
return
#向左
elif
key
==
Qt
.
Key_Left
:
self
.
inner_board
.
moveLeft
()
#向右
elif
key
==
Qt
.
Key_Right
:
self
.
inner_board
.
moveRight
()
#旋转
elif
key
==
Qt
.
Key_Up
:
self
.
inner_board
.
rotateAnticlockwise
()
#快速坠落
elif
key
==
Qt
.
Key_Space
:
self
.
external_board
.
score
+=
self
.
inner_board
.
dropDown
()
else
:
super
(
TetrisGame
,
self
).
keyPressEvent
(
event
)
self
.
updateWindow
()
'''run'''
if
__name__
==
'__main__'
:
app
=
QApplication
([])
tetris
=
TetrisGame
()
sys
.
exit
(
app
.
exec_
())


微信扫码阅读·分享本文