python实现俄罗斯方块游戏(改进版)


Posted in Python onMarch 13, 2020

本文为大家分享了python实现俄罗斯方块游戏,继上一篇的改进版,供大家参考,具体内容如下

1.加了方块预览部分

2.加了开始按钮

在公司实习抽空写的,呵呵。觉得Python还不错,以前觉得像个玩具语言。希望能够用它做更多大事吧!!!加油。

截图如下:

python实现俄罗斯方块游戏(改进版)

代码如下:

#coding=utf-8
from Tkinter import *;
from random import *;
import thread;  
from tkMessageBox import showinfo;
import threading;
from time import sleep;
class BrickGame(object):
 
 #是否开始
 start = True;
 #是否到达底部
 isDown = True;
 
 #窗体
 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 = [
  
  [
     [
       [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,1,0]
     ],
     [
        [0,0,1],
        [1,1,1],
        [0,0,1]
     ],
     [
        [0,1,0],
        [0,1,0],
        [1,1,1]
     ],
     [
        [1,0,0],
        [1,1,1],
        [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]
     ]
  ]
 ];
 
 #当前的方块
 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):
  
  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:
    
    #从上向下挪动
    for m in xrange(i-1,0,-1):
     
     for n in range(0,self.cols):
      
      self.back[m+1][n] = self.back[m][n];
   
 #获得当前的方块
 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;
  
  #记录原来的值
  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;
   
   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 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.frame2 = Frame(self.window,width=90,height=90,bg="black");
  self.frame2.place(x=340,y=60);
  
  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.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 相关文章推荐
使用grappelli为django admin后台添加模板
Nov 18 Python
使用Python脚本将Bing的每日图片作为桌面的教程
May 04 Python
Windows下python2.7.8安装图文教程
May 26 Python
python 读取文件并替换字段的实例
Jul 12 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
关于Python作用域自学总结
Jun 10 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
浅析使用Python搭建http服务器
Oct 27 Python
python 实现多维数组转向量
Nov 30 Python
python3.6使用SMTP协议发送邮件
May 20 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 #Python
Tensorflow中的dropout的使用方法
Mar 13 #Python
python实现简单俄罗斯方块
Mar 13 #Python
Python实现检测文件的MD5值来查找重复文件案例
Mar 12 #Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
Mar 12 #Python
python 两个一样的字符串用==结果为false问题的解决
Mar 12 #Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 #Python
You might like
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
解析php中memcache的应用
2013/06/18 PHP
详解PHP数组赋值方法
2015/11/07 PHP
php提取微信账单的有效信息
2018/10/01 PHP
js substr、substring和slice使用说明小记
2011/09/15 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
2016/09/05 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
python list语法学习(带例子)
2013/11/01 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
pandas按条件筛选数据的实现
2021/02/20 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
戴森美国官网:Dyson美国
2016/09/11 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
linux下进程间通信的方式
2013/01/23 面试题
IBatis持久层技术
2016/07/18 面试题
搬家公司的创业计划书
2014/01/01 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
初中差生评语
2014/12/29 职场文书
关于倡议书的范文
2015/04/29 职场文书
借条如何写
2015/05/26 职场文书
标枪加油稿
2015/07/22 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python