【python+情人节】玩个俄罗斯方块都是爱你的形状——三、自动拼图

俄罗斯方块、贪吃蛇、心形表白 | 好玩的C语言源码 哔哩哔哩Bilibili,你感兴趣的视频都在B站。哔哩哔哩Bilibili,你感兴趣的视频都在B站。哔哩哔哩Bilibili,你感兴趣的视频都在B站。,免费获取版贪吃蛇、俄罗斯方块、心形表白。,免费获取版贪吃蛇、俄罗斯方块、心形表白。的个人空间_哔哩哔哩_Bilibili。的个人空间_哔哩哔哩_Bilibili。的个人空间_哔哩哔哩_Bilibili。 阅读详情

本项目效果如图
动画过程已投稿b站:https://www.bilibili.com/video/av88671119
在这里插入图片描述

目录

一、思路分析

二、手动拼图

三、自动拼图

四、动画展示

======================= 大爽歌作,made by big shuang =======================

三、自动拼图

1、介绍分析

这里再先介绍一遍
本部分要通过算法实现俄罗斯方块拼出指定的形状,主要是解决一个纯算法问题,结果通过控制台输出(由于没有必要,所以本部分没有做gui)。
具体的
一直一个爱心形状文本如下(文本名为)

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0

其中0为背景,1位爱心的方格
要用如下七种俄罗斯方块拼出上方所有的1所代表的的爱心,

{
    "O": [(-1, -1), (0, -1), (-1, 0), (0, 0)],
    "S": [(-1, 0), (0, 0), (0, -1), (1, -1)],
    "T": [(-1, 0), (0, 0), (0, -1), (1, 0)],
    "I": [(0, 1), (0, 0), (0, -1), (0, -2)],
    "L": [(-1, 0), (0, 0), (-1, -1), (-1, -2)],
    "J": [(-1, 0), (0, 0), (0, -1), (0, -2)],
    "Z": [(-1, -1), (0, -1), (0, 0), (1, 0)],
}

不能有重叠,不能有剩余
用图来表示,即用如下七种俄罗斯方块拼出下方的粉红色爱心形状

在这里插入图片描述
在这里插入图片描述
这里我使用回溯法去寻找

2、回溯法详细过程分析

按列数从左到右,
——遍历所有种类的俄罗斯方块的所有形状,
————如果降落后和心形贴合
——————检查是否全部都拼完了
————————如果是,则返回True
————————否则进一步递归的去调用方法本身并返回
————如果不贴合,继续遍历
——如果遍历完了不贴合,则返回False

3、回溯法代码

依据2中的思路写出的代码如下
当然这个时候有个问题,由于回溯法太过耗时,所以我这边会一直运行却不出结果,这个在本文第四部分优化下,本部分就只通过代码展示回溯法的思路
puzzle_auto.py: 主代码。其中solve是递归方法

# usr/bin/env python
# -*- coding:utf-8- -*-
# 使用回溯法用七种俄罗斯方块拼出爱心形状
from util import *
from constants import *


