【python+情人節】玩個俄羅斯方塊都是愛你的形狀——四、動畫展示

本項目效果如圖
動畫過程已投稿b站:https://www.bilibili.com/video/av88671119

在這裏插入圖片描述

目錄

一、思路分析

二、手動拼圖

三、自動拼圖

四、動畫展示

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

四、動畫展示

1、介紹

動畫視頻已投稿到我的b站,點擊觀看視頻
動畫只展示拼圖結果,不展示結果的求解方法
結果的求解方法見之前的二三部分
這裏爲了好看,簡單修改了下顏色和樣式
最後展示後的結果如最上方的圖
本部分代碼是在第二部分手動拼圖的代碼基礎上完成的
感興趣的可以兩個對照看看
其中新增py文件:
puzzle_show.py: 主入口,展示繪製動畫
修改py代碼:
drawer.py: 用於繪製的畫板類
constants.py: 記錄要用到的常量
results.py: 拼圖結果
未修改的代碼和文件
util.py: 用於繪製的畫板類
love3.txt: 迷宮文本

2、代碼

各個文件的代碼如下
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):
        """
        向指定方向移動俄羅斯方塊
        """
        cr = self.block['cr']
        cell_list = self.block['cell_list']

        if self.check_move(cr, cell_list, direction):
            # 先清除原有的
            self.drawer.clean_by_block_id(self.block_id)
            # 再繪製新的
            new_cr = [cr[0]+direction[0], cr[1]+direction[1]]
            self.block['cr'] = new_cr
            self.drawer.draw_block(self.block, self.block_id)
            self.win.update()

    def rotate_block(self):
        angle = self.block['angle']
        angle += 1
        angle %= 4  # 除4取餘數,避免角度超過4
        cell_list = self.block['cell_list']
        rotate_list = get_cell_list_by_angle(cell_list, 1)

        if self.check_move(self.block['cr'], rotate_list, [0, 0]):
            # 先清除原有的
            self.drawer.clean_by_block_id(self.block_id)
            # 再繪製新的
            self.block['angle'] = angle
            self.block['cell_list'] = rotate_list
            self.drawer.draw_block(self.block, self.block_id)
            self.win.update()

    def change_block(self):
        kind_index = SHAPE_LIST.index(self.block['kind'])
        next_kind = SHAPE_LIST[(kind_index + 1) % len(SHAPE_LIST)]

        if self.check_move(self.block['cr'], SHAPES[next_kind], [0, 0]):
            # 先清除原有的
            self.drawer.clean_by_block_id(self.block_id)
            # 再繪製新的
            self.block['angle'] = 0
            self.block['kind'] = next_kind
            self.block['cell_list'] = SHAPES[next_kind]
            self.drawer.draw_block(self.block, self.block_id)
            self.win.update()

    def land(self):
        # 俄羅斯方塊直接着陸
        c, r = self.block['cr']
        cell_list = self.block['cell_list']

        new_r = self.get_land_r(cell_list, c)
        while r < new_r:
            # 先清除原有的
            self.drawer.clean_by_block_id(self.block_id)
            # 再繪製新的
            r += 1
            self.block['cr'] = [c, r]
            self.drawer.draw_block(self.block, self.block_id)
            self.win.update()
            time.sleep(0.01)

        self.drawer.draw_block_line(self.block, self.block_id)

        self.block_list.append(self.block)
        self.refresh_block_board()
        self.win.update()

    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 refresh_block_board(self):
        self.block_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.block_board[r][c] = shape_type

    def back(self, event):
        if self.block_id>0:
            # 先隱藏當前的俄羅斯方塊
            self.drawer.clean_by_block_id(self.block_id)

            # 再回退到上一個俄羅斯方塊
            self.block = self.block_list.pop()
            self.block['cr'][1] = 2
            self.drawer.clean_by_block_id(self.block_id-1)
            self.block_id -= 1
            self.drawer.draw_block(self.block, self.block_id)
            self.refresh_block_board()
            self.win.update()

    def game_loop(self):
        if self.show_over:
            return
        elif self.block:
            self.move_block_to_res()
        else:
            self.get_next_block()

        self.win.after(FPS, self.game_loop)

    def move_block_to_res(self):
        if self.block['kind'] != self.block['res_kind']:
            self.change_block()
        elif self.block['angle'] != self.block['res_angle']:
            self.rotate_block()
        elif self.block['cr'][0] != self.block['res_cr'][0]:
            c = self.block['cr'][0]
            rc = self.block['res_cr'][0]
            if c < rc:
                # 右移
                self.move_block([1, 0])
            elif c > rc:
                self.move_block([-1, 0])
        elif self.block['cr'][1] != self.block['res_cr'][1]:

            self.land()
            self.block = {}

    def get_next_block(self):
        # 從已保存的結果中取出下一個block
        self.block_id += 1
        if self.block_id >= len(self.res):
            # 所有block均被取出,演示完畢
            self.show_over = True
            return

        self.block = self.res[self.block_id]
        self.block['res_angle'] = self.block['angle']
        self.block['angle'] = 0

        c, r = self.block['cr']

        self.block['res_cr'] = [c+self.pc, r + self.pr]
        self.block['cr'] = [self.pc + self.love_c // 2, 2]

        self.block['res_kind'] = self.block['kind']
        self.block['kind'] = SHAPE_LIST[0]
        self.block['cell_list'] = SHAPES[SHAPE_LIST[0]]

        self.drawer.draw_block(self.block, self.block_id)

if __name__ == '__main__':
    txt_path = "love3.txt"
    app = PuzzleApp(C, R, txt_path, res2)
    app.game_loop()
    app.win.mainloop()

drawer.py:

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

import tkinter as tk
from constants import ALL_COLORS, DIRECTION


class Drawer(tk.Canvas):
    def __init__(self, master, c, r, cell_size):
        self.c = c
        self.r = r
        self.cell_size = cell_size
        height = r * cell_size
        width = c * cell_size
        super().__init__(master, width=width, height=height)
        self.pack()

    def draw_background(self, board):
        for ri in range(self.r):
            for ci in range(self.c):
                color = ALL_COLORS[board[ri][ci]]
                self.draw_cell_by_cr(ci, ri, color)

    def draw_cell_by_cr(self,c, r, color, tag=None):
        x0 = c * self.cell_size
        y0 = r * self.cell_size
        x1 = c * self.cell_size + self.cell_size
        y1 = r * self.cell_size + self.cell_size
        # tag用於在後面刪除指定tag的方格
        if tag is None:
            # 沒有tag代表的是背景色
            self.create_rectangle(x0, y0, x1, y1, fill=color, outline="white", width=2)
        else:
            # 有tag 代表的是俄羅斯方塊
            _tag = "b%s" % tag
            self.create_rectangle(x0, y0, x1, y1, fill=color,
                                  outline=color, tag=_tag)

    def draw_block(self, block, block_id):
        c, r = block['cr']
        shape_type = block['kind']
        cell_list = block['cell_list']
        for cell in cell_list:
            cell_c, cell_r = cell
            ci = cell_c + c
            ri = cell_r + r
            # 判斷該位置方格在畫板內部(畫板外部的方格不再繪製)
            if 0 <= c < self.c and 0 <= r < self.r:
                self.draw_cell_by_cr(ci, ri, ALL_COLORS[shape_type], block_id)

    def clean_by_block_id(self, block_id):
        _tag = "b%s" % block_id
        self.delete(_tag)

    def draw_line(self, c, r, d, color, block_id):
        if d == "W":
            x0 = c * self.cell_size
            y0 = r * self.cell_size
            x1 = c * self.cell_size + self.cell_size
            y1 = y0
        elif d == "S":
            x0 = c * self.cell_size
            y0 = r * self.cell_size + self.cell_size
            x1 = c * self.cell_size + self.cell_size
            y1 = y0
        elif d == "A":
            x0 = c * self.cell_size
            y0 = r * self.cell_size
            x1 = x0
            y1 = r * self.cell_size + self.cell_size
        elif d == "D":
            x0 = c * self.cell_size + self.cell_size
            y0 = r * self.cell_size
            x1 = x0
            y1 = r * self.cell_size + self.cell_size

        # tag用於在後面刪除指定的線
        _tag = "b%s" % block_id
        self.create_line(x0, y0, x1, y1, fill=color, width=2, tag=_tag)

    def draw_block_line(self, block, block_id):
        c, r = block['cr']
        shape_type = block['kind']
        cell_list = block['cell_list']
        for cell in cell_list:
            for d in DIRECTION:
                dcr = DIRECTION[d]
                d_cell = (cell[0] + dcr[0], cell[1] + dcr[1])
                if d_cell not in cell_list:
                    # draw line
                    self.draw_line(c+cell[0], r++cell[1], d, ALL_COLORS["line"], block_id)

constants.py

# 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),
}

