欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python如何寫個俄羅斯方塊

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

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

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

實現(xiàn)

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

首先,我們來畫一個主界面,主要實現(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() 方法實現(xiàn)的。

我們接著畫各種方塊,方塊的形狀主要包括:T、Z、L、I、O 等,主要實現(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

我們知道方塊是不斷自動下落的,因此需要一個計時器來控制,主要實現(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)

在方塊下落的過程中,我們需要通過鍵盤來控制方塊的形狀以及左右移動,因此,我們需要一個按鍵事件來控制它,主要實現(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)方塊落到底部后,需要來檢測是否有構(gòu)成一條直線的,因此我們需要有一個方法來找到所有能消除的行并且消除它們,主要實現(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()

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

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

總結(jié)

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

示例代碼:py-tetris

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

相關(guān)文章

  • 使用python分析統(tǒng)計自己微信朋友的信息

    使用python分析統(tǒng)計自己微信朋友的信息

    這篇文章主要介紹了python分析統(tǒng)計自己微信朋友的信息,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • 淺談基于Pytest框架的自動化測試開發(fā)實踐

    淺談基于Pytest框架的自動化測試開發(fā)實踐

    Pytest是Python的一種易用、高效和靈活的單元測試框架,本文主要介紹了基于Pytest框架的自動化測試開發(fā)實踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Python正則表達(dá)式教程之二:捕獲篇

    Python正則表達(dá)式教程之二:捕獲篇

    什么是捕獲呢?使用小括號指定一個子表達(dá)式后,匹配這個子表達(dá)式的文本(即匹配的內(nèi)容)可以在表達(dá)式或者其他過程中接著用,下面這篇文章就主要介紹了Python正則表達(dá)式中關(guān)于捕獲的相關(guān)資料,需要的朋友可以參考下。
    2017-03-03
  • Python使用Gzip解壓的示例詳解

    Python使用Gzip解壓的示例詳解

    Python?中構(gòu)建了許多用于壓縮和解壓縮目的的庫,本文為大家介紹的Gzip庫就是一種流行的數(shù)據(jù)壓縮工具,下面我們就來看看如何使用?gzip?解壓縮來解壓縮壓縮內(nèi)容吧
    2023-11-11
  • Python實現(xiàn)語音識別和語音合成功能

    Python實現(xiàn)語音識別和語音合成功能

    聲音的本質(zhì)是震動,震動的本質(zhì)是位移關(guān)于時間的函數(shù),波形文件(.wav)中記錄了不同采樣時刻的位移。這篇文章主要介紹了Python實現(xiàn)語音識別和語音合成,需要的朋友可以參考下
    2019-09-09
  • 如何使用?Python為你的在線會議創(chuàng)建一個假的攝像頭

    如何使用?Python為你的在線會議創(chuàng)建一個假的攝像頭

    這篇文章主要介紹了使用?Python為你的在線會議創(chuàng)建一個假的攝像頭,在?Python?的幫助下,不再強(qiáng)制開啟攝像頭,將向你展示如何為你的在線會議創(chuàng)建一個假的攝像頭,需要的朋友可以參考下
    2022-08-08
  • pandas中std和numpy的np.std區(qū)別及說明

    pandas中std和numpy的np.std區(qū)別及說明

    這篇文章主要介紹了pandas中std和numpy的np.std區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Pytorch之tensorboard無法啟動和顯示問題及解決

    Pytorch之tensorboard無法啟動和顯示問題及解決

    這篇文章主要介紹了Pytorch之tensorboard無法啟動和顯示問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python global和nonlocal用法解析

    python global和nonlocal用法解析

    這篇文章主要介紹了python global和nonlocal用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Python大批量寫入數(shù)據(jù)(百萬級別)的方法

    Python大批量寫入數(shù)據(jù)(百萬級別)的方法

    這篇文章主要給大家介紹了關(guān)于Python大批量寫入數(shù)據(jù)(百萬級別)的相關(guān)資料,在日常處理數(shù)據(jù)的過程中,我們都有批量寫入數(shù)據(jù)的需求,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下
    2023-07-07

最新評論