俄罗斯方块小游戏是当年风靡一时的小游戏,该游戏由一个棋盘组成,该棋盘跨度为10个单元格,高度为20个单元格,如下所示。 俄罗斯方块小游戏 关于此小游戏的规则,我们不再介绍,本期文章主要用代码来实现,我们知道俄罗斯方块小游戏主要有如下7个方块组成,我们在代码中使用字母O,I,S,Z,L,J和T表示它们。 俄罗斯方块使用OpenCV和python创建俄罗斯方块importcv2importnumpyasnpfromrandomimportchoiceSPEED1控制速度boardnp。uint8(np。zeros(〔20,10,3〕))quitFalseplaceFalsedropFalseswitchFalseheldpieceflag0score0 首先我们导入需要的第三方库以及定义好需要的变量所有方块造型nextpiecechoice(〔O,I,S,Z,L,J,T〕)defgetinfo(piece):ifpieceI:coordsnp。array(〔〔0,3〕,〔0,4〕,〔0,5〕,〔0,6〕〕)color〔255,155,15〕elifpieceT:coordsnp。array(〔〔1,3〕,〔1,4〕,〔1,5〕,〔0,4〕〕)color〔138,41,175〕elifpieceL:coordsnp。array(〔〔1,3〕,〔1,4〕,〔1,5〕,〔0,5〕〕)color〔2,91,227〕elifpieceJ:coordsnp。array(〔〔1,3〕,〔1,4〕,〔1,5〕,〔0,3〕〕)color〔198,65,33〕elifpieceS:coordsnp。array(〔〔1,5〕,〔1,4〕,〔0,3〕,〔0,4〕〕)color〔55,15,215〕elifpieceZ:coordsnp。array(〔〔1,3〕,〔1,4〕,〔0,4〕,〔0,5〕〕)color〔1,177,89〕else:coordsnp。array(〔〔0,4〕,〔0,5〕,〔1,4〕,〔1,5〕〕)color〔2,159,227〕returncoords,color 然后我们建立7个俄罗斯方块的造型与颜色,以上建立完成后,我们需要搭建一个游戏界面以及鼠标控制事件defdisplay(board,coords,color,nextinfo,heldinfo,score,SPEED):bordernp。uint8(127np。zeros(〔20,1,3〕))bordernp。uint8(127np。zeros(〔1,34,3〕))dummyboard。copy()dummy〔coords〔:,0〕,coords〔:,1〕〕colorrightnp。uint8(np。zeros(〔20,10,3〕))right〔nextinfo〔0〕〔:,0〕2,nextinfo〔0〕〔:,1〕〕nextinfo〔1〕leftnp。uint8(np。zeros(〔20,10,3〕))left〔heldinfo〔0〕〔:,0〕2,heldinfo〔0〕〔:,1〕〕heldinfo〔1〕dummynp。concatenate((border,left,border,dummy,border,right,border),1)dummynp。concatenate((border,dummy,border),0)dummydummy。repeat(20,0)。repeat(20,1)dummycv2。putText(dummy,str(score),(520,200),cv2。FONTHERSHEYDUPLEX,1,〔0,0,255〕,2)控制键dummycv2。putText(dummy,Amoveleft,(45,200),cv2。FONTHERSHEYDUPLEX,0。6,〔0,0,255〕)dummycv2。putText(dummy,Dmoveright,(45,225),cv2。FONTHERSHEYDUPLEX,0。6,〔0,0,255〕)dummycv2。putText(dummy,Smovedown,(45,250),cv2。FONTHERSHEYDUPLEX,0。6,〔0,0,255〕)dummycv2。putText(dummy,Wharddrop,(45,275),cv2。FONTHERSHEYDUPLEX,0。6,〔0,0,255〕)dummycv2。putText(dummy,Jrotateleft,(45,300),cv2。FONTHERSHEYDUPLEX,0。6,〔0,0,255〕)dummycv2。putText(dummy,Lrotateright,(45,325),cv2。FONTHERSHEYDUPLEX,0。6,〔0,0,255〕)dummycv2。putText(dummy,Ihold,(45,350),cv2。FONTHERSHEYDUPLEX,0。6,〔0,0,255〕)cv2。imshow(Tetris,dummy)keycv2。waitKey(int(1000SPEED))returnkey 游戏界面 搭建的游戏界面如上,我们在界面左边显示每个鼠标按键的功能,中间是主游戏区域,最右边为积分区域 以上建立完成后,我们开始主函数的部分 我们有一个while循环,在每次迭代中,我们都会在游戏中放置一个新棋子。 在俄罗斯方块中,我们可以按某个键来固定一块。通过与当前方块交换,可以保留将来使用的一种方块。 在下面的代码中,我们首先检查用户是否要使用switch变量将当前方块与保留的方块交换。如果switch变量设置为false,我们将分配currentpiece,nextpiece并随机选择一个newnextpieceifnamemain:whilenotquit:ifswitch:heldpiece,currentpiececurrentpiece,heldpieceswitchFalseelse:currentpiecenextpiecenextpiecechoice(〔I,T,L,J,Z,S,O〕)ifflag