PYthon编写记忆力小游戏

这段程序 需要实现 连续快速依次闪烁三个按钮 ,通过记忆来依次点击闪烁的按钮。判断是否点击正确,点击正确则提示正确,错误则提示错误。最上方有游戏的次数和正确和错误的计数。
最下方是游戏的开始和退出!
目前实在不了点击star game 可以继续游戏!


import tkinter as tk
from tkinter import messagebox
import random


class MemoryGame:
    def __init__(self, root, size=3):
        self.root = root
        self.size = size
        self.nums = []
        self.buttons = []
        self.selected = []
        self.correct_count = 0
        self.wrong_count = 0
        self.blinks = 0
        self.sequence = []
        self.create_widgets()
        self.blinking_buttons = set()

    def create_widgets(self):
        # 创建游戏次数和错误次数布局
        tk.Label(self.root, text=f'Total: 0', font=('Arial', 16)).grid(row=0, column=0, padx=40, pady=10)
        tk.Label(self.root, text=f'Correct: 0', font=('Arial', 16)).grid(row=0, column=1, pady=10)
        tk.Label(self.root, text=f'Wrong: 0', font=('Arial', 16)).grid(row=0, column=2, padx=40, pady=10)

        # 创建九宫格布局
        for i in range(self.size):
            row = []
            for j in range(self.size):
                num = random.randint(0, 9)
                while num in self.nums:
                    num = random.randint(0, 9)
                self.nums.append(num)
                button = tk.Button(self.root, text=num, font=('Arial', 24), width=4, height=2, command=lambda num=num: self.on_button_click(num))
                button.grid(row=i+1, column=j, padx=8, pady=8, ipadx=10, ipady=10)
                row.append(button)
            self.buttons.append(row)

        # 创建下方按钮布局
        start_button = tk.Button(self.root, text='Start game', font=('Arial', 16), width=10, command=self.start_game)
        start_button.grid(row=self.size+2, column=0, padx=20, pady=10)

        quit_button = tk.Button(self.root, text='Quit game', font=('Arial', 16), width=10, command=self.on_quit)
        quit_button.grid(row=self.size+2, column=2, padx=20, pady=10)

    def start_game(self):
        # 重置状态
        for row in self.buttons:
            for button in row:
                button.config(bg='SystemButtonFace', fg='black')
        self.selected = []
        self.correct_count = 0
        self.wrong_count = 0
        self.sequence = random.sample(self.nums, 3)
        self.show_sequence()

    def show_sequence(self):
        # 通过改变按钮颜色来提示出现顺序
        if self.blinks < len(self.sequence):
            nums = self.sequence[self.blinks]
            for row in self.buttons:
                for button in row:
                    if int(button['text']) == nums and button not in self.blinking_buttons:
                        button.config(bg='white')
                        self.blinking_buttons.add(button)
            self.root.after(500, self.resume_button, nums)
        else:
            # 显示完成,开始接受用户输入
            self.blinking_buttons.clear()

    def resume_button(self, num):
        # 恢复按钮颜色
        for row in self.buttons:
            for button in row:
                if int(button['text']) == num:
                    button.config(bg='SystemButtonFace')
                    self.blinking_buttons.remove(button)
        if self.blinks < len(self.sequence) - 1:
            self.blinks += 1
            self.root.after(500, self.show_sequence)
        else:
            # 闪烁完成
            pass

    def check_answer(self):
        if self.selected == self.sequence:
            # 点击正确
            self.correct_count += 1
            messagebox.showinfo('Correct', 'Good job!')
            self.update_score()
            self.selected = []
            self.blinks = 0
            self.blink_random_buttons(3)
        else:
            # 点击错误
            self.wrong_count += 1
            messagebox.showinfo('Wrong', 'Wrong answer!')
            self.update_score()
            self.selected = []
            self.blinks = 0
            self.blink_random_buttons(3)

    def update_score(self):
        # 更新积分
        for widget in self.root.grid_slaves(row=0, column=1):
            widget.grid_forget()
        tk.Label(self.root, text=f'Correct: {self.correct_count}', font=('Arial', 16)).grid(row=0, column=1, pady=10)
        for widget in self.root.grid_slaves(row=0, column=2):
            widget.grid_forget()
        tk.Label(self.root, text=f'Wrong: {self.wrong_count}', font=('Arial', 16)).grid(row=0, column=2, pady=10)
        # 更新游戏次数
        for widget in self.root.grid_slaves(row=0, column=0):
            widget.grid_forget()
        tk.Label(self.root, text=f'Total: {self.correct_count + self.wrong_count}', font=('Arial', 16)).grid(row=0, column=0, padx=40, pady=10)

    def on_button_click(self, num):
        # 检查选择的数字是否正确
        self.selected.append(num)
        if len(self.selected) == 3:
            self.check_answer()

    def on_quit(self):
        # 退出游戏
        messagebox.showinfo('Game over', 'You quit the game!')
        self.root.quit()

    def blink_random_buttons(self, remaining):
        if remaining <= 0:
            return
        if not self.blinking_buttons:
            buttons = random.sample(sum(self.buttons, []), 3)
            for button in buttons:
                self.blink(button)
            self.master.after(1500, self.unblink_buttons, buttons)
            self.master.after(2000, self.blink_random_buttons, remaining - 1)
        else:
            self.master.after(100, self.blink_random_buttons, remaining)

    def blink(self, button):
        button.config(bg='white')
        self.blinking_buttons.add(button)

    def unblink_buttons(self, buttons):
        for button in buttons:
            button.config(bg='SystemButtonFace')
            self.blinking_buttons.remove(button)

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Memory Game')
    root.resizable(False, False)
    game = MemoryGame(root)

    root.mainloop()


