1
+ import os
2
+ import sys
3
+ import random
4
+ from modules import *
5
+ from PyQt5 .QtGui import *
6
+ from PyQt5 .QtCore import *
7
+ from PyQt5 .QtWidgets import *
8
+
9
+
10
+ '''定义俄罗斯方块游戏类'''
11
+ class TetrisGame (QMainWindow ):
12
+ def __init__ (self , parent = None ):
13
+ super (TetrisGame , self ).__init__ (parent )
14
+ # 是否暂停ing
15
+ self .is_paused = False
16
+ # 是否开始ing
17
+ self .is_started = False
18
+ self .initUI ()
19
+ '''界面初始化'''
20
+ def initUI (self ):
21
+ # icon
22
+ self .setWindowIcon (QIcon (os .path .join (os .getcwd (), 'resources/icon.jpg' )))
23
+ # 块大小
24
+ self .grid_size = 22
25
+ # 游戏帧率
26
+ self .fps = 200
27
+ self .timer = QBasicTimer ()
28
+ # 焦点
29
+ self .setFocusPolicy (Qt .StrongFocus )
30
+ # 水平布局
31
+ layout_horizontal = QHBoxLayout ()
32
+ self .inner_board = InnerBoard ()
33
+ self .external_board = ExternalBoard (self , self .grid_size , self .inner_board )
34
+ layout_horizontal .addWidget (self .external_board )
35
+ self .side_panel = SidePanel (self , self .grid_size , self .inner_board )
36
+ layout_horizontal .addWidget (self .side_panel )
37
+ self .status_bar = self .statusBar ()
38
+ self .external_board .score_signal [str ].connect (self .status_bar .showMessage )
39
+ self .start ()
40
+ self .center ()
41
+ self .setWindowTitle ('Tetris —— 九歌' )
42
+ self .show ()
43
+ self .setFixedSize (self .external_board .width () + self .side_panel .width (), self .side_panel .height () + self .status_bar .height ())
44
+ '''游戏界面移动到屏幕中间'''
45
+ def center (self ):
46
+ screen = QDesktopWidget ().screenGeometry ()
47
+ size = self .geometry ()
48
+ self .move ((screen .width () - size .width ()) // 2 , (screen .height () - size .height ()) // 2 )
49
+ '''更新界面'''
50
+ def updateWindow (self ):
51
+ self .external_board .updateData ()
52
+ self .side_panel .updateData ()
53
+ self .update ()
54
+ '''开始'''
55
+ def start (self ):
56
+ if self .is_started :
57
+ return
58
+ self .is_started = True
59
+ self .inner_board .createNewTetris ()
60
+ self .timer .start (self .fps , self )
61
+ '''暂停/不暂停'''
62
+ def pause (self ):
63
+ if not self .is_started :
64
+ return
65
+ self .is_paused = not self .is_paused
66
+ if self .is_paused :
67
+ self .timer .stop ()
68
+ self .external_board .score_signal .emit ('Paused' )
69
+ else :
70
+ self .timer .start (self .fps , self )
71
+ self .updateWindow ()
72
+ '''计时器事件'''
73
+ def timerEvent (self , event ):
74
+ if event .timerId () == self .timer .timerId ():
75
+ removed_lines = self .inner_board .moveDown ()
76
+ self .external_board .score += removed_lines
77
+ self .updateWindow ()
78
+ else :
79
+ super (TetrisGame , self ).timerEvent (event )
80
+ '''按键事件'''
81
+ def keyPressEvent (self , event ):
82
+ if not self .is_started or self .inner_board .current_tetris == tetrisShape ().shape_empty :
83
+ super (TetrisGame , self ).keyPressEvent (event )
84
+ return
85
+ key = event .key ()
86
+ # P键暂停
87
+ if key == Qt .Key_P :
88
+ self .pause ()
89
+ return
90
+ if self .is_paused :
91
+ return
92
+ # 向左
93
+ elif key == Qt .Key_Left :
94
+ self .inner_board .moveLeft ()
95
+ # 向右
96
+ elif key == Qt .Key_Right :
97
+ self .inner_board .moveRight ()
98
+ # 旋转
99
+ elif key == Qt .Key_Up :
100
+ self .inner_board .rotateAnticlockwise ()
101
+ # 快速坠落
102
+ elif key == Qt .Key_Space :
103
+ self .external_board .score += self .inner_board .dropDown ()
104
+ else :
105
+ super (TetrisGame , self ).keyPressEvent (event )
106
+ self .updateWindow ()
107
+
108
+
109
+ '''run'''
110
+ if __name__ == '__main__' :
111
+ app = QApplication ([])
112
+ tetris = TetrisGame ()
113
+ sys .exit (app .exec_ ())
0 commit comments