class Solution:
    def __init__(self, txt_path):
        self.love_list = read_love_from_txt(txt_path)
        self.love_count = 0
        for row in self.love_list:
            for i in row:
                if i == "1":
                    self.love_count += 1

        self.r = len(self.love_list)
        self.c = len(self.love_list[0])

        self.board = None  # 记录每个位置已有的俄罗斯方格
        self.block_list = []
        self.block_id = 0
        self.refresh_board()

    def refresh_board(self):
        self.board = [
            ['' for ci in range(self.c)] for ri in range(self.r)
        ]

        for block in self.block_list:
            shape_type = block['kind']
            cc, cr = block['cr']
            cell_list = block['cell_list']

            for cell in cell_list:
                cell_c, cell_r = cell
                c = cell_c + cc
                r = cell_r + cr

                self.board[r][c] = shape_type

    def solve(self):
        """
        列数从左到右, 遍历所有种类的俄罗斯方块的所有形状,
        如果降落后和心形贴合,
            检查是否全部都拼完了,如果是,则返回True
            否则进一步递归的去调用方法本身并返回
        如果不贴合,继续遍历
        如果遍历完了不贴合,则返回False
        :return:
        """
        for shape in SHAPE_LIST:
            cell_list = SHAPES[shape]
            for ci in range(self.c):
                for angel in range(4):
                    rotate_list = get_cell_list_by_angle(cell_list, angel)
                    ri = self.get_land_r(rotate_list, ci)
                    if self.check_match((ci, ri), rotate_list):
                        cur_block = {
                                "cr":(ci, ri),
                                "kind": shape,
                                "cell_list": rotate_list,
                                "angle": angel
                            }
                        self.block_list.append(cur_block)

                        # 检查是否全部都拼完了
                        if self.check_match_all():
                            return True
                        else:
                            self.refresh_board()
                            res = self.solve()
                            if res:
                                return True
                            else:
                                self.block_list.pop()
                                self.refresh_board()

        return False

    def get_land_r(self, cell_list, ci):
        # 获取当前俄罗斯方块降落后的行位置
        ri = 0
        for ri in range(2, self.r):
            # 从上到下依次尝试能否移动该行,如果这行移动不到,则说明上一行是降落的着陆点
            if not self.check_move((ci, ri), cell_list, (0, 0)):
                return ri - 1

        return self.r - 1

    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.board[r][c] not in ['', 'R']:
                return False

        return True

    def check_match(self, cr, cell_list):
        # cell_list 检查是否匹配 love_list, 全部匹配1
        c, r = cr
        for cell in cell_list:
            cc, cr = cell
            rc, rr = cc+c, cr+r
            if rr >= self.r or rc < 0 or rc >= self.c:
                return False
            if self.love_list[rr][rc] != "1":
                return False

        return True

    def check_match_all(self):
        if 4 * len(self.block_list) == self.love_count:
            return True
        else:
            return False

    def print_block_list(self):
        if self.block_list:
            print('[')
            for block in self.block_list:
                print(' ', end='')
                print(block, end='')
                print(',')
            print(']')


if __name__ == '__main__':
    txt_path = "love3.txt"
    solution = Solution(txt_path)
    solution.solve()
    solution.print_block_list()

其他支持代码
util.py

# usr/bin/env python
# -*- coding:utf-8- -*-


def read_love_from_txt(txt_path):
    # 从txt中读取二维爱心列表,并返回
    with open(txt_path, 'r') as f:
        fl = f.readlines()

    love_list = []
    for line in fl:
        line = line.strip('\n')
        new_line = line.split(' ')
        love_list.append(new_line)

    return love_list


def get_cell_list_by_angle(cell_list, angle):
    # 将当前的 cell_list旋转指定的角度
    angle_dict = {
        0: (1, 0, 0, 1),
        1: (0, 1, -1, 0),
        2: (-1, 0, 0, -1),
        3: (0, -1, 1, 0),
    }
    a, b, c, d = angle_dict[angle]
    if angle == 0:
        return cell_list

    rotate_cell_list = []
    for cell in cell_list:
        cc, cr = cell
        rc, rr = a * cc + b * cr, c*cc+d*cr
        rotate_cell_list.append((rc, rr))

    return rotate_cell_list
# usr/bin/env python
# -*- coding:utf-8- -*-

C = 20
R = 20
CELL_SIZE = 30

FPS = 100

# 定义各种形状
SHAPES = {
    "O": [(-1, -1), (0, -1), (-1, 0), (0, 0)],
    "S": [(-1, 0), (0, 0), (0, -1), (1, -1)],
    "T": [(-1, 0), (0, 0), (0, -1), (1, 0)],
    "I": [(0, 1), (0, 0), (0, -1), (0, -2)],
    "L": [(-1, 0), (0, 0), (-1, -1), (-1, -2)],
    "J": [(-1, 0), (0, 0), (0, -1), (0, -2)],
    "Z": [(-1, -1), (0, -1), (0, 0), (1, 0)],
}

