python俄罗斯⽅块编码简单_python俄罗斯⽅块教程-100⾏代
码
本项⽬通过python⾃带库tkinter实现,⽆需安装第三⽅库
本项⽬基于python3版本开发(如果你的是python2.x,运⾏可能会有问题)
⼀、基础界⾯
1、搭建基础窗体
使⽤tkinter库实现基础窗体,不加⼊任何功能只需如下三⾏代码
import tkinter as tk
win = tk.Tk()
win.mainloop()
运⾏代码⽣成的窗⼝如下
接下来我们需要在窗体⾥⾯,添加⼀个画布容器⽤来“装”俄罗斯⽅块,就是让这个画布作为⾯板,俄罗斯⽅块的移动和绘制均在这个画板上实现。
这⾥我们设定⼀些俄罗斯⽅块游戏参数
⾏数为R(取20)
列数为C(取12)
俄罗斯⽅块的边长为cell_size(取30)
通过tkinger的画布类Canvas实现的代码如下
import tkinter as tk
cell_size=30
C = 12
R = 20
height = R*cell_size
width = C*cell_size
win = tk.Tk()
canvas = tk.Canvas(win, width=width, height=height)
canvas.pack()
win.mainloop()
运⾏代码⽣成的窗⼝如下,此时界⾯的长宽就变成我们所需要的了
接下来在画板上绘制俄罗斯⽅块空⽩位
⾸先建⽴⼀个函数draw_cell_by_cr,⽤于在画板上绘制单个俄罗斯⽅块
然后建⽴⼀个函数draw_blank_board,⽤于在画板上绘制所有空⽩⽅块(也就是空⽩⽅块板,为了和背景区分,所以设置空⽩⽅块为轻灰⾊)
此时整体代码如下:
import tkinter as tk
cell_size = 30
C = 12
R = 20
height = R * cell_size
width = C * cell_size
def draw_cell_by_cr(canvas, c, r, color="#CCCCCC"):
"""
:param canvas: 画板,⽤于绘制⼀个⽅块的Canvas对象
:param c: ⽅块所在列
:param r: ⽅块所在⾏
:param color: ⽅块颜⾊,默认为#CCCCCC,轻灰⾊
:
return:
"""
x0 = c * cell_size
y0 = r * cell_size
x1 = c * cell_size + cell_size
y1 = r * cell_size + cell_size
def draw_blank_board(canvas):
for ri in range(R):
for ci in range(C):
draw_cell_by_cr(canvas, ci, ri)
win = tk.Tk()
canvas = tk.Canvas(win, width=width, height=height, )
canvas.pack()
draw_blank_board(canvas)
win.mainloop()
此时运⾏代码⽣成的窗⼝如下
2、绘制o形俄罗斯⽅块
先从最简单的o型俄罗斯⽅块(即⽥字格,如下图)
我们先要记录每各形状所有格⼦的坐标
以格⼦所在⾏序号为纵坐标,所在列序号为横坐标
以⽥字格中点为原点,则o型俄罗斯⽅块的四个格⼦的坐标如下图所⽰
⽤列表和元组记录为
[
(-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"):
python菜鸟教程100"""
绘制指定形状指定颜⾊的俄罗斯⽅块
:
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'])
# 上⾯这⾏代码放在win.mainloop()上⾯
此时运⾏代码⽣成的窗⼝如下
3、其他俄罗斯⽅块
俄罗斯⽅块主流分七种,除去上⾯的O型,其他六俄罗斯⽅块如图所⽰
对应的,要在SHAPES和SHAPESCOLOR中添加其他⽅块的坐标和颜⾊,添加后如下SHAPES = {
"Z": [(-1, -1), (0, -1), (0, 0), (1, 0)],
"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)]
}
SHAPESCOLOR = {
"O": "blue",
"Z": "Cyan",
"S": "red",
"T": "yellow",
"I": "green",
"L": "purple",
"J": "orange",
}
将原来绘制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'])
本部分最终代码见github/BigShuang/Tetris/blob/master/1_BASIC/001.py, 绘制出来的效果如图
⼆、界⾯动起来
0、思路
要让游戏界⾯动起来,需要实现两点
1-定时刷新页⾯
2-移动页⾯内部的俄罗斯⽅块
这块说⼀下,光实现⼀的话理论上页⾯也算动起来了,但是如果界⾯内容不变,每次新的页⾯和旧的界⾯看起来是⼀样的,给⼈的观看感觉跟没有动没有区别
所以必须要实现2,来更改界⾯内容,给⼈“动”起来的感觉
1、定时刷新页⾯
实现定时刷新页⾯,很简单
写⼀个⽅法⽤于循环刷新,再定时调⽤
此部分代码写在原来代码最后的win.mainloop之前就好
FPS = 500 # 刷新页⾯的毫秒间隔
def game_loop():
win.update()
# ===⽤于展⽰刷新,后续会删掉===
import time
ime())
# ===========================
win.after(FPS, game_loop)
win.update()
win.after(FPS, game_loop) # 在FPS 毫秒后调⽤ game_loop⽅法
此时运⾏发现命令⾏中会有如下输出,说明这个页⾯确实是每隔500ms刷新了⼀次
Thu Nov 28 23:32:50 2019
Thu Nov 28 23:32:51 2019
Thu Nov 28 23:32:51 2019
Thu Nov 28 23:32:52 2019
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论