python是怎么实现简单的俄罗斯方块

python是怎么实现简单的俄罗斯方块

本篇文章为大家展示了python是怎么实现简单的俄罗斯方块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Python主要用来做什么

Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。

1. 案例介绍

俄罗斯方块是由 4 个小方块组成不同形状的板块,随机从屏幕上方落下,按方向键调整板块的位置和方向,在底部拼出完整的一行或几行。这些完整的横条会消失,给新落下来的板块腾出空间,并获得分数奖励。没有被消除掉的方块不断堆积,一旦堆到顶端,便告输,游戏结束。本例难度为高级,适合具有 Python 进阶和 Pygame 编程技巧的用户学习。

2. 设计要点

边框――由 15*25 个空格组成,方块就落在这里面。盒子――组成方块的其中小方块,是组成方块的基本单元。方块――从边框顶掉下的东西,游戏者可以翻转和改变位置。每个方块由 4 个盒子组成。形状――不同类型的方块。这里形状的名字被叫做 T, S, Z ,J, L, I , O。如下图所示:

模版――用一个列表存放形状被翻转后的所有可能样式。全部存放在变量里,变量名字如 S or J。着陆――当一个方块到达边框的底部或接触到在其他的盒子话,就说这个方块着陆了。那样的话,另一个方块就会开始下落。

3. 示例效果

4. 示例源码

