不稳定版的python俄罗斯方块

2023-12-09 19:38

本文主要是介绍不稳定版的python俄罗斯方块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于Python2.7,Linux下运行异常

有普通俄罗斯方块的功能以及历史最高分、暂停、重玩功能

本来是在另一台电脑上的,那台电脑不能连接u盘,故本版本是对着稳定版的代码抄的,可能哪里抄错了一些,所以存在bug.

# coding=utf-8
from Tkinter import *
from random import *
try:import cPickle as pickle
except ImportError:import pickle
import  threading
from time import sleep
import os#幕布类
class Curtain(object):def __init__(self, canvas):self.row = 20self.col = 10self.back = list()self.gridBack = list()for i in range(0, self.row):self.back.insert(i, list())self.gridBack.insert(i, list())for i in range(0, self.row):for j in range(0,self.col):self.back[i].insert(j, 0)self.gridBack[i].insert(j, canvas.create_rectangle(30 * j, 30 * i, 30 * (j+1), 30 * (i+1)))#方块类
class Brick(object):def __init__(self):self.speed = 1     #下落速度self.shape = 0self.curRow = 0self.curCol = 0self.down = False#生成一个新方块def getNewBrick(self, brickConfig):self.curBrickNum = randint(0, len(brickConfig)-1)self.shape = 0self.currBrick = brickConfig[self.curBrickNum][self.shape]self.curCol = 0self.curRow = 0self.down = False'''工具类:1.读写配置文件的形状、分数历史记录信息2.控制程序暂停、继续、重玩3.判断方块是否抵达边界4.检测方块生成位置上是否有被占用的格子
'''
class Tool(object):def __init__(self):self.curr_dir = os.path.dirname(os.path.realpath(__file__))    #取得当前目录的路径self.ifPause = Falseself.ifRestart = False#暂停def pause(self):self.ifPause = True#继续def continu(self):self.ifPause = False#重玩def restart(self):self.ifRestart = True#判断是否抵达边界,左移则aspect传1,右移传3,下移传4def checkIfArriveBorder(self, aspect, brick, back):flag = Trueif aspect == 4:         #下,没到下界返回Truefor i in range(0, 3):for j in range(0, 3):if brick.currBrick[i][j] != 0 and (brick.curRow + i >= back.row or back.back[brick.curRow + i][brick.curCol + j] !=0):flag = Falsebrick.down = Truebreakelif aspect == 3:                   #右for i in range(0, 3):for j in range(0, 3):if brick.currBrick[j][i] != 0 and (brick.curCol + i >= back.col or back.back[brick.curRow + i][brick.curCol + j] !=0):flag = Falsebreakelif aspect == 2:       #上,判断变形操作是否会越界if brick.curCol < 0:brick.curCol = 0if brick.curCol + 2 >= back.col:brick.curCol = back.col - 3if brick.curRow + 2 >= back.row:brick.curRow = brick.curRow - 3elif aspect == 1:for i in range(0, 3):for j in range(0, 3):if brick.currBrick[i][j] != 0 and(brick.curCol + i < 0 or back.back[brick.curRow + j][brick.curCol + i] != 0):flag = Falsebreakelse:print '未知错误,aspect值=',aspect#从文件中读取历史最高分def getMaxGrade(self):f = open(self.curr_dir + '/grade.txt', 'rb')grade = pickle.load(f)  # 反序列化历史最高分的信息f.close()return grade#向文件中写入新的历史最高分def updateHistoryGradeMax(self, newMax):f = open(self.curr_dir + '/grade.txt', 'wb')f.seek(0)f.truncate()pickle.dump(newMax, f)f.close()#从配置文件中读取方块的形状并返回读取的值def getBrickFromConfig(self):_configFile = open(self.curr_dir + '/config.txt', 'rb')brick = pickle.load(_configFile)_configFile.close()return brick#检测方块生成位置上是否有被占用的格子,有则返回True,并检查顶层格子是否有方块,有则游戏结束def checkIfBeenUse(self, back, brick):flag = Falsefor i in range(0,3):for j in range(0,3):if back.back[i][j] == 1 and brick.currBrick[i][j] == 1:flag = Truebreakif flag:breakfor i in range(0, back.col):if back.back[0][i] == 1:flag = Truebreakreturn flag
class Main(object):#实例化类和图形相关的组件def _init__(self):self.start = Trueself.tool = Tool()self.root = Tk()self.HistoryScorceMax = self.tool.getMaxGrade()self.currGrade = 0self.brickConfig = self.tool.getBrickFromConfig()self.ifRestart = Falseself.root.title = ('俄罗斯方块v0.1')self.root.minsize(400, 600)self.frame = Frame(self.root, width=400, height = 600)self.frame.place(x=0, y=0)self.label = Label(self.root,text='历史最高分')self.historyGradeLabel = Label(self.root,text=self.HistoryScorceMax)  #显示历史最高分self.label1 = Label(self.root,text='当前分数')self.gameInfo = Label(self.root,text='游戏开始',fg='red',font=('times',12,'bold'))self.currentGradeLabel = Label(self.root, text=self.currGrade)self.button1 = Button(text='暂停', command=self.tool.pause)self.button2 = Button(text='继续', command=self.tool.continu)self.button3 = Button(text='重玩', command=self.tool.restart)self.canvas = Canvas(self.frame, width=300, heigh=600)self.button1.place(x=350, y=0)self.button2.place(x=350, y=40)self.button3.place(x=350, y=80)self.label.place(x=304, y=120)self.historyGradeLabel.place(x=369, y=120)self.currentGradeLabel.place(x=357, y=160)self.gameInfo.place(x=304, y=200)self.label1.place(x=304, y=160)self.back = Curtain(self.canvas)self.brick = Brick()self.canvas.pack()#清屏并重新开始def cleanAndRestart(self):for i in range(0, self.back.row):            #重置位置信息和颜色for j in range(0, self.back.col):self.back.back[i][j] = 0self.canvas.itemconfig(self.back.gridBack[i][j],fill="white")self.brick.getNewBrick(self.brickConfig)     #重置方块self.currGrade = 0                         #重置分数self.currentGradeLabel.config(text=self.currGrade)self.tool.ifRestart = Falseself.gameInfo.config(text="游戏开始")#更新当前分数并对比历史最高分,若超过历史最高分刷新历史最高分并写入文件存储def updateAndCheckGrade(self):self.currGrade += 1self.currentGradeLabel.config(text=self.currGrade)if self.currGrade > self.HistoryScorceMax:self.HistoryScorceMax = self.currGradeself.historyGradeLabel.config(text=self.HistoryScorceMax)self.tool.updateHistoryGradeMax(self.HistoryScorceMax)#检查是否有需要消除的行def checkIfNeedRemove(self):for i in range(0, self.back.row):tag1 = Truefor j in range(0, self.back.col):if self.back.back[i][j] == 0:tag1 = Falsebreakif tag1 == True:self.updateAndCheckGrade()for m in xrange(i - 1, 0, -1):for n in range(0, self.back.col):self.back.back[m+1][n] = self.back.back[m][n]#更新back表中的位置信息def updateBackInfo(self):for i in range(0, self.back.row):for j in range(0, self.back.col):if self.back.back[i][j] == 1:self.canvas.itemconfig(self.back.gridBack[i][j], fill="red")elif self.back.back[i][j] == 0:self.canvas.itemconfig(self.back.gridBack[i][j], fill="white")for i in range(0, len(self.brick.currBrick)):for j in range(0, len(self.brick.currBrick[i])):if self.brick.currBrick[i][j] == 1:self.canvas.itemconfig(self.back.gridBack[self.brick.curRow+i][self.brick.curCol+j], fill="red")#判断方块是否已经运动到达底部if self.brick.down:for i in range(0, len(self.brick.currBrick)):for j in range(0, len(self.brick.currBrick[i])):if self.brick.currBrick[i][j] != 0:self.back.back[self.brick.curRow+i][self.brick.curCol+j] = self.brick.currBrick[i][j]#检查整行是否需要消除self.checkIfNeedRemove()#获得下一个方块self.brick.getNewBrick(self.brickConfig)#处理键盘事件def onKeyBoardEvent(self, event):#未开始,不必监听键盘输入if self.start == False:returnif self.tool.ifPause:    #暂停时不监听键盘操作return#记录原来的值midCurCol = self.brick.curColmidCurRow = self.brick.curRowmidShape = self.brick.shapedirection = 0midBrick = self.brick.currBrickif event.keycode == 37:# 左移self.brick.curCol -= 1direction = 1elif event.keycode == 38:# 变化方块的形状self.brick.shape += 1direction = 2if self.brick.shape >= 4:self.brick.shape = 0self.brick.currBrick = self.brickConfig[self.brick.curBrickNum][self.brick.shape]elif event.keycode == 39:direction = 3# 右移self.brick.curCol += 1elif event.keycode == 40:direction = 4# 下移self.brick.curRow += 1if self.tool.checkIfArriveBorder(direction,self.brick,self.back):self.brick.curCol = midCurColself.brick.curRow = midCurRowself.brick.shape = midShapeself.brick.currBrick = midBrickself.updateBackInfo()return True#方块向下移动的线程run方法def brickDown(self):while True:if self.start == False:print("线程退出")break;if self.tool.ifRestart:print '开始重玩'self.cleanAndRestart()while self.tool.ifPause:if self.tool.ifRestart:self.cleanAndRestart()  #暂停时点击重玩按钮,进入重玩流程self.tool.ifPause = Falsebreakif self.tool.checkIfBeenUse(self.back,self.brick):print('格子被占用,游戏结束')self.gameInfo.config(text="游戏结束")while True:if self.tool.ifRestart:self.cleanAndRestart()self.tool.ifPause = Falsebreakelse:tempRow = self.brick.curRowself.brick.curRow += 1if self.tool.checkIfArriveBorder(4, self.brick, self.back) == False:self.brick.curRow = tempRowself.updateBackInfo()sleep(self.brick.speed)def __init__(self):self._init__()self.brick.getNewBrick(self.brickConfig)self.downThread = threading.Thread(target=self.brickDown, args=())self.downThread.start()#监听键盘事件self.root.bind("<KeyPress>", self.onKeyBoardEvent)self.root.mainloop()self.start = False
main = Main()

 

这篇关于不稳定版的python俄罗斯方块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/474842

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数