一. 游戏流程
- 初始化一个tkinter界面,铺上画布;
- 画格子,设定参数;
- 设置格子的颜色差异,这里用随机数来控制不同颜色格子的位置和色块的颜色差异;
- 绑定鼠标事件,点击后重新刷新,进入下一难度;
- 捕捉鼠标事件,通过获取鼠标点击的位置判断是否点击到位,判断游戏是否结束。
二. 不同颜色色块位置的生成
这个比较简单,通过调用随机函数,生成位置即可
def get_random_position(length):
random_x = random.randint(0, length - 1)
random_y = random.randint(0, length - 1)
return random_x, random_y
三. 不同颜色色块颜色的生成
先上代码
def change_color_from_rgb(rgb):
return "#%02x%02x%02x" % (rgb[0], rgb[1], rgb[2])
def color_change():
global color_list, color_gap
color_list = []
rgb_set1 = [random.randint(0, 255 - color_gap), random.randint(0, 255 - color_gap), random.randint(0, 255 - color_gap)]
rgb_set2 = list((i + color_gap for i in rgb_set1))
color_list.append(change_color_from_rgb(rgb_set1))
color_list.append(change_color_from_rgb(rgb_set2))
if color_gap > min_color_gap:
color_gap -= 1
首先,生成第一个色块的rgb列表。随机区间为0-255减去色差,比如,设置的色差为40,那么,第一个色块的rgb生成即为0-215之间,第二个色块的rgb列表在第一个色块rgb的列表上加上这个色差,并且转为十六进制颜色表,可以直接为tkinter所用。
四. 完整代码
from tkinter import *
from tkinter import messagebox
import numpy as np
import random
start_grid_num = 2 # 开始的每行格子数
grid_num = start_grid_num # 每次调用时候的每行格子数
size = 800 # 画布的大小
margin = 2 # 格子边缘大小
max_grid_num = 25 # 最大的每行格子数
start_color_gap = 40 # 开始的色块差
min_color_gap = 5 # 最小色块差
color_gap = start_color_gap # 每次调用时候的色块差
color_list = [] # 颜色列表
each_size = 0 # 每块格子的大小
A = np.full((grid_num, grid_num), 0) # 矩阵
score = 0 # 计算分数
def get_random_position(length):
random_x = random.randint(0, length - 1)
random_y = random.randint(0, length - 1)
return random_x, random_y
def change_color_from_rgb(rgb):
return "#%02x%02x%02x" % (rgb[0], rgb[1], rgb[2])
def color_change():
global color_list, color_gap
color_list = []
rgb_set1 = [random.randint(0, 255 - color_gap), random.randint(0, 255 - color_gap), random.randint(0, 255 - color_gap)]
rgb_set2 = list((i + color_gap for i in rgb_set1))
color_list.append(change_color_from_rgb(rgb_set1))
color_list.append(change_color_from_rgb(rgb_set2))
if color_gap > min_color_gap:
color_gap -= 1
def draw():
global grid_num, each_size, A
A = np.full((grid_num, grid_num), 0)
each_size = size // grid_num
s_x, s_y = get_random_position(grid_num)
A[s_x][s_y] = -1
canvas.delete('all')
color_change()
# 画方块
for i in range(0, grid_num):
for j in range(0, grid_num):
if A[i][j] == 0:
canvas.create_rectangle(i * each_size + margin, j * each_size + margin, (i + 1) * each_size - margin,
(j + 1) * each_size - margin,
fill=color_list[0])
elif A[i][j] == -1:
canvas.create_rectangle(i * each_size + margin, j * each_size + margin, (i + 1) * each_size - margin,
(j + 1) * each_size - margin,
fill=color_list[1])
if grid_num < max_grid_num:
grid_num += 1
def if_right(x, y):
global score
xx = x // each_size
yy = y // each_size
if A[xx][yy] == -1:
score += 1
return True
else:
return False
def click(event):
if if_right(event.x, event.y):
draw()
else:
messagebox.showinfo('游戏结束!', '您的分数是:' + str(score))
tk.destroy()
if __name__ == '__main__':
tk = Tk()
tk.title('找不同色块')
canvas = Canvas(tk, width=size, height=size, background='lightcyan')
canvas.pack()
draw()
canvas.bind("<Button -1>", click)
tk.mainloop()