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 相关文章推荐
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
python之django母板页面的使用
Jul 03 Python
python判断数字是否是超级素数幂
Sep 27 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
Python 如何创建一个简单的REST接口
Jul 30 Python
jupyter notebook远程访问不了的问题解决方法
Jan 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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
PHP中date()日期函数有关参数整理
2011/07/19 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
ubuntu安装mysql pycharm sublime
2018/02/20 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
python 回溯法模板详解
2020/02/26 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
Django视图、传参和forms验证操作
2020/07/15 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
办公室文书岗位职责
2013/12/16 职场文书
校三好学生主要事迹
2014/01/11 职场文书
玲玲的画教学反思
2014/02/04 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
自我检讨报告
2015/01/28 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书