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中用Decorator来简化元编程的教程
Apr 13 Python
Python 内置函数complex详解
Oct 23 Python
深入理解Python对Json的解析
Feb 14 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
从django的中间件直接返回请求的方法
May 30 Python
浅述python中深浅拷贝原理
Sep 18 Python
Django 对IP访问频率进行限制的例子
Aug 30 Python
基于python+selenium的二次封装的实现
Jan 06 Python
python绘制玫瑰的实现代码
Mar 02 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 Python
django 解决自定义序列化返回处理数据为null的问题
May 20 Python
Django自带用户认证系统使用方法解析
Nov 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
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
2020/08/17 Javascript
python使用Image处理图片常用技巧分析
2015/06/01 Python
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
python如何实现内容写在图片上
2018/03/23 Python
Python实现京东秒杀功能代码
2019/05/16 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
2020/03/14 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
浅析Python面向对象编程
2020/07/10 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
几个Linux面试题笔试题
2016/08/01 面试题
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
中专生自我鉴定范文
2013/12/19 职场文书
校园安全标语
2014/06/07 职场文书
运动会的口号
2014/06/09 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
工作简历自我评价
2015/03/11 职场文书
员工表扬信怎么写
2015/05/05 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript