python俄罗斯方块代码34行_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()

看一下效果:

b_0_202011061912327649.png

分数的显示就是利用上面 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

b_0_202011061912328120.png

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

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

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

b_0_202011061912336678.gif

是不是有内味了。

总结

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

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

希望与广大网友互动??

点此进行留言吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值