【Python小游戏】使用tkinter制作不同的找不同色块小游戏

一. 游戏流程

  1. 初始化一个tkinter界面,铺上画布;
  2. 画格子,设定参数;
  3. 设置格子的颜色差异,这里用随机数来控制不同颜色格子的位置和色块的颜色差异;
  4. 绑定鼠标事件,点击后重新刷新,进入下一难度;
  5. 捕捉鼠标事件,通过获取鼠标点击的位置判断是否点击到位,判断游戏是否结束。

二. 不同颜色色块位置的生成

这个比较简单,通过调用随机函数,生成位置即可

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

moyuweiqing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值