我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python写的俄罗斯方块

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python写的俄罗斯方块

在公司实习。公司推崇Python和Django框架,所以也得跟着学点。

简单瞅了下Tkinter,和Canvas配合在一起,还算是简洁的界面开发API。threading.Thread创建新的线程,其多线程机制也算是方便。

只是canvas.create_rectangle居然不是绘制矩形,而是新建了矩形控件这点让人大跌眼镜。先开始,在线程里每次都重绘多个矩形(随数组变化),其实是每次都新建了N个矩形,结果内存暴增。原来,对矩形进行变更时,只需用canvas.itemconfig即可。

下面就是截图(时间太晚,明日还得上班,做得非常粗糙...没事时再慢慢修正)。


而代码如下:

#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;
  
  #绘图类
  canvas = None;
  
  #标题
  title = "BrickGame";
  #宽和高
  width = 350;
  height = 670;
  
  #行和列
  rows = 20;
  cols = 10;
  
  #几种方块
  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;
  #当前方块形状
  shape = -1;
  #当前方块的行和列(最左上角)
  curRow = -10;
  curCol = -10;
  
  #背景
  back = list();
  #格子
  gridBack = 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"));

  #绘制游戏的格子
  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");
  
              
    #绘制当前正在运动的方块
    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.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.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 __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.canvas = Canvas(self.frame1,width=300,height=600,bg="black");
    
    self.init();
    
    #获得当前的方块
    self.getCurBrick();
    
    #按照数组,绘制格子
    self.drawRect();    
          
    self.canvas.pack();
    
    #监听键盘事件
    self.window.bind("<KeyPress>",self.onKeyboardEvent); 
    
    #启动方块下落线程
    downThread = threading.Thread(target=self.brickDown,args=());
    downThread.start();    
    
    self.window.mainloop(); 
    
    self.start=False;
    
  pass;

if __name__=='__main__':
  
  brickGame = BrickGame();

估计用图形界面会很少,因为俺是WEB开发。不过,怎样也抑制不住这颗喜欢写游戏的心啊!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python写的俄罗斯方块

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python写的俄罗斯方块

在公司实习。公司推崇Python和Django框架,所以也得跟着学点。简单瞅了下Tkinter,和Canvas配合在一起,还算是简洁的界面开发API。threading.Thread创建新的线程,其多线程机制也算是方便。只是canvas.c
2023-01-31

python写一个简单的俄罗斯方块

# teris.py# A module for game teris.# By programmer FYJfrom tkinter import *from time import sleepfrom random import *fr
2023-01-31

shell脚本编写俄罗斯方块

网上看到的一个用linux的shell脚本写的俄罗斯方块。共享一下。 原作者信息在脚本的注释中有。 下载地址:点击下载代码:#!/bin/bash # Tetris Game # 10.21.2003 xhchen<[email]xhch
2022-06-04

java做俄罗斯方块

要使用Java编写俄罗斯方块游戏,可以使用Java图形库(如AWT或JavaFX)来创建游戏界面和图形。下面是一个简单的示例代码以帮助你入门:```javaimport java.awt.Color;import java.awt.Dime
2023-08-24

Java实现俄罗斯方块的代码怎么写

本文小编为大家详细介绍“Java实现俄罗斯方块的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现俄罗斯方块的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体实现代码: impor
2023-06-30

python练手--自制俄罗斯方块(文末

小白python学习中,刚把面向对象弄了个大概,打算找个项目练练手,于是决定做一个俄罗斯方块吧!然后到现在一个月就过去了。。。。。期间接触了一下pygame,参考了目光博客的Pygame教程,当时感觉看懂了,等到用的时候,哈哈哈,感觉把py
2023-01-31

使用shell脚本怎么编写俄罗斯方块

使用shell脚本怎么编写俄罗斯方块?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。代码:#!/bin/bash # Tetris Game # 10.21.
2023-06-09

Python如何开发精美的俄罗斯方块

Python如何开发精美的俄罗斯方块,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言最近想找一些Python相关的游戏开发例子,正好在itch.io上闲逛看到
2023-06-16

python基于pygame实现俄罗斯方块的方法

小编给大家分享一下python基于pygame实现俄罗斯方块的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、简单说明80、90后的小伙伴都玩过“俄罗斯方块”,那种“叱咤风云”场景 偶尔闪现在脑海 真的是太爽了;如果
2023-06-06

shell实现俄罗斯方块脚本

本文实例为大家分享了shell实现俄罗斯方块的具体代码,供大家参考,具体内容如下 draw 是画出图形界面,keytest是获取键盘,tetris是整个游戏 tetris.sh#!/bin/bash APP_NAME="${0##*[\\/
2022-06-04

shell脚本编写的俄罗斯方块游戏代码

粘贴以下代码到一个空的Shell脚本文件中,并在Bash 中运行即可! #!/bin/bash# Tetris Game# 10.21.2003 xhchen<[email]xhchen@winbond.com.tw[/email]>#AP
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录