result.py

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

res1 = [
    {'cr': [10, 18], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [10, 16], 'kind': 'I', 'cell_list': [(0, 1), (0, 0), (0, -1), (0, -2)], 'angle': 0},
    {'cr': [9, 17], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [12, 17], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [7, 15], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [13, 15], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [9, 14], 'kind': 'S', 'cell_list': [(0, 1), (0, 0), (-1, 0), (-1, -1)], 'angle': 1},
    {'cr': [12, 14], 'kind': 'Z', 'cell_list': [(-1, 1), (-1, 0), (0, 0), (0, -1)], 'angle': 1},
    {'cr': [13, 14], 'kind': 'J', 'cell_list': [(0, -1), (0, 0), (1, 0), (2, 0)], 'angle': 3},
    {'cr': [7, 13], 'kind': 'L', 'cell_list': [(0, 1), (0, 0), (-1, 1), (-2, 1)], 'angle': 1},
    {'cr': [5, 13], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [15, 13], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [4, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [17, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [14, 12], 'kind': 'S', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, -1)], 'angle': 0},
    {'cr': [6, 12], 'kind': 'Z', 'cell_list': [(-1, -1), (0, -1), (0, 0), (1, 0)], 'angle': 0},
    {'cr': [10, 13], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [9, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [12, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [10, 10], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [13, 10], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [7, 10], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [13, 8], 'kind': 'L', 'cell_list': [(0, 1), (0, 0), (-1, 1), (-2, 1)], 'angle': 1},
    {'cr': [7, 9], 'kind': 'J', 'cell_list': [(0, -1), (0, 0), (1, 0), (2, 0)], 'angle': 3},
    {'cr': [16, 10], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [4, 10], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [6, 9], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [15, 9], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
]

res2 = [
    {'cr': [10, 18], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [10, 16], 'kind': 'I', 'cell_list': [(0, 1), (0, 0), (0, -1), (0, -2)], 'angle': 0},
    {'cr': [9, 17], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [12, 17], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [7, 16], 'kind': 'L', 'cell_list': [(0, -1), (0, 0), (1, -1), (2, -1)], 'angle': 3},
    {'cr': [13, 15], 'kind': 'J', 'cell_list': [(0, 1), (0, 0), (-1, 0), (-2, 0)], 'angle': 1},
    {'cr': [6, 14], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [14, 14], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [8, 14], 'kind': 'Z', 'cell_list': [(-1, -1), (0, -1), (0, 0), (1, 0)], 'angle': 0},
    {'cr': [12, 14], 'kind': 'S', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, -1)], 'angle': 0},
    {'cr': [10, 13], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [16, 12], 'kind': 'L', 'cell_list': [(0, 1), (0, 0), (-1, 1), (-2, 1)], 'angle': 1},
    {'cr': [4, 13], 'kind': 'J', 'cell_list': [(0, -1), (0, 0), (1, 0), (2, 0)], 'angle': 3},
    {'cr': [13, 11], 'kind': 'L', 'cell_list': [(0, 1), (0, 0), (-1, 1), (-2, 1)], 'angle': 1},
    {'cr': [7, 12], 'kind': 'J', 'cell_list': [(0, -1), (0, 0), (1, 0), (2, 0)], 'angle': 3},
    {'cr': [12, 11], 'kind': 'S', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, -1)], 'angle': 0},
    {'cr': [8, 11], 'kind': 'Z', 'cell_list': [(-1, -1), (0, -1), (0, 0), (1, 0)], 'angle': 0},
    {'cr': [10, 10], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [6, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [15, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [17, 11], 'kind': 'T', 'cell_list': [(0, 1), (0, 0), (-1, 0), (0, -1)], 'angle': 1},
    {'cr': [3, 11], 'kind': 'T', 'cell_list': [(0, -1), (0, 0), (1, 0), (0, 1)], 'angle': 3},
    {'cr': [6, 9], 'kind': 'L', 'cell_list': [(0, 1), (0, 0), (-1, 1), (-2, 1)], 'angle': 1},
    {'cr': [5, 9], 'kind': 'S', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, -1)], 'angle': 0},
    {'cr': [13, 8], 'kind': 'L', 'cell_list': [(0, 1), (0, 0), (-1, 1), (-2, 1)], 'angle': 1},
    {'cr': [7, 9], 'kind': 'J', 'cell_list': [(0, -1), (0, 0), (1, 0), (2, 0)], 'angle': 3},
    {'cr': [14, 10], 'kind': 'J', 'cell_list': [(0, -1), (0, 0), (1, 0), (2, 0)], 'angle': 3},
    {'cr': [15, 9], 'kind': 'Z', 'cell_list': [(-1, -1), (0, -1), (0, 0), (1, 0)], 'angle': 0},
]

剩下的util.py和love3.txt未做修改,和之前是一樣的
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

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章