python编写俄罗斯方块


Posted in Python onMarch 13, 2020

本文实例为大家分享了python实现俄罗斯方块的具体代码,供大家参考,具体内容如下

#coding=utf-8 
from tkinter import *
from random import *
import threading
from tkinter.messagebox import showinfo
from tkinter.messagebox import askquestion
import threading
from time import sleep
 
 
class BrickGame(object): 
 
 #是否开始 
 start = True; 
 #是否到达底部 
 isDown = True; 
 isPause = False; 
 #窗体 
 window = None; 
 #frame 
 frame1 = None; 
 frame2 = None; 
 
 #按钮 
 btnStart = None; 
 
 #绘图类 
 canvas = None; 
 canvas1 = None; 
 
 #标题 
 title = "BrickGame"; 
 #宽和高 
 width = 450; 
 height = 670; 
 
 #行和列 
 rows = 20; 
 cols = 10; 
 
 #下降方块的线程 
 downThread = None; 
 
 #几种方块 
 brick = [ 
  [ 
   [ 
    [0,1,1], 
    [1,1,0], 
    [0,0,0] 
   ], 
   [ 
    [1,0,0], 
    [1,1,0], 
    [0,1,0] 
   ], 
   [ 
    [0,1,1], 
    [1,1,0], 
    [0,0,0] 
   ], 
   [ 
    [1,0,0], 
    [1,1,0], 
    [0,1,0] 
   ] 
 ],
 [ 
   [ 
    [1,1,1], 
    [1,0,0], 
    [0,0,0] 
   ], 
   [ 
    [0,1,1], 
    [0,0,1], 
    [0,0,1] 
   ], 
   [ 
    [0,0,0], 
    [0,0,1], 
    [1,1,1] 
   ], 
   [ 
    [1,0,0], 
    [1,0,0], 
    [1,1,0] 
   ] 
 ], 
 [ 
   [ 
    [1,1,1], 
    [0,0,1], 
    [0,0,0] 
   ], 
   [ 
    [0,0,1], 
    [0,0,1], 
    [0,1,1] 
   ], 
   [ 
    [0,0,0], 
    [1,0,0], 
    [1,1,1] 
   ], 
   [ 
    [1,1,0], 
    [1,0,0], 
    [1,0,0] 
   ] 
 ], 
 [ 
   [ 
    [0,0,0], 
    [0,1,1], 
    [0,1,1] 
   ], 
   [ 
    [0,0,0], 
    [0,1,1], 
    [0,1,1] 
   ], 
   [ 
    [0,0,0], 
    [0,1,1], 
    [0,1,1] 
   ], 
   [ 
    [0,0,0], 
    [0,1,1], 
    [0,1,1] 
   ]   
 ], 
 [ 
   [ 
    [1,1,1], 
    [0,1,0], 
    [0,0,0] 
   ], 
   [ 
    [0,0,1], 
    [0,1,1], 
    [0,0,1] 
   ], 
   [ 
    [0,0,0], 
    [0,1,0], 
    [1,1,1] 
   ], 
   [ 
    [1,0,0], 
    [1,1,0], 
    [1,0,0] 
   ] 
 ], 
 [ 
   [ 
    [0,1,0], 
    [0,1,0], 
    [0,1,0]
    
   ], 
   [ 
    [0,0,0], 
    [1,1,1], 
    [0,0,0]
    
   ], 
   [ 
    [0,1,0], 
    [0,1,0], 
    [0,1,0] 
   ], 
   [ 
    [0,0,0], 
    [1,1,1], 
    [0,0,0] 
   ] 
 ],
 [ 
   [ 
    [1,1,0], 
    [0,1,1], 
    [0,0,0] 
   ], 
   [ 
    [0,0,1], 
    [0,1,1], 
    [0,1,0] 
   ], 
   [ 
    [0,0,0], 
    [1,1,0], 
    [0,1,1] 
   ], 
   [ 
    [0,1,0], 
    [1,1,0], 
    [1,0,0] 
   ] 
 ]
 
 
 ]; 
 
 #当前的方块 
 curBrick = None; 
 #当前方块数组 
 arr = None; 
 arr1 = None; 
 #当前方块形状 
 shape = -1; 
 #当前方块的行和列(最左上角) 
 curRow = -10; 
 curCol = -10; 
 
 #背景 
 back = list(); 
 #格子 
 gridBack = list(); 
 preBack = list(); 
 
 #初始化 
 def init(self): 
  
 for i in range(0,self.rows): 
  
  self.back.insert(i,list()); 
  self.gridBack.insert(i,list()); 
  
 for i in range(0,self.rows): 
  
  for j in range(0,self.cols): 
   
  self.back[i].insert(j,0); 
  self.gridBack[i].insert(j,self.canvas.create_rectangle(30*j,30*i,30*(j+1),30*(i+1),fill="black")); 
   
 for i in range(0,3): 
  
  self.preBack.insert(i,list()); 
  
 for i in range(0,3): 
  
  for j in range(0,3): 
   
  self.preBack[i].insert(j,self.canvas1.create_rectangle(30*j,30*i,30*(j+1),30*(i+1),fill="black")); 
 
 #绘制游戏的格子 
 def drawRect(self): 
 for i in range(0,self.rows): 
   
   for j in range(0,self.cols): 
    
   
   if self.back[i][j]==1: 
    
    self.canvas.itemconfig(self.gridBack[i][j],fill="blue",outline="white"); 
    
   elif self.back[i][j]==0: 
    
    self.canvas.itemconfig(self.gridBack[i][j],fill="black",outline="white"); 
    
 #绘制预览方块 
 for i in range(0,len(self.arr1)): 
  
  for j in range(0,len(self.arr1[i])): 
   
  if self.arr1[i][j]==0: 
   
   self.canvas1.itemconfig(self.preBack[i][j],fill="black",outline="white"); 
   
  elif self.arr1[i][j]==1: 
   
   self.canvas1.itemconfig(self.preBack[i][j],fill="orange",outline="white"); 
 
    
 #绘制当前正在运动的方块 
 if self.curRow!=-10 and self.curCol!=-10: 
  
  for i in range(0,len(self.arr)): 
   
  for j in range(0,len(self.arr[i])): 
   
   if self.arr[i][j]==1:   
    
   self.canvas.itemconfig(self.gridBack[self.curRow+i][self.curCol+j],fill="blue",outline="white"); 
    
 #判断方块是否已经运动到达底部 
 if self.isDown: 
  
  for i in range(0,3): 
   
  for j in range(0,3): 
   
   if self.arr[i][j]!=0: 
    
   self.back[self.curRow+i][self.curCol+j] = self.arr[i][j]; 
    
  #判断整行消除 
  self.removeRow(); 
  
  #判断是否死了 
  self.isDead(); 
   
  #获得下一个方块 
  self.getCurBrick(); 
 
 #判断是否有整行需要消除 
 def removeRow(self): 
 count=0
 for i in range(0,self.rows): 
 
  tag1 = True;  
  for j in range(0,self.cols): 
   
  if self.back[i][j]==0: 
   
   tag1 = False; 
   break; 
  
  if tag1==True: 
   
  #从上向下挪动
  count=count+1
  for m in range(i-1,0,-1): 
   
   for n in range(0,self.cols): 
    
   self.back[m+1][n] = self.back[m][n]; 
 
   
 
 scoreValue = eval(self.scoreLabel2['text'])
 scoreValue += 5*count*(count+3)
 self.scoreLabel2.config(text=str(scoreValue))
  
 #获得当前的方块 
 def getCurBrick(self): 
  
 self.curBrick = randint(0,len(self.brick)-1); 
 self.shape = 0; 
 #当前方块数组 
 self.arr = self.brick[self.curBrick][self.shape]; 
 self.arr1 = self.arr; 
  
 self.curRow = 0; 
 self.curCol = 1; 
  
 #是否到底部为False 
 self.isDown = False; 
  
 #监听键盘输入 
 def onKeyboardEvent(self,event): 
  
 #未开始,不必监听键盘输入 
 if self.start == False: 
  
  return;
 
 if self.isPause == True:
  return;
  
 #记录原来的值 
 tempCurCol = self.curCol; 
 tempCurRow = self.curRow; 
 tempShape = self.shape; 
 tempArr = self.arr; 
 direction = -1; 
  
 if event.keycode==37: 
  
  #左移 
  self.curCol-=1; 
  direction = 1; 
 elif event.keycode==38: 
  #变化方块的形状 
  self.shape+=1; 
  direction = 2; 
  
  if self.shape>=4: 
   
  self.shape=0; 
  self.arr = self.brick[self.curBrick][self.shape]; 
 elif event.keycode==39: 
  
  direction = 3; 
  #右移 
  self.curCol+=1; 
 elif event.keycode==40: 
  
  direction = 4; 
  #下移 
  self.curRow+=1; 
  
 if self.isEdge(direction)==False: 
  
  self.curCol = tempCurCol; 
  self.curRow = tempCurRow; 
  self.shape = tempShape; 
  self.arr = tempArr; 
   
 self.drawRect(); 
  
 return True; 
 
 #判断当前方块是否到达边界 
 def isEdge(self,direction): 
  
 tag = True; 
 
 #向左,判断边界 
 if direction==1: 
  
  for i in range(0,3): 
   
  for j in range(0,3): 
   
   if self.arr[j][i]!=0 and (self.curCol+i<0 or self.back[self.curRow+j][self.curCol+i]!=0): 
    
   tag = False; 
   break; 
 #向右,判断边界 
 elif direction==3: 
  
  for i in range(0,3): 
   
  for j in range(0,3): 
   
   if self.arr[j][i]!=0 and (self.curCol+i>=self.cols or self.back[self.curRow+j][self.curCol+i]!=0): 
    
   tag = False; 
   break; 
 #向下,判断底部 
 elif direction==4: 
  
  for i in range(0,3): 
   
  for j in range(0,3): 
   
   if self.arr[i][j]!=0 and (self.curRow+i>=self.rows or self.back[self.curRow+i][self.curCol+j]!=0): 
    
   tag = False; 
   self.isDown = True; 
   break; 
 #进行变形,判断边界 
 elif direction==2: 
  
  if self.curCol<0: 
   
  self.curCol=0; 
  
  if self.curCol+2>=self.cols: 
   
  self.curCol = self.cols-3; 
   
  if self.curRow+2>=self.rows: 
   
  self.curRow = self.curRow-3; 
  
  
 return tag; 
 
 #方块向下移动 
 def brickDown(self): 
  
 while True: 
  
  if self.start==False: 
   
  print("exit thread"); 
  break; 
  if self.isPause==False: 
  tempRow = self.curRow; 
  self.curRow+=1; 
   
  if self.isEdge(4)==False: 
   
   self.curRow = tempRow; 
   
  self.drawRect(); 
    
  #每一秒下降一格 
  sleep(1); 
  
 #点击开始 
 def clickStart(self): 
  
 self.start = True; 
  
 for i in range(0,self.rows): 
  
  for j in range(0,self.cols): 
   
  self.back[i][j] = 0; 
  self.canvas.itemconfig(self.gridBack[i][j],fill="black",outline="white"); 
   
 for i in range(0,len(self.arr)): 
  
  for j in range(0,len(self.arr[i])): 
   
  self.canvas1.itemconfig(self.preBack[i][j],fill="black",outline="white"); 
   
 self.getCurBrick(); 
 self.drawRect(); 
  
 self.downThread = threading.Thread(target=self.brickDown,args=()); 
 self.downThread.start();
 
 def clickPause(self):
 self.isPause=not self.isPause
 print(self.isPause)
 if not self.isPause:
  self.btnPause["text"]="暂停"
 else:
  self.btnPause["text"]="恢复"
  
 
 def clickReStart(self):
 ackRestart =askquestion("重新开始","你确定要重新开始吗?")
 if ackRestart == 'yes':
  self.clickStart()
 else:
  return
 
 def clickQuit(self):
 ackQuit =askquestion("退出","你确定要退出吗?")
 if ackQuit == 'yes':
  self.window.destroy()
  exit()
 
 
  
 #判断是否死了 
 def isDead(self): 
  
 for j in range(0,len(self.back[0])): 
  
  if self.back[0][j]!=0: 
   
  showinfo("提示","你挂了,再来一盘吧!"); 
  self.start = False; 
  break; 
  
 #运行 
 def __init__(self): 
  
 self.window = Tk(); 
 self.window.title(self.title); 
 self.window.minsize(self.width,self.height); 
 self.window.maxsize(self.width,self.height);   
  
 self.frame1 = Frame(self.window,width=300,height=600,bg="black"); 
 self.frame1.place(x=20,y=30); 
 
 self.scoreLabel1 = Label(self.window,text="Score:",font=(30))
 self.scoreLabel1.place(x=340,y=60)
 self.scoreLabel2 = Label(self.window,text="0",fg='red',font=(30))
 self.scoreLabel2.place(x=410,y=60)
 
 self.frame2 = Frame(self.window,width=90,height=90,bg="black"); 
 self.frame2.place(x=340,y=120); 
  
 self.canvas = Canvas(self.frame1,width=300,height=600,bg="black"); 
 self.canvas1 = Canvas(self.frame2,width=90,height=90,bg="black"); 
  
 self.btnStart = Button(self.window,text="开始",command=self.clickStart); 
 self.btnStart.place(x=340,y=400,width=80,height=25); 
 
 self.btnPause = Button(self.window,text="暂停",command=self.clickPause); 
 self.btnPause.place(x=340,y=450,width=80,height=25);
 
 self.btnReStart = Button(self.window,text="重新开始",command=self.clickReStart); 
 self.btnReStart.place(x=340,y=500,width=80,height=25);
 
 self.btnQuit = Button(self.window,text="退出",command=self.clickQuit); 
 self.btnQuit.place(x=340,y=550,width=80,height=25);
 
 
 
 self.init(); 
  
 #获得当前的方块 
 self.getCurBrick(); 
  
 #按照数组,绘制格子
 
 
 self.drawRect();
  
 self.canvas.pack();
   
  
 self.canvas1.pack(); 
 
 #监听键盘事件 
 self.window.bind("<KeyPress>",self.onKeyboardEvent); 
  
 #启动方块下落线程
 self.downThread = threading.Thread(target=self.brickDown,args=()); 
 self.downThread.start();  
  
 self.window.mainloop(); 
  
 self.start=False; 
  
 pass; 
 
