使用pygame实现简单的俄罗斯方块,实现了强降、预降位置显示等功能。

后期可以自定义方块皮肤,并加入了T旋Z旋等功能,该部分的代码见https://blog.csdn.net/qq_52529296/article/details/130539812。

import os
import pygame,sys,random,copy,timepygame.init()
pygame.mixer.init()
pygame.display.set_caption('俄罗斯方块1.0')'''操作设置'''
left = pygame.K_LEFT
right = pygame.K_RIGHT
down = pygame.K_DOWN
spi_r = pygame.K_UP#右旋-上键
spi_l = pygame.K_3#左旋-3
change = pygame.K_1#保留-1
plunge = pygame.K_SPACE#强降-空格
again = pygame.K_2#重新游戏
leve = 1#难度等级,数字越大,下落越快
'''绘制屏幕'''
screen   = pygame.display.set_mode((500,700))#屏幕大小
screen.fill("pink")'''基础方块绘制'''
size=30#方块规格
sore = 10#分数单位
sores = [0]#记录总分
#基础方块的绘制
face  = pygame.Surface((size,size),flags=pygame.HWSURFACE)
face.fill("white")
pygame.draw.rect(face, (0, 0, 0), [0,0,size,size],1)
pygame.draw.circle(face, (255, 0, 0), (15,15), 15, width=1)
#基础方块的投影绘制
face1  = pygame.Surface((size,size),flags=pygame.HWSURFACE)
face1.fill((255,255,255,0))
pygame.draw.rect(face1, (0, 0, 0,0), [0,0,size,size],1)
pygame.draw.circle(face1, (255, 0, 0,0), (15,15), 15, width=1)
face1.set_alpha(100)#设置透明度
#字体设置
f = pygame.font.SysFont(['方正粗黑宋简体'],30)#分数显示等需要用的字体
f1 = pygame.font.SysFont(['方正粗黑宋简体'],50)'''地图参数设置'''
origin=(10,10)                           #原点位置,边框的宽度
set = [4*size+origin[0],origin[1]+0]     #初始生成方块位置,该坐标全局控制当前形状的位置
c_list=(2,4,6,7,14,16,19)#分别为7种大类型的方块,见方块类型函数
ch1 = [ c_list[random.randint(0,6)]  for i in range(4)] #初始方块产生随机函数
ch1.append(0)#ch1为一个有装4个值的列表,前三个为即将出现的三个形状的标号,第四个为保留的形状的标号,开始时没有,定为0
filled = []#落地方块储存列表
n=[0]#控制是否能更换当前手中方块
control = [1]#控制游戏结束,0为结束'''方块类型函数'''
#c为方块类型标号,为原点位置即origin=(10,10),
# 该函数最终输出一个列表,其中包含6个坐标,即为一个形状(包含四个基础方块)的四个方块坐标和四个方块中最小的x,y和最大的x,y,方便之后的碰撞判断
def forms(c,a):#长条if c == 1:x0 = 0y0 = 0x1 = 0y1 = -1x2 = 0y2 = 2x3 = 0y3 = 1if c == 2:#横条x0 = 0y0 = 0x1 = -1y1 = 0x2 = 1y2 = 0x3 = 2y3 = 0# Sif c==3:x0 = 0y0 = 0x1 = 0y1 = 1x2 = -1y2 = 0x3 = -1y3 = -1if c == 4:x0 = 0y0 = 0x1 = -1y1 = 0x2 = 0y2 = -1x3 = 1y3 = -1#Zif c==5:x0 = 0y0 = 0x1 = 1y1 = 0x2 = 0y2 = 1x3 = 1y3 = -1if c==6:x0 = 0y0 = 0x1 = -1y1 = 0x2 = 0y2 = 1x3 = 1y3 = 1
#Tif c==7:x0 = 0y0 = 0x1 = 1y1 = 0x2 = -1y2 = 0x3 = 0y3 = -1if c==8:x0 = 0y0 = 0x1 = 0y1 = -1x2 = 0y2 = 1x3 = 1y3 = 0if c==9:x0 = 0y0 = 0x1 = -1y1 = 0x2 = 0y2 = 1x3 = 1y3 = 0if c==10:x0 = 0y0 = 0x1 = 0y1 = 1x2 = 0y2 = -1x3 = -1y3 = 0#Lif c==11:x0 = 0y0 = 0x1 = 0y1 = -1x2 = 0y2 = 1x3 = 1y3 = 1if c==12:x0 = 0y0 = 0x1 = -1y1 = 0x2 = 1y2 = 0x3 = -1y3 = 1if c==13:x0 = 0y0 = 0x1 = 0y1 = -1x2 = 0y2 = 1x3 = -1y3 = -1if c==14:x0 = 0y0 = 0x1 = -1y1 = 0x2 = 1y2 = 0x3 = 1y3 = -1#Jif c==15:x0 = 0y0 = 0x1 = 0y1 = -1x2 = 0y2 = 1x3 = -1y3 = 1if c==16:x0 = 0y0 = 0x1 = -1y1 = -1x2 = -1y2 = 0x3 = 1y3 = 0if c==17:x0 = 0y0 = 0x1 = 0y1 = 1x2 = 0y2 = -1x3 = 1y3 = -1if c==18:x0 = 0y0 = 0x1 = -1y1 = 0x2 = 1y2 = 0x3 = 1y3 = 1# 田if c == 19:x0 = 0y0 = 0x1 = 0y1 = 1x2 = -1y2 = 0x3 = -1y3 = 1mx = max(x0,x1,x2,x3)my = max(y0,y1,y2,y3)mx1 = min(x0, x1, x2,x3)my1 = min(y0, y1, y2,y3)Z=[[x0*size+a[0],y0*size+a[1]],[x1*size+a[0],y1*size+a[1]],[x2*size+a[0],y2*size+a[1]],[x3*size+a[0],y3*size+a[1]],[mx1*size+a[0],my1*size+a[1]],[mx*size+a[0],my*size+a[1]]]return Z'''屏幕更新函数'''
def update():# 游戏框绘制screen.fill("pink")pygame.draw.line(screen, (0, 0, 250), (0, 0), (size * 10 + origin[0], 0), origin[1])pygame.draw.line(screen, (0, 0, 250), (0, 0), (0, size * 20 + origin[1]), origin[0])pygame.draw.line(screen, (0, 0, 250), (size * 10+origin[0] , 0), (size * 10 +origin[0], size * 20+origin[1] ), origin[0])pygame.draw.line(screen, (0, 0, 250), (0, origin[1]+size * 20), (size * 10 + origin[0], size * 20+origin[1] ), origin[1])isclear(filled)#方块绘制for i in range(4):#当前方块screen.blit(face,forms(ch1[0],set)[i])#计算预降位置,找到当前形状与已落地方块的距离a = 19 * size - forms(ch1[0], set)[5][1] + origin[1]for i in filled:for j in range(4):for k in range(4):if i[j][0] == forms(ch1[0], set)[k][0]:#x相同的时候,找到符合要求的最y值,即当前形状与已落地方块的距离if a > i[j][1] - forms(ch1[0], set)[k][1] - size:a = i[j][1] - forms(ch1[0], set)[k][1] - sizefor i in range(4):#方块预降位置绘制screen.blit(face1,forms(ch1[0],(set[0],set[1]+a))[i])#将出现的方块预览绘制,可以预览3个形状for i in range(4):screen.blit(face,forms(ch1[1],(330+2*size,120+2*size))[i])for i in range(4):screen.blit(face,forms(ch1[2],(330+2*size,120+6*size))[i])for i in range(4):screen.blit(face,forms(ch1[3],(330+2*size,120+10*size))[i])if ch1[4]!=0:#有保留的形状时绘制,其值为0时没有保留的形状for i in range(4):screen.blit(face,forms(ch1[4],(330+2*size,120+14*size))[i])#落地方块绘制for i  in filled:for j in range(4):screen.blit(face, i[j])#分数绘制sor =  f.render("sore:"+str(sores[0]),True,(0,0,0),(246,127,240))screen.blit(sor, (335, 50))#判断游戏是否结束if iscrash(forms(ch1[0],set),filled)[0]==0 and forms(ch1[0],set)[5][1]==origin[1]:control[0]=0
#绘制游戏结束界面并判断游戏是否继续if control[0]==0:sor1 = f1.render("game over!!", True, (255, 0, 0), (255, 255, 255))screen.blit(sor1, (100, 300))for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == again:filled.clear()set[0]=origin[0]+4*sizeset[1]=origin[1]+0sores[0]=0control[0]=1pygame.display.flip()#更新屏幕'''方块控制函数
控制原理为改变set列表中的横纵坐标对形状的位置进行控制,
但该版本还未解决长按连续移动的问题'''
def move():#获取键盘事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key== left:#左移动set[0] -= sizeif iscrash(forms(ch1[0], set), filled)[2] == 2:set[0] += sizeif event.key == right:set[0] += sizeif iscrash(forms(ch1[0], set), filled)[1] == 1:set[0] -= sizeif event.key == down:#加速下降set[1] += sizeif event.key == spi_r:#右旋m = ch1[0]spin(0)for i in filled:for j in range(4):for k in range(4):if i[j][0]==forms(ch1[0],set)[k][0] and i[j][1]==forms(ch1[0],set)[k][1]:ch1[0]=mif event.key == spi_l:#左旋m = ch1[0]spin(1)for i in filled:for j in range(4):for k in range(4):if i[j][0]==forms(ch1[0],set)[k][0] and i[j][1]==forms(ch1[0],set)[k][1]:ch1[0]=mif event.key ==  change:#保留if n[0]==0:if ch1[4]==0:if ch1[0] == 19:ch1[4]=19if ch1[0]>=1 and ch1[0]<=2:ch1[4] = 2if ch1[0]>=3 and ch1[0]<=4:ch1[4] = 4if ch1[0]>=5 and ch1[0]<=6:ch1[4] = 6if ch1[0]>=7 and ch1[0]<=10:ch1[4] = 7if ch1[0]>=11 and ch1[0]<=14:ch1[4] = 14if ch1[0]>=15 and ch1[0]<=18:ch1[4] = 16ch1[0] = ch1[1]ch1[1]=ch1[2]ch1[2]=ch1[3]ch1[3]=c_list[random.randint(0,6)]set[0] =4 * size + origin[0]set[1]=origin[1] + 0n[0]=1else:v=ch1[0]ch1[0] = ch1[4]if v == 19:ch1[4]=19if v>=1 and v<=2:ch1[4] = 2if v>=3 and v<=4:ch1[4] = 4if v>=5 and v<=6:ch1[4] = 6if v>=7 and v<=10:ch1[4] = 7if v>=11 and v<=14:ch1[4] = 14if v>=15 and v<=18:ch1[4] = 16set[0] = 4 * size + origin[0]set[1] = origin[1] + 0n[0] = 1if event.key == plunge:#强降#原理也是计算当前方块落地的最小距离a=20*size-forms(ch1[0],set)[5][1]+origin[1]for i in filled:for  j  in range(4):for k in range(4):if i[j][0]==forms(ch1[0],set)[k][0]:if a>i[j][1]-forms(ch1[0],set)[k][1]:a=i[j][1]-forms(ch1[0],set)[k][1]set[1] += a# 判断碰撞情况if forms(ch1[0], set)[4][0] < origin[0]:set[0] += sizeif forms(ch1[0], set)[5][0] > origin[0] + 9 * size:set[0] -= size# 落地判断if forms(ch1[0], set)[5][1] > origin[1] + 19 * size:set[1] -= sizefilled.append(copy.deepcopy(forms(ch1[0], set)))set[0] = 4 * size + origin[0]set[1] = origin[1] + 0ch1[0] = ch1[1]ch1[1] = ch1[2]ch1[2] = ch1[3]ch1[3] = c_list[random.randint(0, 6)]n[0] = 0if iscrash(forms(ch1[0], set), filled)[0] == 0:set[1] -= sizefilled.append(copy.deepcopy(forms(ch1[0], set)))set[0] = 4 * size + origin[0]set[1] = origin[1] + 0ch1[0] = ch1[1]ch1[1] = ch1[2]ch1[2] = ch1[3]ch1[3] = c_list[random.randint(0, 6)]n[0] = 0#方块旋转,输入旋转命令,输出旋转后的形状标号,直接改变ch1[0]的值,及直接改变当前形状
def spin(a):if a==0:#右旋if ch1[0]==1:ch1[0]=2return ch1[0]if ch1[0]==2:ch1[0]=1return ch1[0]if ch1[0]==3:ch1[0]=4return ch1[0]if ch1[0]==4:ch1[0]=3return ch1[0]if ch1[0]==5:ch1[0]=6return ch1[0]if ch1[0]==6:ch1[0]=5return ch1[0]if ch1[0]==7:ch1[0]=8return ch1[0]if ch1[0] == 8:ch1[0] = 9return ch1[0]if ch1[0] == 9:ch1[0] = 10return ch1[0]if ch1[0] == 10:ch1[0] = 7return ch1[0]if ch1[0] == 11:ch1[0] = 12return ch1[0]if ch1[0] == 12:ch1[0] = 13return ch1[0]if ch1[0] == 13:ch1[0] = 14return ch1[0]if ch1[0] == 14:ch1[0] = 11return ch1[0]if ch1[0] == 15:ch1[0] = 16return ch1[0]if ch1[0] == 16:ch1[0] = 17return ch1[0]if ch1[0] == 17:ch1[0] = 18return ch1[0]if ch1[0] == 18:ch1[0] = 15return ch1[0]if ch1[0] == 19:ch1[0] = 19return ch1[0]if a==1:#左旋if ch1[0]==1:ch1[0]=2return ch1[0]if ch1[0]==2:ch1[0]=1return ch1[0]if ch1[0]==3:ch1[0]=4return ch1[0]if ch1[0]==4:ch1[0]=3return ch1[0]if ch1[0]==5:ch1[0]=6return ch1[0]if ch1[0]==6:ch1[0]=5return ch1[0]if ch1[0]==7:ch1[0]=10return ch1[0]if ch1[0] == 10:ch1[0] = 9return ch1[0]if ch1[0] == 9:ch1[0] = 8return ch1[0]if ch1[0] == 8:ch1[0] = 7return ch1[0]if ch1[0] == 11:ch1[0] = 14return ch1[0]if ch1[0] == 14:ch1[0] = 13return ch1[0]if ch1[0] == 13:ch1[0] = 12return ch1[0]if ch1[0] == 12:ch1[0] = 11return ch1[0]if ch1[0] == 15:ch1[0] = 18return ch1[0]if ch1[0] == 18:ch1[0] = 17return ch1[0]if ch1[0] == 17:ch1[0] = 16return ch1[0]if ch1[0] == 16:ch1[0] = 15return ch1[0]if ch1[0] == 19:ch1[0] = 19return ch1[0]#碰撞判断
def iscrash(form,form1):a, b, m = 10, 10, 10# 上下碰撞for i in form1:for c in range(4):for  j in range(4):if i[c][0]==form[j][0] and i[c][1]-form[j][1]==0:a=0#碰rightfor i in form1:for c in range(4):for j in range(4):if i[c][0] - form[j][0] == 0 and i[c][1] - form[j][1] == 0:b=1# 碰leftfor i in form1:for c in range(4):for j in range(4):if form[j][0] - i[c][0] == 0 and i[c][1] - form[j][1] == 0:m=2return a,b,m'''#满行判断'''
#通过及算每一行的横坐标之和来进行满行判断
def isclear(form1):sor=0for j in range(20):sum = 0#保存一行的横坐标和c = j * size+origin[1]for i in form1:for k in range(4):if i[k][1] == c:sum+=i[k][0]if sum >= 45*size + origin[0]*10:#判断是否满行sor+=sorefor i in form1:for k in range(4):if i[k][1]==c:i[k][1]=size*30#满行后将满行的y值赋值为size*30,在屏幕上就看不见了if i[k][1]<c:i[k][1]+=size#在满行上方的所有方块下移一格sores[0] += sor#记录满行数'''游戏主函数'''
def main():while 1:#游戏总循环if control[0]==1:#游戏进行中循环# 此处使用两个循环解决操作与自动下落冲突问题while 1:t = time.time()while 1:move()update()if control[0] == 0:breakif time.time() - t >= leve:#每隔leve下降一格t = time.time()set[1] += sizebreakmove()update()if control[0]==0:breakif control[0] == 0:#游戏结束界面while 1:update()if control[0] == 1:break
main()