img

你想问什么


import tkinter as tk
from tkinter import messagebox
import random


class MemoryGame:
    def __init__(self, root, size=3):
        self.root = root
        self.size = size
        self.nums = []
        self.buttons = []
        self.selected = []
        self.correct_count = 0
        self.wrong_count = 0
        self.blinks = 0
        self.sequence = []
        self.create_widgets()
        self.blinking_buttons = set()

    def create_widgets(self):
        # 创建游戏次数和错误次数布局
        tk.Label(self.root, text=f'Total: 0', font=('Arial', 16)).grid(row=0, column=0, padx=40, pady=10)
        tk.Label(self.root, text=f'Correct: 0', font=('Arial', 16)).grid(row=0, column=1, pady=10)
        tk.Label(self.root, text=f'Wrong: 0', font=('Arial', 16)).grid(row=0, column=2, padx=40, pady=10)

        # 创建九宫格布局
        for i in range(self.size):
            row = []
            for j in range(self.size):
                num = random.randint(0, 9)
                while num in self.nums:
                    num = random.randint(0, 9)
                self.nums.append(num)
                button = tk.Button(self.root, text=num, font=('Arial', 24), width=4, height=2,
                                   command=lambda num=num: self.on_button_click(num))
                button.grid(row=i + 1, column=j, padx=8, pady=8, ipadx=10, ipady=10)
                row.append(button)
            self.buttons.append(row)

        # 创建下方按钮布局
        start_button = tk.Button(self.root, text='Start game', font=('Arial', 16), width=10, command=self.start_game)
        start_button.grid(row=self.size + 2, column=0, padx=20, pady=10)

        quit_button = tk.Button(self.root, text='Quit game', font=('Arial', 16), width=10, command=self.on_quit)
        quit_button.grid(row=self.size + 2, column=2, padx=20, pady=10)

    def start_game(self):
        # 重置状态
        for row in self.buttons:
            for button in row:
                button.config(bg='SystemButtonFace', fg='black')
        self.selected = []
        self.blinks = 0
        self.blinking_buttons.clear()
        if not self.sequence:
            self.sequence = random.sample(self.nums, 3)
        self.show_sequence()

    def show_sequence(self):
        # 通过改变按钮颜色来提示出现顺序
        if self.blinks < len(self.sequence):
            nums = self.sequence[self.blinks]
            for row in self.buttons:
                for button in row:
                    if int(button['text']) == nums and button not in self.blinking_buttons:
                        button.config(bg='white')
                        self.blinking_buttons.add(button)
            self.root.after(500, self.resume_button, nums)
        else:
            # 显示完成,开始接受用户输入
            self.blinking_buttons.clear()

    def resume_button(self, num):
        # 恢复按钮颜色
        for row in self.buttons:
            for button in row:
                if int(button['text']) == num:
                    button.config(bg='SystemButtonFace')
                    self.blinking_buttons.remove(button)
        if self.blinks < len(self.sequence) - 1:
            self.blinks += 1
            self.root.after(500, self.show_sequence)
        else:
            # 闪烁完成
            pass

    def check_answer(self):
        if self.selected == self.sequence:
            # 点击正确
            self.correct_count += 1
            messagebox.showinfo('Correct', 'Good job!')
            self.update_score()
            self.selected = []
            self.blinks = 0
            self.blink_random_buttons(3)
        else:
            # 点击错误
            self.wrong_count += 1
            messagebox.showinfo('Wrong', 'Wrong answer!')
            self.update_score()
            self.selected = []
            self.blinks = 0
            self.blink_random_buttons(3)

    def update_score(self):
        # 更新积分
        for widget in self.root.grid_slaves(row=0, column=1):
            widget.grid_forget()
        tk.Label(self.root, text=f'Correct: {self.correct_count}', font=('Arial', 16)).grid(row=0, column=1, pady=10)
        for widget in self.root.grid_slaves(row=0, column=2):
            widget.grid_forget()
        tk.Label(self.root, text=f'Wrong: {self.wrong_count}', font=('Arial', 16)).grid(row=0, column=2, pady=10)
        # 更新游戏次数
        for widget in self.root.grid_slaves(row=0, column=0):
            widget.grid_forget()
        tk.Label(self.root, text=f'Total: {self.correct_count + self.wrong_count}', font=('Arial', 16)).grid(row=0, column=0,
                                                                                                           padx=40, pady=10)

    def on_button_click(self, num):
        # 检查选择的数字是否正确
        self.selected.append(num)
        if len(self.selected) == 3:
            self.check_answer()

    def on_quit(self):
        # 退出游戏
        messagebox.showinfo('Game over', 'You quit the game!')
        self.root.quit()

    def blink_random_buttons(self, remaining):
        if remaining <= 0:
            return
        if not self.blinking_buttons:
            buttons = random.sample(sum(self.buttons, []), 3)
            for button in buttons:
                self.blink(button)
            self.root.after(1500, self.unblink_buttons, buttons)
            self.root.after(2000, self.blink_random_buttons, remaining - 1)
        else:
            self.root.after(100, self.blink_random_buttons, remaining)

    def blink(self, button):
        button.config(bg='white')
        self.blinking_buttons.add(button)

    def unblink_buttons(self, buttons):
        for button in buttons:
            button.config(bg='SystemButtonFace')
            self.blinking_buttons.remove(button)


if __name__ == '__main__':
    root = tk.Tk()
    root.title('Memory Game')
    root.resizable(False, False)
    game = MemoryGame(root)

    root.mainloop()

  我cv您的代码上我的老PC机运行,第一遍顺滑。第二次以及后面点击StarGame,亮不起三个数字——有时一个有时两个。
  我还没找到原因。😭