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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
Apr 27 Python
django 在原有表格添加或删除字段的实例
May 27 Python
浅谈python实现Google翻译PDF,解决换行的问题
Nov 28 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
python 读取dicom文件,生成info.txt和raw文件的方法
Jan 24 Python
Django中间件基础用法详解
Jul 18 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 Python
python实现网页录音效果
Oct 26 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
PHP5中MVC结构学习
2006/10/09 PHP
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
Javascript Select操作大集合
2009/05/26 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
原生js实现商品筛选功能
2019/10/28 Javascript
Python守护进程和脚本单例运行详解
2017/01/06 Python
python的变量与赋值详细分析
2017/11/08 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
python脚本执行CMD命令并返回结果的例子
2019/08/14 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
Linux上比较文件的命令都有哪些
2013/09/28 面试题
中级会计职业生涯规划书
2014/03/01 职场文书
师德建设实施方案
2014/03/21 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
见习报告格式范文
2014/11/08 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
vue elementUI批量上传文件
2022/04/26 Vue.js
Python日志模块logging用法
2022/06/05 Python