importpygameimportrandomimportospygame.init()GRID_WIDTH=20GRID_NUM_WIDTH=15GRID_NUM_HEIGHT=25WIDTH,HEIGHT=GRID_WIDTH*GRID_NUM_WIDTH,GRID_WIDTH*GRID_NUM_HEIGHTSIDE_WIDTH=200SCREEN_WIDTH=WIDTH+SIDE_WIDTHWHITE=(0xff,0xff,0xff)BLACK=(0,0,0)LINE_COLOR=(0x33,0x33,0x33)CUBE_COLORS=[(0xcc,0x99,0x99),(0xff,0xff,0x99),(0x66,0x66,0x99),(0x99,0x00,0x66),(0xff,0xcc,0x00),(0xcc,0x00,0x33),(0xff,0x00,0x33),(0x00,0x66,0x99),(0xff,0xff,0x33),(0x99,0x00,0x33),(0xcc,0xff,0x66),(0xff,0x99,0x00)]screen=pygame.display.set_mode((SCREEN_WIDTH,HEIGHT))pygame.display.set_caption("俄罗斯方块")clock=pygame.time.Clock()FPS=30score=0level=1screen_color_matrix=[[None]*GRID_NUM_WIDTHforiinrange(GRID_NUM_HEIGHT)]#设置游戏的根目录为当前文件夹base_folder=os.path.dirname(__file__)defshow_text(surf,text,size,x,y,color=WHITE):font_name=os.path.join(base_folder,'font/font.ttc')font=pygame.font.Font(font_name,size)text_surface=font.render(text,True,color)text_rect=text_surface.get_rect()text_rect.midtop=(x,y)surf.blit(text_surface,text_rect)classCubeShape(object):SHAPES=['I','J','L','O','S','T','Z']I=[[(0,-1),(0,0),(0,1),(0,2)],[(-1,0),(0,0),(1,0),(2,0)]]J=[[(-2,0),(-1,0),(0,0),(0,-1)],[(-1,0),(0,0),(0,1),(0,2)],[(0,1),(0,0),(1,0),(2,0)],[(0,-2),(0,-1),(0,0),(1,0)]]L=[[(-2,0),(-1,0),(0,0),(0,1)],[(1,0),(0,0),(0,1),(0,2)],[(0,-1),(0,0),(1,0),(2,0)],[(0,-2),(0,-1),(0,0),(-1,0)]]O=[[(0,0),(0,1),(1,0),(1,1)]]S=[[(-1,0),(0,0),(0,1),(1,1)],[(1,-1),(1,0),(0,0),(0,1)]]T=[[(0,-1),(0,0),(0,1),(-1,0)],[(-1,0),(0,0),(1,0),(0,1)],[(0,-1),(0,0),(0,1),(1,0)],[(-1,0),(0,0),(1,0),(0,-1)]]Z=[[(0,-1),(0,0),(1,0),(1,1)],[(-1,0),(0,0),(0,-1),(1,-1)]]SHAPES_WITH_DIR={'I':I,'J':J,'L':L,'O':O,'S':S,'T':T,'Z':Z}def__init__(self):self.shape=self.SHAPES[random.randint(0,len(self.SHAPES)-1)]#骨牌所在的行列self.center=(2,GRID_NUM_WIDTH//2)self.dir=random.randint(0,len(self.SHAPES_WITH_DIR[self.shape])-1)self.color=CUBE_COLORS[random.randint(0,len(CUBE_COLORS)-1)]defget_all_gridpos(self,center=None):curr_shape=self.SHAPES_WITH_DIR[self.shape][self.dir]ifcenterisNone:center=[self.center[0],self.center[1]]return[(cube[0]+center[0],cube[1]+center[1])forcubeincurr_shape]defconflict(self,center):forcubeinself.get_all_gridpos(center):#超出屏幕之外,说明不合法ifcube[0]<0orcube[1]<0orcube[0]>=GRID_NUM_HEIGHTor\cube[1]>=GRID_NUM_WIDTH:returnTrue#不为None,说明之前已经有小方块存在了,也不合法ifscreen_color_matrix[cube[0]][cube[1]]isnotNone:returnTruereturnFalsedefrotate(self):new_dir=self.dir+1new_dir%=len(self.SHAPES_WITH_DIR[self.shape])old_dir=self.dirself.dir=new_dirifself.conflict(self.center):self.dir=old_dirreturnFalsedefdown(self):#importpdb;pdb.set_trace()center=(self.center[0]+1,self.center[1])ifself.conflict(center):returnFalseself.center=centerreturnTruedefleft(self):center=(self.center[0],self.center[1]-1)ifself.conflict(center):returnFalseself.center=centerreturnTruedefright(self):center=(self.center[0],self.center[1]+1)ifself.conflict(center):returnFalseself.center=centerreturnTruedefdraw(self):forcubeinself.get_all_gridpos():pygame.draw.rect(screen,self.color,(cube[1]*GRID_WIDTH,cube[0]*GRID_WIDTH,GRID_WIDTH,GRID_WIDTH))pygame.draw.rect(screen,WHITE,(cube[1]*GRID_WIDTH,cube[0]*GRID_WIDTH,GRID_WIDTH,GRID_WIDTH),1)defdraw_grids():foriinrange(GRID_NUM_WIDTH):pygame.draw.line(screen,LINE_COLOR,(i*GRID_WIDTH,0),(i*GRID_WIDTH,HEIGHT))foriinrange(GRID_NUM_HEIGHT):pygame.draw.line(screen,LINE_COLOR,(0,i*GRID_WIDTH),(WIDTH,i*GRID_WIDTH))pygame.draw.line(screen,WHITE,(GRID_WIDTH*GRID_NUM_WIDTH,0),(GRID_WIDTH*GRID_NUM_WIDTH,GRID_WIDTH*GRID_NUM_HEIGHT))defdraw_matrix():fori,rowinzip(range(GRID_NUM_HEIGHT),screen_color_matrix):forj,colorinzip(range(GRID_NUM_WIDTH),row):ifcolorisnotNone:pygame.draw.rect(screen,color,(j*GRID_WIDTH,i*GRID_WIDTH,GRID_WIDTH,GRID_WIDTH))pygame.draw.rect(screen,WHITE,(j*GRID_WIDTH,i*GRID_WIDTH,GRID_WIDTH,GRID_WIDTH),2)defdraw_score():show_text(screen,u'得分:{}'.format(score),20,WIDTH+SIDE_WIDTH//2,100)defremove_full_line():globalscreen_color_matrixglobalscoregloballevelnew_matrix=[[None]*GRID_NUM_WIDTHforiinrange(GRID_NUM_HEIGHT)]index=GRID_NUM_HEIGHT-1n_full_line=0foriinrange(GRID_NUM_HEIGHT-1,-1,-1):is_full=Trueforjinrange(GRID_NUM_WIDTH):ifscreen_color_matrix[i][j]isNone:is_full=Falsecontinueifnotis_full:new_matrix[index]=screen_color_matrix[i]index-=1else:n_full_line+=1score+=n_full_linelevel=score//20+1screen_color_matrix=new_matrixdefshow_welcome(screen):show_text(screen,u'俄罗斯方块',30,WIDTH/2,HEIGHT/2)show_text(screen,u'按任意键开始游戏',20,WIDTH/2,HEIGHT/2+50)running=Truegameover=Truecounter=0live_cube=Nonewhilerunning:clock.tick(FPS)foreventinpygame.event.get():ifevent.type==pygame.QUIT:running=Falseelifevent.type==pygame.KEYDOWN:ifgameover:gameover=Falselive_cube=CubeShape()breakifevent.key==pygame.K_LEFT:live_cube.left()elifevent.key==pygame.K_RIGHT:live_cube.right()elifevent.key==pygame.K_DOWN:live_cube.down()elifevent.key==pygame.K_UP:live_cube.rotate()elifevent.key==pygame.K_SPACE:whilelive_cube.down()==True:passremove_full_line()#level是为了方便游戏的难度,level越高FPS//level的值越小#这样屏幕刷新的就越快,难度就越大ifgameoverisFalseandcounter%(FPS//level)==0:#down表示下移骨牌,返回False表示下移不成功,可能超过了屏幕或者和之前固定的#小方块冲突了iflive_cube.down()==False:forcubeinlive_cube.get_all_gridpos():screen_color_matrix[cube[0]][cube[1]]=live_cube.colorlive_cube=CubeShape()iflive_cube.conflict(live_cube.center):gameover=Truescore=0live_cube=Nonescreen_color_matrix=[[None]*GRID_NUM_WIDTHforiinrange(GRID_NUM_HEIGHT)]#消除满行remove_full_line()counter+=1#更新屏幕screen.fill(BLACK)draw_grids()draw_matrix()draw_score()iflive_cubeisnotNone:live_cube.draw()ifgameover:show_welcome(screen)pygame.display.update()

上述内容就是python是怎么实现简单的俄罗斯方块,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注恰卡编程网行业资讯频道。

发布于 2022-01-17 22:02:50
分享
海报
45
上一篇:Easyx如何实现扫雷游戏 下一篇:javascript失去焦点的事件方法是什么
目录

    忘记密码?

    图形验证码