if __name__=='__main__': 
 
 brickGame = BrickGame();

更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合 进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
通过数据库向Django模型添加字段的示例
Jul 21 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
python操作excel的方法
Aug 16 Python
python读取csv和txt数据转换成向量的实例
Feb 12 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
Python3实现计算两个数组的交集算法示例
Apr 03 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
django中嵌套的try-except实例
May 21 Python
使用Django搭建网站实现商品分页功能
May 22 Python
pytest配置文件pytest.ini的详细使用
Apr 17 Python
pycharm 如何查看某一函数源码的快捷键
May 12 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
Mar 13 #Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 #Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 #Python
python实现俄罗斯方块游戏(改进版)
Mar 13 #Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 #Python
Tensorflow中的dropout的使用方法
Mar 13 #Python
python实现简单俄罗斯方块
Mar 13 #Python
You might like
php根据日期判断星座的函数分享
2014/02/13 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
PIGCMS 如何关闭聊天机器人
2015/02/12 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
JavaScript学习笔记(二) js对象
2011/10/25 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
2013/04/28 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
AngularJS实现表单验证
2015/01/28 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python工厂函数用法实例分析
2018/05/14 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
python 实现生成均匀分布的点
2019/12/05 Python
使用Python实现分别输出每个数组
2019/12/06 Python
python 负数取模运算实例
2020/06/03 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
大学信息公开实施方案
2014/03/09 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
爱心捐款感谢信
2015/01/20 职场文书
离婚上诉状范文
2015/05/23 职场文书
经典祝酒词大全
2015/08/12 职场文书