# 定义各种颜色,用于给第二第三阶段拼图上色
# ALL_COLORS = {
#     # 七种俄罗斯方块的颜色
#     "O": "#d25b6a",
#     "S": "#d2835b",
#     "T": "#e5e234",
#     "I": "#83d05d",
#     "L": "#2862d2",
#     "J": "#35b1c0",
#     "Z": "#5835c0",
#
#     # 其他颜色
#     "": "#CCCCCC",
#     "R": "#ffcccc",
#     "D": "#ff3366",
#     "line": "red"
# }

# 绘制动画时将七种俄罗斯方块全部换成深红色
ALL_COLORS = {
    # 七种俄罗斯方块的颜色
    "O": "#ff3366",
    "S": "#ff3366",
    "T": "#ff3366",
    "I": "#ff3366",
    "L": "#ff3366",
    "J": "#ff3366",
    "Z": "#ff3366",

    # 其他颜色
    "": "#CCCCCC",
    "R": "#ffcccc",
    "D": "#ff3366",
    "line": "red"
}

SHAPE_LIST = ["O", "S", "T", "I", "L", "J", "Z"]

DIRECTION = {
    "W": (0, -1),
    "S": (0, 1),
    "A": (-1, 0),
    "D": (1, 0),
}

附件
love3.txt

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0

4、回溯法代码优化

上面第三部分的代码要运行很久(我本地渣电脑运行三个小时都没看到结果。。。我都有点怀疑是不是代码逻辑有问题了)
这里很有必要对代码原有的solve方法进行一个优化
其实并没有做很复杂的工作
只是添加了这样一个逻辑:
从下往上,从左往右进行匹配
优化后的方法命名为advanced_solve
同时添加了几个辅助方法:
advanced_solve
refresh_board_bottom_cr
修改后的puzzle_auto.py如下

# usr/bin/env python
# -*- coding:utf-8- -*-
# 使用回溯法用七种俄罗斯方块拼出爱心形状
from util import *
from constants import *


