广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python写的俄罗斯方块
  • 601
分享到

Python写的俄罗斯方块

俄罗斯方块Python 2023-01-31 05:01:08 601人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

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

简单瞅了下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开发。不过,怎样也抑制不住这颗喜欢写游戏的心啊!

--结束END--

本文标题: Python写的俄罗斯方块

本文链接: https://www.lsjlt.com/news/188167.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python写的俄罗斯方块
    在公司实习。公司推崇Python和Django框架,所以也得跟着学点。 简单瞅了下Tkinter,和Canvas配合在一起,还算是简洁的界面开发API。threading.Thread创建新的线程,其多线程机制也算是方便。 只是canva...
    99+
    2023-01-31
    俄罗斯方块 Python
  • python写一个简单的俄罗斯方块
    # teris.py# A module for game teris.# By programmer FYJfrom tkinter import *from time import sleepfrom random import *f...
    99+
    2023-01-31
    俄罗斯方块 简单 python
  • python制作俄罗斯方块
    python制作俄罗斯方块 简介 俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。 该游戏曾经被多家公司代理过。经过多轮诉讼后,该...
    99+
    2023-09-17
    python 开发语言
  • shell脚本编写俄罗斯方块
    网上看到的一个用linux的shell脚本写的俄罗斯方块。共享一下。 原作者信息在脚本的注释中有。 下载地址:点击下载 代码: #!/bin/bash # Tetris Game # 10.21.2003...
    99+
    2022-06-04
    shell 俄罗斯方块
  • java做俄罗斯方块
    要使用Java编写俄罗斯方块游戏,可以使用Java图形库(如AWT或JavaFX)来创建游戏界面和图形。下面是一个简单的示例代码以帮...
    99+
    2023-08-24
    java
  • python实现简单的俄罗斯方块
    本文实例为大家分享了python实现简单的俄罗斯方块的具体代码,供大家参考,具体内容如下 1. 案例介绍 俄罗斯方块是由 4 个小方块组成不同形状的板块,随机从屏幕上方落下,按方向键...
    99+
    2022-11-12
  • Qt实现俄罗斯方块
    本文实例为大家分享了Qt实现俄罗斯方块,供大家参考,具体内容如下 最近在学习Qt,用它来进行图形界面的开发还是很方便的,想着做一个小游戏来锻炼一下自己,就想到了小时候玩的俄罗斯方块。...
    99+
    2022-11-12
  • pygame俄罗斯方块游戏
    俄罗斯方块游戏开发 俄罗斯方块是一款世界级经典游戏,每门语言开发学习初步都会考虑制作俄罗斯方块游戏今天带着大家把俄罗斯方块用python语言开发一次 开发准备 安装python 2.引入游戏库pyga...
    99+
    2023-10-25
    pygame 游戏 python
  • Java实现俄罗斯方块的代码怎么写
    本文小编为大家详细介绍“Java实现俄罗斯方块的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现俄罗斯方块的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体实现代码: ...
    99+
    2023-06-30
  • python练手--自制俄罗斯方块(文末
    小白python学习中,刚把面向对象弄了个大概,打算找个项目练练手,于是决定做一个俄罗斯方块吧!然后到现在一个月就过去了。。。。。 期间接触了一下pygame,参考了目光博客的Pygame教程,当时感觉看懂了,等到用的时候,哈哈哈,感觉把...
    99+
    2023-01-31
    俄罗斯方块 python
  • python实现简单俄罗斯方块游戏
    本文实例为大家分享了python实现简单俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 import pygame,sys,random,time all_block = [[...
    99+
    2022-11-12
  • Python实现简单的俄罗斯方块游戏
    本文实例为大家分享了Python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。 源码分享: import o...
    99+
    2022-11-12
  • Python如何开发精美的俄罗斯方块
    Python如何开发精美的俄罗斯方块,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言最近想找一些Python相关的游戏开发例子,正好在itch.io上闲逛看到...
    99+
    2023-06-16
  • python基于pygame实现俄罗斯方块的方法
    小编给大家分享一下python基于pygame实现俄罗斯方块的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、简单说明90后的小伙伴都玩过“俄罗斯方块”,那种“叱咤风云”场景 偶尔闪现在脑海 真的是太爽了;如果没有来...
    99+
    2023-06-06
  • CocosCreatorTypescript制作俄罗斯方块游戏
    目录1.引言2.需要解决的几个关键问题3.写在最后1.引言 最近开始学cocos,学完Typescript语法之后,跑去看cocos的官方文档,捣鼓了几天,写了一个非常简单的贪吃蛇,...
    99+
    2022-11-12
  • shell实现俄罗斯方块脚本
    本文实例为大家分享了shell实现俄罗斯方块的具体代码,供大家参考,具体内容如下 draw 是画出图形界面,keytest是获取键盘,tetris是整个游戏 tetris.sh #!/bin/bash ...
    99+
    2022-06-04
    shell 俄罗斯方块
  • C++实现俄罗斯方块源码
    本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下 先是效果图: 主菜单: 游戏: 设置: 错误处理: 代码: #include <ios...
    99+
    2022-11-12
  • 使用shell脚本怎么编写俄罗斯方块
    使用shell脚本怎么编写俄罗斯方块?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。代码:#!/bin/bash   # ...
    99+
    2023-06-09
  • java实现简单的俄罗斯方块
    本文实例为大家分享了java实现简单俄罗斯方块的具体代码,供大家参考,具体内容如下 结合网上的资料刚做完课程设计,具体代码如下: public class TetrisPanel e...
    99+
    2022-11-13
  • shell脚本编写的俄罗斯方块游戏代码
    粘贴以下代码到一个空的Shell脚本文件中,并在Bash 中运行即可! #!/bin/bash# Tetris Game# 10.21.2003 xhchen<[email]xhchen@winbon...
    99+
    2022-06-04
    脚本 俄罗斯方块 代码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作