python编的俄罗斯方块游戏_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("",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();

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进入hbase命令_Zookeeper、Hbase安装部署

zookeeper安装与配置使用xftp将压缩包传入/soft中创建zookeeper数据存放目录mkdir /soft/zookeeperchmod 766 /soft/zookeeper分别在三台服务上面依次执行 echo id > /var/zookeeper/myid 命令创建zookeeper编号的myid文件echo 1 > /soft/zookeeper/myidecho 2 > /sof…

c++new时赋初值_C高级编程精髓之内存管理,万千码农踩过的雷,大神带你走出雷区...

今天给大家分享C高级编程精华片之内存管理——欢迎跟大家一起踏进内存这片雷区&#xff0c;然后带大家从雷区中走出来&#xff01;程序员们经常编写内存管理程序&#xff0c;往往提心吊胆。如果不想触雷&#xff0c;唯一的解决办法就是发现所有潜伏的地雷并且排除它们&#xff…

为什么用pyqt的不多_现在农村提倡用天然气和清洁煤球取暖,为何农民不爱用?看完懂了...

近几年华北很多农村响应保护环境的政策&#xff0c;大多数农村家庭都安装了天然气。冬季的取暖方式也从以前的烧煤取暖改成了烧天然气或清洁煤球取暖。对于安装天然气并烧天然气或清洁煤球取暖&#xff0c;大多数农民都很抗拒&#xff0c;为什么农村人不愿意烧天然气和清洁煤球…

两种参数类型_布尔参数这些缺点不能忍?不如试试枚举吧

全文共2222字&#xff0c;预计学习时长9分钟图源&#xff1a;unsplash在代码库中使用布尔标志值来管理状态机似乎听起来是个不错的办法&#xff0c;但事实并非如此。布尔值恐怕是很多程序员接触到的第一种数据类型&#xff0c;它非常简单&#xff0c;只有两种状态: true 和fals…

405 not allowed怎么解决_英语口语:“您拨叫的用户不在服务区”这类电话常用语怎么说...

1、空号&#xff1a;中文&#xff1a;您好&#xff01;您所拨打的号码是空号&#xff0c;请核对后再拨。英文&#xff1a;Sorry! The number you dialed does not exist, please check it and dial later.2、被叫用户关机&#xff1a;中文&#xff1a;您好&#xff01;您所拨打…

利用代码分别实现jdk动态代理和cglib动态代理_代理模式实现方式及优缺点对比...

作者&#xff1a;爱宝贝丶来源&#xff1a;https://my.oschina.net/zhangxufeng/blog/1633187代理模式最典型的应用就是AOP&#xff0c;本文结合主要讲解了代理模式的几种实现方式&#xff1a;静态代理和动态代理&#xff0c;这里动态代理又可以分为jdk代理和Cglib代理&#xf…

$ajax不能识别,JQuery/JS Ajax功能无法识别

我有一些jQuery的&#xff0c;这将始终抛出此错误控制台&#xff1a;Uncaught SyntaxError: Unexpected token .从符合$。阿贾克斯()在它的函数调用。$(#send).click(function(){$("#form").submit();});$("#form").submit({$.ajax({url: "../php/mai…

防抖 节流_防抖节流与前端性能优化

在我们日常的开发中经常会用到一些容易被反复触发的事件。比如&#xff1a;scroll、resize、鼠标事件(mousemove,mouseover等)、键盘事件(keyup、keydown)。频繁触发回调导致的大量计算会引发页面的抖动甚至卡顿。为了规避这种情况&#xff0c;我们需要一些手段来控制事件被触发…

电脑温度检测软件哪个好_重装电脑,用哪个软件重装系统比较好?

展开全部大家好我是大2113明、关于重装5261系统的问题没4102有“用哪个软件重装好“这个概念&#xff0c;重装系统的1653形式无非就是“正常安装”“GHOST快捷安装”“网络安装”这三种形式&#xff0c;所谓的用软件来安装应该是“网络在线安装”的形式&#xff0c;接下来我就说…

扫雷程序设计 python_端口扫描

通过该工具可以扫描常用的端口和指定的端口是否开放。 常用端口号&#xff1a; 代理服务器常用以下端口&#xff1a; &#xff08;1&#xff09;. HTTP协议代理服务器常用端口号&#xff1a;80/8080/3128/8081/9080 &#xff08;2&#xff09;. SOCKS代理协议服务器常用端口号&…

惠普10代的服务器有哪些型号,英特尔官方科普:秒懂十代酷睿型号怎么认!

今日&#xff0c;英特尔官方微博再次放出科普&#xff1a;十代酷睿处理器是如何命名的&#xff1f;英特尔介绍&#xff0c;以酷睿i7-1065G7为例&#xff0c;“i7”为产品型号&#xff0c;“1065”中的“10”代表十代酷睿&#xff0c;“65”为CPU代号&#xff0c;“G7”为显卡性…

python日期迭代_计算敏捷项目中迭代时间安排(Python3版)

节奏是敏捷开发的核心&#xff0c;保持合理固定的节奏&#xff0c;能有效的促使各个环节协调统一&#xff0c;高效运行。针对产品的不同周期&#xff0c;方案有所不同。迭代开发.jpg通常&#xff0c;我们需要在一个时间盒中去分配一个项目中不同阶段的时间&#xff0c;在项目管…

form提交后台注解拿不到数据_浏览器是如何将用户数据发送到服务器的?

今天是刘小爱学习Java的第89天。感谢你的观看&#xff0c;谢谢你。话不多说&#xff0c;开始今天的学习&#xff1a;在学习之前&#xff0c;先思考如下问题&#xff1a;对于浏览器来说&#xff1a;如何将用户数据发送到服务器呢&#xff1f;数据传输的格式是怎么样的呢&#xf…

proxmoxve打造云桌面_微软云电脑Cloud PC曝光:配置一般还不便宜

光纤宽带的普及和提速、5G的兴起&#xff0c;让云电脑、云游戏、云手机等产品和应用红火起来。而微软也正在开发一款名为Cloud PC的云端Windows操作系统&#xff0c;并计划2021年正式推出。据报道&#xff0c;Cloud PC是由Azure云服务支撑&#xff0c;基于虚拟桌面打造的&#…

无法检索传真服务器信息,帮助中心

1、交易协议未经您本人同意&#xff0c;我们不会向第三者透露您的任何个人信息和购买记录。您在使用信用卡、储蓄卡和其它支付方式的时候&#xff0c;有关个人资料在结算时将向有关的金融认证系统直接传送&#xff0c;包括我们在内的任何其它人无法得知。为了保护您的隐私和个人…

alpine linux图形界面_跟光磊学Linux运维-Linux入门与基本使用

认识Linux用户在安装CentOS8.2时&#xff0c;设置过root用户的密码&#xff0c;同时也创建了用户guanglei。其中root用户是系统自带的管理员账户&#xff0c;也被称为超级用户&#xff0c;root用户接近系统完整的控制能力&#xff0c;对系统损害几乎有无限的能力。运维人员在生…

休眠 嵌入式_内幕消息:嵌入式软件挤出最低功耗模式

低功耗运行仍然是各行业应用的关键驱动因素。随着睡眠模式的增加&#xff0c;电源管理突然从单纯的硬件问题转移到软件开发人员必须考虑的事情上。功耗模式的最简单应用是当系统空闲时&#xff0c;将其置于休眠状态。然而&#xff0c;今天的MCU提供多种低功耗模式&#xff0c;进…

cnn 验证集 参与训练吗_一个简单的零基础的机器学习教程之二,字母数字验证码识别...

一.前言基于前面我发的贴子 土味程序员&#xff1a;一个简单的零基础的机器学习教程&#xff0c;Pytorch搭建Faster R-CNN目标检测平台​zhuanlan.zhihu.com一个非常震撼的目标检测的例子。上个帖子从环境安装到调试代码再到图片检测视频检测一个详细的教程&#xff0c;今天我来…

activiti 文档_免费、开源、多平台的PDF文档处理软件——PDFsam Basic

今天给大家推荐的是一款免费、开源、多平台支持的PDF文档处理软件——PDFsam BasicPDFsam Basic是为普通用户提供的免费开源解决方案&#xff0c;提供了PDF文档拆分、合并、混合、提取页面和旋转等等功能。01. 文档分割PDFsam Basic可以通过给定页码、书签级别&#xff0c;把PD…

sq服务启动后又停止_SQL SERVER SQL Agent  服务启动后又停止的解决办法

查看事件查看器。应用程序日志。报错的显示。无法加载 DLL xplog70.dll 或它引用的一个 DLL。原因:126(找不到指定的模块。)。安全起见&#xff0c;我更名了sqlserver bin下的xplog70.dll,还原回来即可。以下是搜索到的其它人的错误及解决办法。算是个整理吧。本地计算机上的MS…