pygame实现俄罗斯方块相关推荐

  1. python 基于pygame实现俄罗斯方块

    一.简单说明 80.90后的小伙伴都玩过"俄罗斯方块",那种"叱咤风云"场景 偶尔闪现在脑海 真的是太爽了:如果没有来得及玩过的同学,这次可以真正的自己做一个了 ...

  2. python下俄罗斯方块的游戏设计_[源码和文档分享]基于Python的PyGame的俄罗斯方块游戏设计与实现...

    摘 要 近年来,随着游戏产业的突飞猛进,游戏玩家的技术也是与日俱增,当你看见游戏高手完美的表演时,你是否想过我也能达到那种水平,本程序用Python语言编写俄罗斯方块,左侧显示正在运行的游戏,右边显示 ...

  3. pygame之俄罗斯方块

    代码及配套资源以上传到百度网盘 链接:https://pan.baidu.com/s/1xeh7StIxFCPp7lUswItEFQ 提取码:cms5 代码如下: import pygame impo ...

  4. pygame小游戏开发 - 俄罗斯方块

    版权声明:原创不易,本文禁止抄袭.转载,侵权必究! 目录 一.开发环境&需求分析 二.功能模块 三.游戏视频 四.源码下载 五.作者Info 一.开发环境&需求分析 开发环境:pyth ...

  5. pygame简单的俄罗斯方块游戏和简单的打字游戏

    1.pygame简单的俄罗斯方块游戏 一.对战的方块管理 定义一个BlockManage管理对战的方块 根据BlockManage根据传入的玩家id返回方块,保证每个玩家拿到的方块序列是一致的,所以在 ...

  6. python游戏脚本实例-Python使用pygame模块编写俄罗斯方块游戏的代码实例

    文章先介绍了关于俄罗斯方块游戏的几个术语. 边框――由10*20个空格组成,方块就落在这里面. 盒子――组成方块的其中小方块,是组成方块的基本单元. 方块――从边框顶掉下的东西,游戏者可以翻转和改变位 ...

  7. python pygame 游戏实践: 俄罗斯方块(Tetris Game)第一步

    正在学习俄罗斯方块(Tetris Game)游戏, 主要参考Tetris with PyGame | Python Assets,不过有所修改,原作的class 太复杂, 不好理解, 试图用自己习惯的 ...

  8. 用pygame写了个俄罗斯方块

    最近在学习pygame,就写了个俄罗斯方块玩玩,完成了基本的功能,后续在加入 需要安装pygame,ubuntu用户 sudo apt-get install python-pygame 代码入下 # ...

  9. Python笔记:利用pygame库实现一个俄罗斯方块小游戏(转载)

    import random,time,pygame,sys from pygame.locals import *#导pygame内定义的一些常量 FPS=25#每秒传输帧数(刷新率),此处一秒内在屏 ...

