最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python如何寫個(gè)俄羅斯方塊

 更新時(shí)間:2020年11月06日 11:48:00   作者:Python技術(shù)  
這篇文章主要介紹了python寫個(gè)俄羅斯方塊,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

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

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

實(shí)現(xiàn)

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

首先,我們來畫一個(gè)主界面,主要實(shí)現(xiàn)代碼如下:

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

看一下效果:

分?jǐn)?shù)的顯示就是利用上面 msg 的 emit() 方法實(shí)現(xiàn)的。

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

class ShapeForm(object):
 NoShape = 0
 ZShape = 1
 SShape = 2
 LineShape = 3
 TShape = 4
 SquareShape = 5
 LShape = 6
 MirroredLShape = 7

class 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

我們知道方塊是不斷自動(dòng)下落的,因此需要一個(gè)計(jì)時(shí)器來控制,主要實(shí)現(xiàn)代碼如下:

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

在方塊下落的過程中,我們需要通過鍵盤來控制方塊的形狀以及左右移動(dòng),因此,我們需要一個(gè)按鍵事件來控制它,主要實(shí)現(xiàn)代碼如下:

def keyPressEvent(self, event):
	if not self.isStarted or self.curPiece.shape() == ShapeForm.NoShape:
		super(MainBoard, self).keyPressEvent(event)
		return
	key = event.key()
	if key == Qt.Key_P:
		self.pause()
		return
	if self.isPaused:
		return
	elif 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)

當(dāng)方塊落到底部后,需要來檢測(cè)是否有構(gòu)成一條直線的,因此我們需要有一個(gè)方法來找到所有能消除的行并且消除它們,主要實(shí)現(xiàn)代碼如下:

def removeFullLines(self):
	numFullLines = 0
	rowsToRemove = []
	for i in range(MainBoard.BoardHeight):
		n = 0
		for j in range(MainBoard.BoardWidth):
			if not self.shapeAt(j, i) == ShapeForm.NoShape:
				n = n + 1
		if 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 + numFullLines
		self.msg.emit(str(self.numLinesRemoved))
		self.isWaitingAfterLine = True
		self.curPiece.setShape(ShapeForm.NoShape)
		self.update()

我們來看一下最終實(shí)現(xiàn)效果:

是不是有內(nèi)味了。

總結(jié)

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

示例代碼:py-tetris

以上就是python寫個(gè)俄羅斯方塊的詳細(xì)內(nèi)容,更多關(guān)于python 俄羅斯方塊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

津市市| 五大连池市| 铜鼓县| 汽车| 交城县| 通榆县| 芮城县| 徐水县| 西青区| 元江| 佛坪县| 儋州市| 渝北区| 明光市| 司法| 炉霍县| 栖霞市| 吉林市| 望都县| 丰都县| 鄂尔多斯市| 嘉定区| 唐山市| 古丈县| 盖州市| 西充县| 通辽市| 武隆县| 邯郸县| 奉新县| 察雅县| 潜山县| 凭祥市| 呼图壁县| 宝丰县| 吐鲁番市| 武城县| 沐川县| 关岭| 闸北区| 台前县|