亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

python如何寫個俄羅斯方塊

瀏覽:2日期:2022-07-06 10:05:05

俄羅斯方塊是俄羅斯人發明的一款休閑類的小游戲,這款小游戲可以說是很多人童年的主打電子游戲了,本文我們使用 Python 來實現這款小游戲。

游戲的基本規則是:移動、旋轉和擺放游戲自動輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。

實現

我們實現俄羅斯方塊,主要用到的是 PyQt5 庫,安裝使用 pip install PyQt5 即可,游戲的組成比較簡單,主要包括:主界面、各種方塊和計分板,下面我們來看一下具體實現。

首先,我們來畫一個主界面,主要實現代碼如下:

class MainBoard(QFrame): msg = pyqtSignal(str) BoardWidth = 10 BoardHeight = 20 Speed = 300 def __init__(self, parent): super().__init__(parent) self.initBoard() def initBoard(self): self.timer = QBasicTimer() self.isWaitingAfterLine = False self.curX = 0 self.curY = 0 self.numLinesRemoved = 0 self.board = [] self.setFocusPolicy(Qt.StrongFocus) self.isStarted = False self.isPaused = False self.clearBoard()

看一下效果:

python如何寫個俄羅斯方塊

分數的顯示就是利用上面 msg 的 emit() 方法實現的。

我們接著畫各種方塊,方塊的形狀主要包括:T、Z、L、I、O 等,主要實現代碼如下:

class ShapeForm(object): NoShape = 0 ZShape = 1 SShape = 2 LineShape = 3 TShape = 4 SquareShape = 5 LShape = 6 MirroredLShape = 7class Shape(object): coordsTable = ( ((0, 0), (0, 0), (0, 0), (0, 0)), ((0, -1), (0, 0), (-1, 0), (-1, 1)), ((0, -1), (0, 0), (1, 0), (1, 1)), ((0, -1), (0, 0), (0, 1), (0, 2)), ((-1, 0), (0, 0), (1, 0), (0, 1)), ((0, 0), (1, 0), (0, 1), (1, 1)), ((-1, -1), (0, -1), (0, 0), (0, 1)), ((1, -1), (0, -1), (0, 0), (0, 1)) ) def __init__(self): self.coords = [[0,0] for i in range(4)] self.pieceShape = ShapeForm.NoShape self.setShape(ShapeForm.NoShape) def shape(self): return self.pieceShape def setShape(self, shape): table = Shape.coordsTable[shape] for i in range(4): for j in range(2): self.coords[i][j] = table[i][j] self.pieceShape = shape

python如何寫個俄羅斯方塊

我們知道方塊是不斷自動下落的,因此需要一個計時器來控制,主要實現代碼如下:

def timerEvent(self, event):if event.timerId() == self.timer.timerId():if self.isWaitingAfterLine:self.isWaitingAfterLine = Falseself.newPiece()else:self.oneLineDown()else:super(MainBoard, self).timerEvent(event)

在方塊下落的過程中,我們需要通過鍵盤來控制方塊的形狀以及左右移動,因此,我們需要一個按鍵事件來控制它,主要實現代碼如下:

def keyPressEvent(self, event):if not self.isStarted or self.curPiece.shape() == ShapeForm.NoShape:super(MainBoard, self).keyPressEvent(event)returnkey = event.key()if key == Qt.Key_P:self.pause()returnif self.isPaused:returnelif key == Qt.Key_Left:self.tryMove(self.curPiece, self.curX - 1, self.curY)elif key == Qt.Key_Right:self.tryMove(self.curPiece, self.curX + 1, self.curY)elif key == Qt.Key_Down:self.tryMove(self.curPiece.rotateRight(), self.curX, self.curY)elif key == Qt.Key_Up:self.tryMove(self.curPiece.rotateLeft(), self.curX, self.curY)elif key == Qt.Key_Space:self.dropDown()elif key == Qt.Key_D:self.oneLineDown()else:super(MainBoard, self).keyPressEvent(event)

當方塊落到底部后,需要來檢測是否有構成一條直線的,因此我們需要有一個方法來找到所有能消除的行并且消除它們,主要實現代碼如下:

def removeFullLines(self):numFullLines = 0rowsToRemove = []for i in range(MainBoard.BoardHeight):n = 0for j in range(MainBoard.BoardWidth):if not self.shapeAt(j, i) == ShapeForm.NoShape:n = n + 1if n == 10:rowsToRemove.append(i)rowsToRemove.reverse()for m in rowsToRemove:for k in range(m, MainBoard.BoardHeight):for l in range(MainBoard.BoardWidth):self.setShapeAt(l, k, self.shapeAt(l, k + 1))numFullLines = numFullLines + len(rowsToRemove)if numFullLines > 0:self.numLinesRemoved = self.numLinesRemoved + numFullLinesself.msg.emit(str(self.numLinesRemoved))self.isWaitingAfterLine = Trueself.curPiece.setShape(ShapeForm.NoShape)self.update()

我們來看一下最終實現效果:

python如何寫個俄羅斯方塊

是不是有內味了。

總結

本文我們使用 PyQt5 庫寫了一個俄羅斯方塊小游戲,如果你對 PyQt5 庫感興趣的話,可以嘗試使用一下。

示例代碼:py-tetris

以上就是python寫個俄羅斯方塊的詳細內容,更多關于python 俄羅斯方塊的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 日韩a毛片 | 久久国产免费观看精品3 | 亚洲精品乱码国产精品乱码 | 妞干网在线免费视频 | 亚洲七七久久精品中文国产 | a一级毛片免费播放 | 国产青草视频 | 鲁大师成人一区二区三区 | 91.久久| 亚洲一区二区三区在线网站 | 网址大全在线免费观看 | 欧美日韩国产在线成人网 | 国产蜜臀 | 女人国产香蕉久久精品 | 黄色大片视频在线观看 | 日韩美a一级毛片 | 中中文字幕亚州无线码 | 国产成人精品高清不卡在线 | 国产成+人+综合+亚洲 欧美 | 国产aav| 毛片在线不卡 | 欧美成人禁片在线www | 日本美女一区二区 | 欧美久久一区二区 | 亚洲综合激情另类图片专区 | 青青视频国产在线播放 | 国产在热线精品视频国产一二 | 亚洲欧美日韩中文v在线 | 久久成人国产精品二三区 | 国语一级毛片私人影院 | 欧美换爱交换乱理伦片免费观看 | 特级毛片aaaa级毛片免费 | 一级做a爰片久久毛片欧美 一级做a爰片久久毛片图片 | 萌白酱粉嫩福利视频在线观看 | 国产精品免费精品自在线观看 | 亚洲高清在线看 | 伊人久久欧美综合精品 | 亚洲福利国产精品17p | 黄色国产片 | 久久99国产精品久久99无号码 | 日本特黄特黄aaaaa大片 |