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 相关文章推荐
浅析python 内置字符串处理函数的使用方法
Jun 11 Python
编写Python脚本来获取Google搜索结果的示例
May 04 Python
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
python 实现字符串下标的输出功能
Feb 13 Python
python图片指定区域替换img.paste函数的使用
Apr 09 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
python 可视化库PyG2Plot的使用
Jan 21 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
第六节 访问属性和方法 [6]
2006/10/09 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
php查看网页源代码的方法
2015/03/13 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
jquery利用命名空间移除绑定事件的方法
2015/03/11 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
javascript history对象详解
2017/02/09 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
一秒学会微信小程序制作table表格
2019/02/14 Javascript
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
浅谈flask源码之请求过程
2018/07/26 Python
Python类的动态绑定实现原理
2020/03/21 Python
python实现IOU计算案例
2020/04/12 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
大学生村官心得体会范文
2014/01/04 职场文书
涨价通知怎么写
2015/04/23 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
golang的文件创建及读写操作
2022/04/14 Golang