欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python如何写个俄罗斯方块

程序员文章站 2022-07-02 10:50:39
俄罗斯方块是俄罗斯人发明的一款休闲类的小游戏,这款小游戏可以说是很多人童年的主打电子游戏了,本文我们使用 python 来实现这款小游戏。游戏的基本规则是:移动、旋转和摆放游戏自动输出的各种方块,使之...

俄罗斯方块是俄罗斯人发明的一款休闲类的小游戏,这款小游戏可以说是很多人童年的主打电子游戏了,本文我们使用 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 = 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

python如何写个俄罗斯方块

我们知道方块是不断自动下落的,因此需要一个计时器来控制,主要实现代码如下:

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)

在方块下落的过程中,我们需要通过键盘来控制方块的形状以及左右移动,因此,我们需要一个按键事件来控制它,主要实现代码如下:

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)

当方块落到底部后,需要来检测是否有构成一条直线的,因此我们需要有一个方法来找到所有能消除的行并且消除它们,主要实现代码如下:

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

我们来看一下最终实现效果:

python如何写个俄罗斯方块

是不是有内味了。

总结

本文我们使用 pyqt5 库写了一个俄罗斯方块小游戏,如果你对 pyqt5 库感兴趣的话,可以尝试使用一下。

示例代码:py-tetris

以上就是python写个俄罗斯方块的详细内容,更多关于python 俄罗斯方块的资料请关注其它相关文章!