最新文章

  1. php微信扫码支付报错,(转)微信调用扫码和支付功能是都报错 the permission value is offline verifying...
  2. 在springboot中构建子模块却无法加载,如果解决?
  3. 2019年上半年总结__下半年计划
  4. 《机器学习实战》-线性回归
  5. 7、Flutter banner_view 轮播图的使用
  6. 日照华软游戏开发价格_开发区将是未来刚需人群的首选!
  7. 管理活动目录域服务实训_2019级酒店管理专业前厅与客房服务校外课程实训总结篇...
  8. 如何在Ubuntu 14.04上使用Percona XtraBackup创建MySQL数据库的热备份
  9. 【大学物理】磁场的高斯定理
  10. api 开源文档编写_如何为您的开源项目编写有效的文档
  11. Oracle在Solaris下的机能与调整简介
  12. ThinkPHP第十九天(Ueditor高亮插件、扩展函数载入load、静态缓存)
  13. SpringMVC学习(一)SpringMVC入门 、HelloSpringMVC程序、SpringMVC执行原理
  14. java集合源码分析_java集合源码分析(二):List与AbstractList
  15. 覆盖php扩展后服务挂了,PHP 扩展管理
  16. 【深入理解JS核心技术】13. 什么是高阶函数
  17. 学材料化学想转行计算机,2020大学最没用的十大专业-十大劝退专业(转专业必看)...
  18. RS485接线的正确原理图,常见的RS485错误接线方式
  19. JavaWeb 学习路线
  20. kafka集群搭建超详细教程

热门文章

  1. 计算机的自动播放功能有什么用,电脑问题---关闭自动播放功能.doc
  2. 港科夜闻丨香港科大学生获2019年汇丰 × 经济日报创新商业奖
  3. 如何利用微博的微活动进行引流?
  4. 台式计算机桌面待机时间怎么调,电脑待机时间怎么设置?电脑取消待机的设置方法...
  5. 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击
  6. 玩出个性和品牌,6 款优质国产开源电商系统推荐
  7. c++之模板初阶详解!
  8. 华南理工计算机考研王道论坛,复习详尽攻略:梦圆华工中探花
  9. 用mdx-deck和Now打造酷炫的在线幻灯片
  10. windows10无法搜索计算机,简单几步解决win10电脑搜索功能不能用了的问题