Python--小游戏俄罗斯方块

源码分享:

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

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 —— 九歌')

        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_())

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值