class Solution:
    def __init__(self, txt_path):
        self.love_list = read_love_from_txt(txt_path)
        self.love_count = 0
        for row in self.love_list:
            for i in row:
                if i == "1":
                    self.love_count += 1

        self.r = len(self.love_list)
        self.c = len(self.love_list[0])

        self.board = None  # 记录每个位置已有的俄罗斯方格
        self.block_list = []
        self.block_id = 0
        self.refresh_board()
		
		# 相对于第三部分代码新增
        self.bc = -1
        self.br = -1
        self.refresh_board_bottom_cr()

    def refresh_board_bottom_cr(self):
        for ri in range(self.r-1, -1, -1):
            for ci in range(self.c):
                if self.love_list[ri][ci] == "1" and self.board[ri][ci] == "":
                    self.bc = ci
                    self.br = ri
                    return

    def refresh_board(self):
        self.board = [
            ['' for ci in range(self.c)] for ri in range(self.r)
        ]

        for block in self.block_list:
            shape_type = block['kind']
            cc, cr = block['cr']
            cell_list = block['cell_list']

            for cell in cell_list:
                cell_c, cell_r = cell
                c = cell_c + cc
                r = cell_r + cr

                self.board[r][c] = shape_type

    def solve(self):
        """
        列数从左到右, 遍历所有种类的俄罗斯方块的所有形状,
        如果降落后和心形贴合,
            检查是否全部都拼完了,如果是,则返回True
            否则进一步递归的去调用方法本身并返回
        如果不贴合,继续遍历
        如果遍历完了不贴合,则返回False
        :return:
        """
        for shape in SHAPE_LIST:
            cell_list = SHAPES[shape]
            for ci in range(self.c):
                for angel in range(4):
                    rotate_list = get_cell_list_by_angle(cell_list, angel)
                    ri = self.get_land_r(rotate_list, ci)
                    if self.check_match((ci, ri), rotate_list):
                        cur_block = {
                                "cr": (ci, ri),
                                "kind": shape,
                                "cell_list": rotate_list,
                                "angle": angel
                            }
                        self.block_list.append(cur_block)

                        # 检查是否全部都拼完了
                        if self.check_match_all():
                            return True
                        else:
                            self.refresh_board()
                            res = self.solve()
                            if res:
                                return True
                            else:
                                self.block_list.pop()
                                self.refresh_board()

        return False

    def advanced_solve(self):
        """
        先从下到上,从左到右进行匹配
        :return:
        """
        for shape in SHAPE_LIST:
            cell_list = SHAPES[shape]
            for ci in range(self.bc - 2, self.bc + 3):
                if ci < 0 or ci >= self.c:
                    continue
                for angel in range(4):
                    rotate_list = get_cell_list_by_angle(cell_list, angel)
                    ri = self.get_land_r(rotate_list, ci)
                    if self.check_match_bottom((ci, ri), rotate_list):
                        cur_block = {
                                "cr": (ci, ri),
                                "kind": shape,
                                "cell_list": rotate_list,
                                "angle": angel
                            }
                        self.block_list.append(cur_block)

                        # 检查是否全部都拼完了
                        if self.check_match_all():
                            return True
                        else:
                            self.refresh_board()
                            self.refresh_board_bottom_cr()
                            res = self.advanced_solve()
                            if res:
                                return True
                            else:
                                self.block_list.pop()
                                self.refresh_board()
                                self.refresh_board_bottom_cr()

        return False

    def get_land_r(self, cell_list, ci):
        # 获取当前俄罗斯方块降落后的行位置
        ri = 0
        for ri in range(2, self.r):
            # 从上到下依次尝试能否移动该行,如果这行移动不到,则说明上一行是降落的着陆点
            if not self.check_move((ci, ri), cell_list, (0, 0)):
                return ri - 1

        return self.r - 1

    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.board[r][c] not in ['', 'R']:
                return False

        return True

    def check_match(self, cr, cell_list):
        # cell_list 检查是否匹配 love_list, 全部匹配1
        c, r = cr
        for cell in cell_list:
            cc, cr = cell
            rc, rr = cc+c, cr+r
            if rr >= self.r or rc < 0 or rc >= self.c:
                return False
            if self.love_list[rr][rc] != "1":
                return False

        return True

    def check_match_bottom(self, cr, cell_list):
        # 不仅要检查 cell_list 是否匹配 love_list, 全部匹配1
        # 也要检查上一个最下面最靠左的未被覆盖的粉红方格是否被当前的俄罗斯方块覆盖
        c, r = cr

        isBottom = False
        for cell in cell_list:
            cc, cr = cell
            rc, rr = cc+c, cr+r
            if rr >= self.r or rc < 0 or rc >= self.c:
                return False
            if self.love_list[rr][rc] != "1":
                return False
            if self.bc == rc and self.br == rr:
                isBottom = True

        return isBottom

    def check_match_all(self):
        if 4 * len(self.block_list) == self.love_count:
            return True
        else:
            return False

    def print_block_list(self):
        if self.block_list:
            print('[')
            for block in self.block_list:
                print(' ', end='')
                print(block, end='')
                print(',')
            print(']')


if __name__ == '__main__':
    txt_path = "love3.txt"
    solution = Solution(txt_path)
    solution.advanced_solve()
    solution.print_block_list()

使用这个advanced_solve大概运行十几分钟能运行出结果(确实有点慢)
其输出结果如下(把这个结果保存到result.py然后交给第四节的去动画展示就可以看到动画过程)

