python实现俄罗斯方块游戏


Posted in Python onMarch 25, 2020

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

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

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

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

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; 
 
 #绘图类 
 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开发。不过,怎样也抑制不住这颗喜欢写游戏的心啊!

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

更多关于python游戏的精彩文章请点击查看以下专题:

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

Python 相关文章推荐
Python序列之list和tuple常用方法以及注意事项
Jan 09 Python
详解Python2.x中对Unicode编码的使用
Apr 03 Python
Python中使用copy模块实现列表(list)拷贝
Apr 14 Python
python实现用户答题功能
Jan 17 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
python字符串的拼接方法总结
Nov 18 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
python实现Pyecharts实现动态地图(Map、Geo)
Mar 25 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
Mar 30 Python
python实现定时发送邮件
Dec 23 Python
Python基础之tkinter图形化界面学习
Apr 29 Python
python中的变量如何开辟内存
Jun 26 #Python
pyQt4实现俄罗斯方块游戏
Jun 26 #Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 #Python
python实现俄罗斯方块
Jun 26 #Python
解决python报错MemoryError的问题
Jun 26 #Python
pygame实现俄罗斯方块游戏
Jun 26 #Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 #Python
You might like
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
取得传值的函数
2006/10/27 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
Django model 中设置联合约束和联合索引的方法
2019/08/06 Python
python Pillow图像处理方法汇总
2019/10/16 Python
python 实现在shell窗口中编写print不向屏幕输出
2020/02/19 Python
Python多线程正确用法实例解析
2020/05/30 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
化学专业毕业生自荐信
2013/11/15 职场文书
招商经理岗位职责
2013/11/16 职场文书
青年志愿者事迹材料
2014/02/07 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
安全环保标语
2014/06/09 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
房产公证委托书范本
2014/09/20 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
社区重阳节活动总结
2015/03/24 职场文书
法定授权委托证明书
2015/06/18 职场文书
python 进阶学习之python装饰器小结
2021/09/04 Python