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