[
 {'cr': (9, 15), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (10, 14), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (8, 13), 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
 {'cr': (11, 13), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (12, 12), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (6, 11), 'kind': 'O', 'cell_list': [(1, 1), (0, 1), (1, 0), (0, 0)], 'angle': 2},
 {'cr': (8, 11), 'kind': 'O', 'cell_list': [(1, 1), (0, 1), (1, 0), (0, 0)], 'angle': 2},
 {'cr': (10, 11), 'kind': 'T', 'cell_list': [(0, -1), (0, 0), (1, 0), (0, 1)], 'angle': 3},
 {'cr': (13, 11), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (5, 10), 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
 {'cr': (14, 10), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (7, 9), 'kind': 'O', 'cell_list': [(1, 1), (0, 1), (1, 0), (0, 0)], 'angle': 2},
 {'cr': (9, 9), 'kind': 'T', 'cell_list': [(0, -1), (0, 0), (1, 0), (0, 1)], 'angle': 3},
 {'cr': (11, 9), 'kind': 'O', 'cell_list': [(1, 1), (0, 1), (1, 0), (0, 0)], 'angle': 2},
 {'cr': (15, 9), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (3, 8), 'kind': 'O', 'cell_list': [(1, 1), (0, 1), (1, 0), (0, 0)], 'angle': 2},
 {'cr': (5, 8), 'kind': 'O', 'cell_list': [(1, 1), (0, 1), (1, 0), (0, 0)], 'angle': 2},
 {'cr': (12, 8), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (17, 8), 'kind': 'T', 'cell_list': [(0, 1), (0, 0), (-1, 0), (0, -1)], 'angle': 1},
 {'cr': (7, 7), 'kind': 'O', 'cell_list': [(1, 1), (0, 1), (1, 0), (0, 0)], 'angle': 2},
 {'cr': (9, 7), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (11, 6), 'kind': 'J', 'cell_list': [(1, 0), (0, 0), (0, 1), (0, 2)], 'angle': 2},
 {'cr': (13, 7), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (4, 7), 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
 {'cr': (5, 6), 'kind': 'S', 'cell_list': [(0, -1), (0, 0), (1, 0), (1, 1)], 'angle': 3},
 {'cr': (15, 6), 'kind': 'O', 'cell_list': [(1, 1), (0, 1), (1, 0), (0, 0)], 'angle': 2},
 {'cr': (7, 6), 'kind': 'Z', 'cell_list': [(-1, -1), (0, -1), (0, 0), (1, 0)], 'angle': 0},
 {'cr': (14, 5), 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
]
CanvasTetris:在 Canvas 中构建的免费拼图俄罗斯方块游戏 这是一个基于 javascript 的俄罗斯方块游戏。 在浏览器中打开 index.html 并播放。 您可以自由修改代码。 1.1.1 中的新功能(2011 年 3 月 31 日更新) 块的投影。 新增两个快捷键,按“P”键暂停游戏,按“R”键重新开始游戏。 1.2.1 版更新(2011 年 4 月 6 日更新) 创建暂停和游戏结束场景 修复投影块不会在可见块上过度绘制的问题 修复当用户使用空格键时,方块在地面时不会移动的错误。 修复block出现时,顶部之间没有空间的问题。 执照 麻省理工学院 立即下载

相关推荐

俄罗斯方块拼图游戏VB解题器解题算法

摘要:VB源码,游戏编程,俄罗斯方块,拼图游戏,算法  VB版的游戏解题器,俄罗斯方块拼图游戏解题器解题算法,拼图游戏解题器,采用VisualBasic编写。游戏是这样的:给定几块俄罗斯方块(不一定是那标准的七种)和一个目标矩形,要求用方块来覆盖矩形,不能有重叠,不能旋转方块,只能平移。   我设想中的解题器是这样的:   下方是创建方块区域,初始每个格子是0,鼠标点击后在1、0之间切换,点好后按按钮创建一个方块。重复以上操作创建所有需要的方块,每种方块一种颜色。完成后按按钮,输入m、n,解题器在上方画出m×n的矩形,然后用给定方块来覆盖它。   

三、生成随机方块,Python基于thinker实现的简单的俄罗斯方块小游戏

和*draw_block_move(canvas, a_block)*这2行代码(这两行代码俄罗斯方块是在固定位置,按照指定形状生成的,需要删掉这部分代码)然后还要再修改原来的check_move方法,就是发现下面有已固定的俄罗斯方块时,也不能移动,具体如下。所以接下来我们要实现的是:当俄罗斯方块落地的时候,将它固定住,然后再去生成新的。此时仍然有个问题:就是老的俄罗斯方块会被新的落地的俄罗斯方块覆盖,这个需要处理。按下键盘⬇️表示方块加速到底。当俄罗斯方块发现下面有已固定的俄罗斯方块时,也不能移动首先。

2301_76484015的博客 781

Intel RealSense D435 深度相机详解

Intel RealSense D435 深度相机是 Intel 推出的一款基于深度感知技术的相机,广泛应用于机器人、无人机、增强现实(AR)、虚拟现实(VR)、3D扫描、智能监控等领域。D435 是 RealSense 系列中较为高端的深度相机之一,结合了深度传感和 RGB 摄像技术,为用户提供高精度的深度数据和高质量的图像捕捉能力。

crasher123的博客 2944

【python+情人节】玩个俄罗斯方块都是爱你的形状——一、思路分析

本项目效果如图 动画过程已投稿b站:https://www.bilibili.com/video/av88671119 目录 一、思路分析 二、自动拼图 三、手动拼图 四、动画展示 ======================= 大爽歌作,made by big shuang ======================= 0、项目介绍 如最上面的图所示,本项目实际上就是通过俄罗斯方块拼出一...

大爽老师的博客 2572

Xilinx IP核 Block Memory Generator v8.4 的使用

本文主要介绍如何使用并初始化 Xilinx 提供的IP核 Block Memory Generator v8.4`,为了确保成功初始化,还对其进行了一个简单的仿真,更多细节请参考官方手册。

高阶近似的博客 1万+

MySQL等保三级合规实践:如何安全配置root账户的本地与受信主机登录策略

本文详细介绍了MySQL在等保三级合规框架下如何安全配置root账户的本地与受信主机登录策略。通过分析root账户的特殊保护需求,提供三种安全加固方案,包括限制访问范围、限定登录IP和完全禁止远程登录,并指导创建安全的远程管理账户。文章还涵盖了密码策略强化、日志审计配置和网络层防护等关键合规要求,帮助用户实现MySQL的等保三级全面合规。

weixin_42522964的博客 260

俄罗斯方块【六种模式】【c语言】【史上最强】

第一次做标题党,大家轻喷哈。这个游戏是博主在大一c语言实训时独立完成的,所有内容均为原创。小游戏耗时5天完成,除了常见的单人模式外,增加了作弊模式,双人模式,计时赛等玩法,真滴很好玩哦。虽然现在看起来很简陋,但对于当时的我来说实属不易,从页面设计到游戏背景音乐的选取再到关键算法的编写,每一步都凝汇了自己的努力,通宵鏖战的画面依然历历在目。现在分享出来,一方面是希望可以帮助到大家,另一方面也想纪念美好的大一时光。

赵小轩的博客 2万+

【vLLM-性能洞察】基于Ascend Profiler的端到端推理瓶颈定位与优化实践

本文详细介绍了如何利用Ascend Profiler对vLLM-Ascend大模型推理服务进行端到端的性能瓶颈定位与优化。通过实战案例,阐述了从数据采集、可视化分析到诊断低效算子、内存管理、计算通信重叠及框架调度等常见瓶颈的全过程,为基于昇腾NPU的AI推理性能调优提供了系统性的方法论和实用工具指南。

cc789的博客 521

OpenCV-俄罗斯方块

博主晚上闲来无事,用opencv写了一个俄罗斯方块程序,以前是用dos界面写的,不太好理解,所以这次把opencv代码贴出来,供大家娱乐,哈哈。 一、测试软硬件 测试硬件:PC-Windows 测试软件:VS2013 二、测试可执行程序 可执行程序下载地址:https://download.youkuaiyun.com/download/samylee/10855245 三、操作说明 界面1:选...

samylee的博客 937

MATLAB/simulink电力系统之变压器仿真+变压器饱和仿真+空载变压器电流畸变原因及仿真+空载合闸励磁涌流仿真+simulink免费仿真资源

单相变压器空载运行时,原边电流主要用来产生主磁场,而电路损耗和铁芯损耗很小,因此即使外加电压很大,空载电流仍然很小。如果想观察某个相对磁导率下电感系数的数值,可以在程序中增加这样的语句,比如,在程序中end语句之后,加上L(100),运行程序后就可以得到相对磁导率为 100时的电感系数值。在交流铁芯线圈中,当交变磁通按照正弦规律变化时,受到磁路饱和的影响,线圈中的电流会发生畸变,并成为尖顶波,这就是所谓的交流磁路电流畸变。需要指出,铁芯内的主磁通Ф可以通过空载时的副边电压从来测量,两者之间的数学关系,即。

m0_37724753的博客 4230

GEE|基于时间序列特征的山东省玉米随机森林分类代码

主题思路: 本实验为二分类实验,分类目标包括:玉米、其他(建筑、水体、水稻、 裸地、森林、小麦、道路、大蒜等),采用人工设计的特征指数的时间序列特征为分类依据,选取分类器为:随机森林分类器,并选取样本集中 70%作为训练样本,30%作为测试样本,通过调整随机森林棵数,调整分类器结构。选取以下参数进行分类: ⚫ 时间尺度:1990 年 4 月 15 日 - 1990 年 9 月 30 日 ⚫ 空间尺度:山东省 ⚫ 影像融合时间间隔:16天 ⚫ 特征值选择:['nir','ndvi'...

weixin_46493028的博客 7467

C语言零基础项目:俄罗斯方块游戏!详细思路+源码分享

每天一个C语言小项目,提升你的编程能力! 俄罗斯方块是童年的经典游戏~~

致力于C语言C++知识分享! 6295

Android Camera Sensor HDR详解

本文详细介绍了Android相机传感器(Sensor)中实现高动态范围(HDR)采集的各种技术方式。主要内容包括: Sensor HDR技术分类 帧内HDR(Single-Frame HDR):在同一帧同一像素内完成多增益采集,无运动伪影和帧率损失,包括DAG(双模拟增益)、DCG(双转换增益)等技术 帧间HDR(Multi-Frame HDR):通过多帧曝光实现,如DOL(数字重叠)、Staggered HDR等 混合HDR:结合多种技术的复合方案 详细技术原理 重点解析了DAG和DCG两种主流帧内HDR

DU_YULIN的博客 360

【python+情人节】玩个俄罗斯方块都是爱你的形状——二、手动拼图(通过gui辅助实现)

本项目效果如图 动画过程已投稿b站:https://www.bilibili.com/video/av88671119 目录 一、思路分析 二、手动拼图 三、自动拼图 四、动画展示 ======================= 大爽歌作,made by big shuang ======================= 二、手动拼图 1、介绍 手动拼图这里通过一个gui来辅助实现 这个g...

大爽老师的博客 1399

MTEX包在Matlab中实现从EBSD数据生成Abaqus网格与晶粒取向:一种对用户材料旋转矩阵分量实践的全面指南

此教程提供了一种使用MTEX Matlab包处理EBSD数据的方法,并生成Abaqus输入文件,这对于进行多晶体有限元分析具有极大的帮助。但值得注意的是,这只是一个基本的例子,实际应用中可能需要根据您的实际需求进行调整。MTEX包还提供了许多其他的功能,可以进行更复杂的分析和处理,我非常推荐您去探索。希望这篇文章能对您有所帮助,如果您有任何疑问或建议,欢迎留言交流。在接下来的文章中,我将会介绍更多关于MTEX的高级功能,敬请期待。– (完)–

qq_38334677的博客 4437

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【python+情人节】玩个俄罗斯方块都是爱你的形状——四、动画展示

本项目效果如图 动画过程已投稿b站:https://www.bilibili.com/video/av88671119 目录 一、思路分析 二、手动拼图 三、自动拼图 四、动画展示 ======================= 大爽歌作,made by big shuang ======================= 四、动画展示 1、介绍 动画只展示拼图结果,不展示结果的求解方法 结...

大爽老师的博客 954

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【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 im..

shunshunss的博客 627

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Houdini通过回溯法将特定碎块进行拼贴

优点:可以通过大量生成,并自动过滤掉小碎块较多的拼贴方式,方便从剩下的优质方案中筛选更为合理的结果。 上图: 思路借鉴了:【python+情人节】玩个俄罗斯方块都是爱你的形状——三、自动拼图_大爽歌的博客-优快云博客 ...

kraka的博客 674

python练手--自制俄罗斯方块(文末附源码)

小白练手的俄罗斯方块,用python和pygame实现,欢迎指导,欢迎讨论!

highmiao的博客 3万+

俄罗斯方块代码

 public class ERS_Block extends Frame{    public static boolean isPlay=false;    public static int level=1,score=0;    public static TextField scoreField,levelField;    public static MyTimer time...

bangzhou5573的博客 624

自己动手实现俄罗斯方块

俄罗斯方块 记得很小的时候,从邻居家的小朋友那里拿到一个游戏机(按现在的眼光已经算不上游戏机了),开始了人生中第一个电子游戏-俄罗斯方块,我不知道多少人是从那古老的游戏机而知道俄罗斯方块的,但俄罗斯方块的大名想必都听说过。 一个小小的俄罗斯方块就就能为我们增加无限的乐趣。当然了,如果能自己开发出来,岂不是很有成就感。 UI 最近在写Frida可视化相关的项目。在选择UI框架的时候使用了PythonQt5。本文通过编写俄罗斯方块来熟悉PythonQt5的基本操作。 为什么选择PythonQt5? 跨平台。这

helloworlddm的博客 1754

javascript 俄罗斯方块(含完整游戏代码)

function Tetris(pos, type, dir) { this.turn = function () { var flag = 1; switch (this.types_name[this.type]) { case &amp;quot;SQUARE&amp;quot;: return true; ...

C_Creator的博客 4619

俄罗斯方块代码(自写)

所用编译器:Visual Studio 2013 所用语言:C 所写代码简单易学耐心看完全可看懂 #include &lt;Windows.h&gt; #include &lt;time.h&gt; #include &lt;stdio.h&gt; #include &lt;mmsystem.h&gt; #include &lt;wingdi.h&gt; #include "resourc...

KAKA的博客 3万+

算法帖——用舞蹈链算法(Dancing Links)求解俄罗斯方块覆盖问题

问题的提出:如下图,用13块俄罗斯方块覆盖8*8的正方形。如何用计算机求解? 解决这类问题的方法不一而足,然而核心思想都是穷举法,不同的方法仅仅是对穷举法进行了优化 用13块不同形状的俄罗斯方块(每个方块只能使用一次)覆盖住棋盘,很容易就想到这是“精确覆盖问题”(13个俄罗斯方块完全覆盖住8*8的正方形)。而舞蹈链算法(Dancing Li...

weixin_33726318的博客 768
上一篇: 【python+情人节】玩个俄罗斯方块都是爱你的形状——四、动画展示
下一篇: 冒泡排序动画(基于python pygame实现)
大爽歌
博客等级 码龄9年 422粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值