【python+情人节】玩个俄罗斯方块都是爱你的形状

修改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):
        """
        向指定方向移动俄罗斯方块 

由于代码比较长,需要代码的可以扫码获取!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值