修改py代码:
drawer.py:用于绘制的画板类
constants.py:记录要用到的常量
results.py: 拼图结果
未修改的代码和文件
util.py:用于绘制的画板类
love3.txt: 迷宫文本
各个文件的代码如下
puzzle_show.py:
# usr/bin/env python # -*- coding:utf-8- -*- import tkinter as tk import time import turtle from drawer import Drawer from util import * from constants import CELL_SIZE, C, R, SHAPE_LIST, SHAPES, FPS from results import * class PuzzleApp: def __init__(self, c, r, txt_path, res): self.win = tk.Tk() self.love_list = read_love_from_txt(txt_path) # 获取love_list 的长宽 self.love_r = len(self.love_list) self.love_c = len(self.love_list[0]) self.r = r self.c = c self.pr = r - self.love_r self.pc = (c - self.love_c) // 2 self.generate_board() self.drawer = Drawer(self.win, self.c, self.r, CELL_SIZE) self.drawer.draw_background(self.board) self.block_id = -1 # 记录是第几个俄罗斯方块 self.block = {} # 俄罗斯方块的信息 self.block_list = [] # 记录已经着陆的俄罗斯方块 self.res = res self.show_over = False def print_block_list(self, event): if self.block_list: print('[') for block in self.block_list: print(block) print(']') def generate_board(self): # 生成全空的二维列表 board self.board = [ ['' for ci in range(self.c)] for ri in range(self.r) ] # 生成全空的二维列表 block_blard ,用于记录俄罗斯方块的存储情况 self.block_board = [ ['' for ci in range(self.c)] for ri in range(self.r) ] # 二维列表 board 中记录 love_list,将里面的粉红色方格记录为'R' for ri in range(len(self.love_list)): for ci in range(len(self.love_list[0])): if self.love_list[ri][ci] == "1": self.board [ri+self.pr][ci + self.pc] = "R" def generate_new_block(self): self.block_id += 1 cr = [self.pc + self.love_c // 2, 2] _kind = SHAPE_LIST[0] self.block = { 'cr': cr, 'kind': _kind, 'cell_list': SHAPES[_kind], 'angle': 0, # 角度 } self.drawer.draw_block(self.block, self.block_id) def check_move(self, cr, cell_list, direction): # 判断某个俄罗斯方块的方格能否在某个位置摆放 cc, cr = cr cell_list = cell_list for cell in cell_list: cell_c, cell_r = cell c = cell_c + cc + direction[0] r = cell_r + cr + direction[1] # 判断该位置是否超出左右边界,以及下边界 # 一般不判断上边界,因为俄罗斯方块生成的时候,可能有一部分在上边界之上还没有出来 if c < 0 or c >= self.c or r >= self.r: return False # 必须要判断r不小于0才行,具体原因你可以不加这个判断,试试会出现什么效果 if r >= 0 and self.block_board[r][c] not in ['', 'R']: return False return True def move_block(self, direction): """ 向指定方向移动俄罗斯方块
由于代码比较长,需要代码的可以扫码获取!