python编写俄罗斯方块

本文实例为大家分享了python实现俄罗斯方块的具体代码,供大家参考,具体内容如下

#coding=utf-8
from tkinter import *
from random import *
import threading
from tkinter.messagebox import showinfo
from tkinter.messagebox import askquestion
import threading
from time import sleep

class BrickGame(object): 

 #是否开始
 start = True;
 #是否到达底部
 isDown = True;
 isPause = False;
 #窗体
 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 = [
  [
   [
    [0,1,1],
    [1,1,0],
    [0,0,0]
   ],
   [
    [1,0,0],
    [1,1,0],
    [0,1,0]
   ],
   [
    [0,1,1],
    [1,1,0],
    [0,0,0]
   ],
   [
    [1,0,0],
    [1,1,0],
    [0,1,0]
   ]
 ],
 [
   [
    [1,1,1],
    [1,0,0],
    [0,0,0]
   ],
   [
    [0,1,1],
    [0,0,1],
    [0,0,1]
   ],
   [
    [0,0,0],
    [0,0,1],
    [1,1,1]
   ],
   [
    [1,0,0],
    [1,0,0],
    [1,1,0]
   ]
 ],
 [
   [
    [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,0,0]
   ],
   [
    [0,0,1],
    [0,1,1],
    [0,0,1]
   ],
   [
    [0,0,0],
    [0,1,0],
    [1,1,1]
   ],
   [
    [1,0,0],
    [1,1,0],
    [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]
   ]
 ],
 [
   [
    [1,1,0],
    [0,1,1],
    [0,0,0]
   ],
   [
    [0,0,1],
    [0,1,1],
    [0,1,0]
   ],
   [
    [0,0,0],
    [1,1,0],
    [0,1,1]
   ],
   [
    [0,1,0],
    [1,1,0],
    [1,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):
 count=0
 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: 

  #从上向下挪动
  count=count+1
  for m in range(i-1,0,-1): 

   for n in range(0,self.cols): 

   self.back[m+1][n] = self.back[m][n]; 

 scoreValue = eval(self.scoreLabel2['text'])
 scoreValue += 5*count*(count+3)
 self.scoreLabel2.config(text=str(scoreValue))

 #获得当前的方块
 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;

 if self.isPause == True:
  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;
  if self.isPause==False:
  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 clickPause(self):
 self.isPause=not self.isPause
 print(self.isPause)
 if not self.isPause:
  self.btnPause["text"]="暂停"
 else:
  self.btnPause["text"]="恢复"

 def clickReStart(self):
 ackRestart =askquestion("重新开始","你确定要重新开始吗?")
 if ackRestart == 'yes':
  self.clickStart()
 else:
  return

 def clickQuit(self):
 ackQuit =askquestion("退出","你确定要退出吗?")
 if ackQuit == 'yes':
  self.window.destroy()
  exit()

 #判断是否死了
 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.scoreLabel1 = Label(self.window,text="Score:",font=(30))
 self.scoreLabel1.place(x=340,y=60)
 self.scoreLabel2 = Label(self.window,text="0",fg='red',font=(30))
 self.scoreLabel2.place(x=410,y=60)

 self.frame2 = Frame(self.window,width=90,height=90,bg="black");
 self.frame2.place(x=340,y=120); 

 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.btnPause = Button(self.window,text="暂停",command=self.clickPause);
 self.btnPause.place(x=340,y=450,width=80,height=25);

 self.btnReStart = Button(self.window,text="重新开始",command=self.clickReStart);
 self.btnReStart.place(x=340,y=500,width=80,height=25);

 self.btnQuit = Button(self.window,text="退出",command=self.clickQuit);
 self.btnQuit.place(x=340,y=550,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(); 

更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合 进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python实现俄罗斯方块

    网上搜到一个Pygame写的俄罗斯方块(tetris),大部分看懂的前提下增加了注释,Fedora19下运行OK的 主程序: #coding:utf8 #! /usr/bin/env python # 注释说明:shape表示一个俄罗斯方块形状 cell表示一个小方块 import sys from random import choice import pygame from pygame.locals import * from block import O, I, S, Z, L, J,

  • Python小游戏之300行代码实现俄罗斯方块

    前言 本文代码基于 python3.6 和 pygame1.9.4. 俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块.但是想到旋转,停靠,消除等操作,感觉好像很难啊,等真正写完了发现,一共也就 300 行代码,并没有什么难的. 先来看一个游戏截图,有点丑,好吧,我没啥美术细胞,但是主体功能都实现了,可以玩起来. 现在来看一下实现的过程. 外形 俄罗斯方块整个界面分为两部分,一部分是左边的游戏区域,另一部分是右边的显示区域,显示得分.速度.下一个方块样式等.

  • Python使用pygame模块编写俄罗斯方块游戏的代码实例

    文章先介绍了关于俄罗斯方块游戏的几个术语. 边框--由10*20个空格组成,方块就落在这里面. 盒子--组成方块的其中小方块,是组成方块的基本单元. 方块--从边框顶掉下的东西,游戏者可以翻转和改变位置.每个方块由4个盒子组成. 形状--不同类型的方块.这里形状的名字被叫做T, S, Z ,J, L, I , O.如下图所示: 模版--用一个列表存放形状被翻转后的所有可能样式.全部存放在变量里,变量名字如S_SHAPE_TEMPLATE or J_SHAPE_TEMPLATE 着陆--当一个方块

  • python实现简单俄罗斯方块

    本文实例为大家分享了python实现俄罗斯方块的具体代码,供大家参考,具体内容如下 # teris.py # A module for game teris. # By programmer FYJ from tkinter import * from time import sleep from random import * from tkinter import messagebox class Teris: def __init__(self): #方块颜色列表 self.color =

  • python实现俄罗斯方块游戏

    在公司实习.公司推崇Python和Django框架,所以也得跟着学点. 简单瞅了下Tkinter,和Canvas配合在一起,还算是简洁的界面开发API.threading.Thread创建新的线程,其多线程机制也算是方便. 只是canvas.create_rectangle居然不是绘制矩形,而是新建了矩形控件这点让人大跌眼镜.先开始,在线程里每次都重绘多个矩形(随数组变化),其实是每次都新建了N个矩形,结果内存暴增.原来,对矩形进行变更时,只需用canvas.itemconfig即可. 下面就是

  • python和pygame实现简单俄罗斯方块游戏

    本文为大家分享了python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 Github:Tetris 代码: # -*- coding:utf-8 -*- import pygame, sys, random, copy from pygame.locals import * pygame.init() CubeWidth = 40 CubeHeight = 40 Column = 10 Row = 20 ScreenWidth = CubeWidth * (Column + 5) S

  • 用Python编写一个简单的俄罗斯方块游戏的教程

    俄罗斯方块游戏,使用Python实现,总共有350+行代码,实现了俄罗斯方块游戏的基本功能,同时会记录所花费时间,消去的总行数,所得的总分,还包括一个排行榜,可以查看最高记录. 排行榜中包含一系列的统计功能,如单位时间消去的行数,单位时间得分等. 附源码: from Tkinter import * from tkMessageBox import * import random import time #俄罗斯方块界面的高度 HEIGHT = 18 #俄罗斯方块界面的宽度 WIDTH = 10

  • python实现俄罗斯方块游戏(改进版)

    本文为大家分享了python实现俄罗斯方块游戏,继上一篇的改进版,供大家参考,具体内容如下 1.加了方块预览部分 2.加了开始按钮 在公司实习抽空写的,呵呵.觉得Python还不错,以前觉得像个玩具语言.希望能够用它做更多大事吧!!!加油. 截图如下: 代码如下: #coding=utf-8 from Tkinter import *; from random import *; import thread; from tkMessageBox import showinfo; import t

  • python编写俄罗斯方块

    本文实例为大家分享了python实现俄罗斯方块的具体代码,供大家参考,具体内容如下 #coding=utf-8 from tkinter import * from random import * import threading from tkinter.messagebox import showinfo from tkinter.messagebox import askquestion import threading from time import sleep class Brick

  • python编写网页爬虫脚本并实现APScheduler调度

    前段时间自学了python,作为新手就想着自己写个东西能练习一下,了解到python编写爬虫脚本非常方便,且最近又学习了MongoDB相关的知识,万事具备只欠东风. 程序的需求是这样的,爬虫爬的页面是京东的电子书网站页面,每天会更新一些免费的电子书,爬虫会把每天更新的免费的书名以第一时间通过邮件发给我,通知我去下载. 一.编写思路: 1.爬虫脚本获取当日免费书籍信息 2.把获取到的书籍信息与数据库中的已有信息作比较,如果书籍存在不做任何操作,书籍不存在,执行插入数据库的操作,把数据的信息存入Mo

  • Python编写登陆接口的方法

    本文实例为大家分享了Python编写登陆接口的具体代码,供大家参考,具体内容如下 1.输入用户名密码: 2.认证成功后显示欢迎信息: 3.错误三次后,账号被锁定. 账号文件:user.txt 锁定文件:locked.txt 流程图如下: # -*- coding:utf-8 -*- # Author Caoxl import sys account_file='E:\user.txt' locked_file='E:\locked.txt' def deny_account(username):

  • 使用Python编写vim插件的简单示例

    Vim 插件是一个 .vim 的脚本文件,定义了函数.映射.语法规则和命令,可用于操作窗口.缓冲以及行.一般一个插件包含了命令定义和事件钩子.当使用 Python 编写 vim 插件时,函数外面是使用 VimL 编写,尽管 VimL 学起来很快,但 Python 更加灵活,例如可以用 urllib/httplib/simplejson 来访问某些 Web 服务,这也是为什么很多需要访问 Web 服务的插件都是使用 VimL + Python 编写的原因. 在开始编写插件之前,你需要确认 Vim

  • 基于python编写的微博应用

    本文实例讲述了基于python编写的微博应用,分享给大家供大家参考.具体如下: 在编写自己的微博应用之前,先要到weibo开放平台申请应用的公钥和私钥. 下载python版的SDK,打开example目录,仿照oauthSetTokenUpdate.py进行编码, 复制代码 代码如下: # -*- coding: utf-8 -*- from weibopy.auth import OAuthHandler from weibopy.api import API consumer_key= '应

  • 浅析Python编写函数装饰器

    编写函数装饰器 本节主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. class tracer: def __init__(self,func): self.calls = 0 self.func = func def __call__(self,*args): self.calls += 1 print('call %s to %s' %(self.calls, self.func.__name__)

  • 使用python编写android截屏脚本双击运行即可

    测试的过程中经常需要截取屏幕,通常的做法是使用手机自带的截屏功能,然后将截屏文件复制出来,这种方法的优点是不需要连接数据线就可截屏,缺点则是生成的截屏文件命名是随机命名的,复制出来也比较麻烦.另一种方法是使用PC端的手机助手类软件. 这里使用python编写一个截屏的脚本,双击运行脚本就OK,截屏成功后会将截屏文件已当前时间命名,并保存在存放脚本的当前路径的screenshot文件夹下: #!/usr/bin/env python import os import time PATH = lam

  • 使用Python编写Linux系统守护进程实例

    守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控.此类程序会被以进程的形式初始化.通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下.守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行.–维基百科 守护进程区别于普通用户登陆系统后运行的进程,它是直接由系统初始化,和系统用户没有关系,而用户开启的进程依存与用

  • Python编写一个闹钟功能

    音频文件放入和.py文件同级的目录下 import winsound # 导入此模块实现声音播放功能 import time # 导入此模块,获取当前时间 # 提示用户设置时间和分钟 my_hour = input("请输入时:") my_minute = input("请输入分:") flag = 1 while flag: t = time.localtime() # 当前时间的纪元值 fmt = "%H %M" now = time.str

  • 详解如何使用Python编写vim插件

    前言 vim是个伟大的编辑器,不仅在于她特立独行的编辑方式,还在于她强大的扩展能力.然而,vim自身用于写插件的语言vimL功能有很大的局限性,实现功能复杂的插件往往力不从心,而且运行效率也不高.幸好,vim早就想到了这一点,她提供了很多外部语言接口,比如Python,ruby,lua,Perl等,可以很方便的编写vim插件.本文主要介绍如何使用Python编写vim插件. 准备工作 1. 编译vim,使vim支持Python 在编译之前,configure的时候加上--enable-pytho

随机推荐