Python基于thinker实现的简单的俄罗斯方块小游戏源代码:一、搭建界面

记录俄罗斯方块小游戏的游戏思路和过程

一、搭建界面

**目标:**搭建基础界面,并在固定位置显示7种形状的俄罗斯方块

搭建基础窗体

使用tkinter库实现基础窗体,不加入任何功能只需如下三行代码

import tkinter as tk
#它可以用来创建一个新的图形界面(GUI)窗口。 tk.Tk() 调用这个函数并创建一个新的Tkinter窗口,可以用来添加其他gui组件,如按钮,文本框,标签等
windows = tk.Tk()

#mainloop()函数是python中tkinter模块的主要方法,它将一个python程序作为GUI应用程序运行,该函数可以让你的程序在循环中保持运行,以便捕获用户的输入事件和重绘GUI。
windows.mainloop()

运行结果如下:

image-20230207175943785

第一步:创建画板大小

接下来我们需要在窗体里面,添加一个画布容器用来“装”俄罗斯方块,就是让这个画布作为面板,俄罗斯方块的移动和绘制均在这个画板上实现。

#定义一些参数:
#画板的行数:R=20
#画板的列数:C=12
#俄罗斯方块的大小cell_size=30
#俄罗斯方块的高度:Height=cell_size*C
#俄罗斯方块的宽度:Width=cell_size*R
R=20
C=12
cell_size=30
height=cell_size*R
width=cell_size*C

#创建画板
canvas = tk.Canvas(windows, width=width, height=height)

# pack()是一个tkinter模块中的函数,它可以自动调整画布大小来适应其中包含的元素。
canvas.pack()
windows.mainloop()

运行结果如下:

image-20230207181848273

第二步:在画板上作画

现在我们可以在画板上作画了,接下里就是把俄罗斯方块画上去

这里分为两个步骤:

第一步:画出一个方块

第二步:画出所有方块

#画出一个方块
def draw_cell_by_cr(canvas, c, r, color="#CCCCCC"):
    """
    :param canvas:画板,用于绘制一个方块的Canvas对象
    :param c:方块的列数
    :param r:方块的行数
    :color:方块的颜色
    :return
    """
    x0 = c * cell_size
    y0 = r * cell_size
    x1 = c * cell_size + cell_size
    y1 = r * cell_size + cell_size
    # 用于在Canvas上绘制矩形。参数x0,y0,x1,y1是矩形的左上角和右下角的坐标;fill=color设置矩形的填充颜色;outline="white"设置矩形轮廓的颜色;width=2设置矩形边框的粗细。。
     canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="white",width=2)
        
#画出所有的方块
#通过两层for循环遍历出画板所有方块
def draw_blank_board(canvas):
    for ri in range(R):
        for ci in range(C):
            draw_cell_by_cr(canvas, ci, ri)

运行效果如下:

image-20230207192010371

绘制俄罗斯方块

俄罗斯方块一共有7种形状

第一步:绘制o形俄罗斯方块

先从最简单的o型俄罗斯方块(即田字格,如下图)

图片

如何确定田字格的位置?

分析过程:

田字型方块由四个格子组成,如果确定了4个格子的坐标,那么就可以确定田字型方块的位置

解决方案:

取4个格子的左下角坐标表示该格子的坐标

4个格子的左下角左边分别为:方块一(-1,0)、方块二(0,0)、方块三(0,-1)、方块四(-1,-1)

以田字格中点为原点,则田字型俄罗斯方块的四个格子的坐标如下图所示

image-20230208104806192

用列表和元组记录为

[
    (-1, -1), 
    (0, -1), 
    (-1, 0), 
    (0, 0)
]

我们将俄罗斯方块形状字符串和坐标列表的映射关系存到字典SHAPES里(映射关系这里可以理解为一一对应的关系),

同时建立一个字典SHAPESCOLOR,来记录俄罗斯方块形状字符串和颜色的一一对应关系。

由于一个形状可以看成多个方格组成的,所以我们可以新建函数draw_cells用来绘制这个形状

最后选择一个地方来绘制这个形状。

# 定义形状
SHAPES = {
    
    
    "O": [(-1, -1), (0, -1), (-1, 0), (0, 0)],
}

# 定义形状的颜色
SHAPESCOLOR = {
    
    
    "O": "blue",
}

#该函数的作用是在给定的画布上绘制特定数量的单元格,单元格列表指定了单元格的位置,而颜色指定了单元格的颜色
def draw_cells(canvas, c, r, cell_list, color="#CCCCCC"):
    """
    绘制指定形状指定颜色的俄罗斯方块
    :param canvas: 画板
    :param r: 该形状设定的原点所在的行
    :param c: 该形状设定的原点所在的列
    :param cell_list: 该形状各个方格相对自身所处位置
    :param color: 该形状颜色
    :return:
    """
    for cell in cell_list:
        cell_c, cell_r = cell
        ci = cell_c + c
        ri = cell_r + r
        # 判断该位置方格在画板内部(画板外部的方格不再绘制)
        if 0 <= c < C and 0 <= r < R:
            draw_cell_by_cr(canvas, ci, ri, color)

# 下面这行代码放在draw_blank_board(canvas) 下面
# 任取一个位置,如(3,3)绘制一个o型俄罗斯方块,用于展示
draw_cells(canvas, 3, 3, SHAPES['O'], SHAPESCOLOR['O'])

运行结果如下:

image-20230208111818050

第二步:绘制其他形状方块

俄罗斯方块主流分七种,除去上面的O型,其他六俄罗斯方块如图所示

图片

对应的,要在SHAPES和SHAPESCOLOR中添加其他方块的坐标和颜色,添加后如下

# 定义各种形状
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)],
}

# 定义各种形状的颜色
SHAPESCOLOR = {
    
    
    "O": "blue",
    "S": "red",
    "T": "yellow",
    "I": "green",
    "L": "purple",
    "J": "orange",
    "Z": "Cyan",
}

将原来绘制O型俄罗斯方块处的代码改成如下代码,将这七种俄罗斯方块绘制出来

draw_cells(canvas, 3, 3, SHAPES['O'], SHAPESCOLOR['O'])
draw_cells(canvas, 3, 8, SHAPES['S'], SHAPESCOLOR['S'])
draw_cells(canvas, 3, 13, SHAPES['T'], SHAPESCOLOR['T'])
draw_cells(canvas, 8, 3, SHAPES['I'], SHAPESCOLOR['I'])
draw_cells(canvas, 8, 8, SHAPES['L'], SHAPESCOLOR['L'])
draw_cells(canvas, 8, 13, SHAPES['J'], SHAPESCOLOR['J'])
draw_cells(canvas, 5, 18, SHAPES['Z'], SHAPESCOLOR['Z'])

运行结果如下:

image-20230208112226225完整代码下载地址:Python基于thinker实现的简单的俄罗斯方块小游戏源代码

猜你喜欢

转载自blog.csdn.net/2301_76484015/article/details/129022783#comments_26791207