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 相关文章推荐
Python BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
python3+PyQt5自定义视图详解
Apr 24 Python
django url到views参数传递的实例
Jul 19 Python
django基于restframework的CBV封装详解
Aug 08 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 Python
Django数据库迁移常见使用方法
Nov 12 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 Python
python time.strptime格式化实例详解
Feb 03 Python
python实现简单文件读写函数
Feb 25 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
支持oicq头像的留言簿(一)
2006/10/09 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
Jquery动态列功能完整实例
2019/08/30 jQuery
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
Python3 queue队列模块详细介绍
2018/01/05 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
法学毕业生自荐信
2013/11/13 职场文书
总经理秘书工作职责
2013/12/26 职场文书
优秀技术工人先进材料
2014/02/17 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
新郎新娘答谢词
2015/01/04 职场文书
大国崛起日本观后感
2015/06/02 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android