Форум программистов, компьютерный форум, киберфорум
Python: Tkinter
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 27.04.2023
Сообщений: 1

Дополнить игру "САПЁР", добавить возможность пользователю помечать клетку "флажком"

27.04.2023, 14:23. Показов 1287. Ответов 1

Студворк — интернет-сервис помощи студентам
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import tkinter as tk
import random
 
 
class MinesweeperGame:
    def __init__(self, master, row, col, mines):
        self.master = master
        self.row = row
        self.col = col
        self.mines = mines
 
        self.tiles = [[None for j in range(col)] for i in range(row)]
        self.is_mine = [[False for j in range(col)] for i in range(row)]
        self.is_revealed = [[False for j in range(col)] for i in range(row)]
        self.is_flagged = [[False for j in range(col)] for i in range(row)]
 
        self.num_mines_remaining = mines
        self.num_tiles_remaining = row * col
 
        self.create_board()
 
    def create_board(self):
        for row in range(self.row):
            for col in range(self.col):
                self.tiles[row][col] = tk.Button(self.master, text="",width=3,
                    command=lambda row=row, col=col: self.handle_click(row, col))
                self.tiles[row][col].grid(row=row, column=col)
 
        mines_placed = 0
        while mines_placed < self.mines:
            row = random.randint(0, self.row - 1)
            col = random.randint(0, self.col - 1)
            if not self.is_mine[row][col]:
                self.is_mine[row][col] = True
                mines_placed += 1
 
    def handle_click(self, row, col):
        if self.is_flagged[row][col]:
            return
 
        if self.is_mine[row][col]:
            self.tiles[row][col].config(bg="red", text="*", relief=tk.SUNKEN, state=tk.DISABLED)
            self.show_gameover_message()
            return
 
        self.reveal_tile(row, col)
        if self.num_tiles_remaining == self.mines:
            self.show_win_message()
 
    def reveal_tile(self, row, col):
        if self.is_revealed[row][col]:
            return
 
        self.is_revealed[row][col] = True
        self.num_tiles_remaining -= 1
 
        mine_count = 0
        for i in range(max(0, row - 1), min(self.row, row + 2)):
            for j in range(max(0, col - 1), min(self.col, col + 2)):
                if self.is_mine[i][j]:
                    mine_count += 1
        if mine_count == 0:
            self.tiles[row][col].config(bg="gray", relief=tk.SUNKEN, state=tk.DISABLED)
            for i in range(max(0, row - 1), min(self.row, row + 2)):
                for j in range(max(0, col - 1), min(self.col, col + 2)):
                    self.reveal_tile(i, j)
        else:
            self.tiles[row][col].config(bg="light gray", relief=tk.SUNKEN, text=str(mine_count), state=tk.DISABLED)
 
    def handle_rightclick(self, row, col):
        if self.is_revealed[row][col]:
            return
 
        if self.is_flagged[row][col]:
            self.tiles[row][col].config(text="", state=tk.NORMAL)
            self.is_flagged[row][col] = False
            self.num_mines_remaining += 1
        else:
            self.tiles[row][col].config(text="X", state=tk.NORMAL)
            self.is_flagged[row][col] = True
            self.num_mines_remaining -= 1
            self.update_mine_count_label()
# удаляем
 
 
# удаляем
 
    def show_gameover_message(self):
        message = tk.Message(self.master, text="Игра закончена! Вы проиграли.", width=200)
        message.grid(row=self.row + 1, columnspan=self.col)
 
        for row in range(self.row):
            for col in range(self.col):
                if self.is_mine[row][col]:
                    self.tiles[row][col].config(bg="gray", text="*", relief=tk.SUNKEN, state=tk.DISABLED)
                else:
                    self.reveal_tile(row, col)
 
    def show_win_message(self):
        message = tk.Message(self.master, text="Поздравляю! Вы победили!", width=200)
        message.grid(row=self.row + 1, columnspan=self.col)
 
        for row in range(self.row):
            for col in range(self.col):
                if self.is_mine[row][col]:
                    self.tiles[row][col].config(text="X", state=tk.DISABLED)
 
    def update_mine_count_label(self):
        mine_count_label.config(text=f"Mines remaining: {self.num_mines_remaining}")
 
    def restart_game(self):
        for row in range(self.row):
            for col in range(self.col):
                self.tiles[row][col].destroy()
        self.__init__(self.master, self.row, self.col, self.mines)
root = tk.Tk()
root.title("Сапёр")
menu_bar = tk.Menu(root)
root.config(menu=menu_bar)
 
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Файл", menu=file_menu)
file_menu.add_command(label="Перезапуск", command=lambda: game.restart_game())
file_menu.add_command(label="Выйти", command=root.quit)
row = 10
col = 10
mines = 2
 
game_frame = tk.Frame(root)
game_frame.pack()
 
mine_count_label = tk.Label(game_frame, text=f"Количество мин: {mines}")
mine_count_label.grid(row=row+1, columnspan=col)
 
game = MinesweeperGame(game_frame, row, col, mines)
 
root.mainloop()
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2023, 14:23
Ответы с готовыми решениями:

Добавить в сапер возможность помечать кнопки и условие победы
Вот что я написала namespace WindowsFormsApp7 { public partial class Form1 : Form { const int height = 10; ...

Как добавить возможность пользователю добавить TextBlock
Есть программа, которая обсчитывает площадь вершин по координатам х,у. Количество вершин должен выбирать пользователь. Была идея добавить...

Добавить возможность выбора количества кнопок в игру "Гонки"
Это приложение &quot;Гонка&quot; при нажатии на кнопку старт все кнопки с рандомной скоростью начинают двигаться к финишу. Нашёл данный код без...

1
88 / 32 / 14
Регистрация: 25.03.2023
Сообщений: 69
29.04.2023, 21:45
Добавьте обработчик событий для правой кнопки мыши.

Python
1
self.tiles[row][col].bind("<Button-3>", lambda e, row=row, col=col: self.handle_right_click(row, col))
Также нужно добавить новый метод handle_right_click, который будет вызываться при нажатии правой кнопки мыши на клетку

Python
1
2
3
4
5
6
7
8
9
10
11
12
def handle_right_click(self, row, col):
    if self.is_revealed[row][col]:
        return
 
    if self.is_flagged[row][col]:
        self.tiles[row][col].config(text="")
        self.is_flagged[row][col] = False
        self.num_mines_remaining += 1
    else:
        self.tiles[row][col].config(text="F")
        self.is_flagged[row][col] = True
        self.num_mines_remaining -= 1
От полный код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import tkinter as tk
import random
 
 
class MinesweeperGame:
    def __init__(self, master, row, col, mines):
        self.master = master
        self.row = row
        self.col = col
        self.mines = mines
 
        self.tiles = [[None for j in range(col)] for i in range(row)]
        self.is_mine = [[False for j in range(col)] for i in range(row)]
        self.is_revealed = [[False for j in range(col)] for i in range(row)]
        self.is_flagged = [[False for j in range(col)] for i in range(row)]
 
        self.num_mines_remaining = mines
        self.num_tiles_remaining = row * col
 
        self.create_board()
 
    def create_board(self):
        for row in range(self.row):
            for col in range(self.col):
                self.tiles[row][col] = tk.Button(self.master, text="", width=3,
                                                 command=lambda row=row, col=col: self.handle_click(row, col))
                self.tiles[row][col].grid(row=row, column=col)
                # добавляем обработчик событий для правой кнопки мыши
                self.tiles[row][col].bind("<Button-3>", lambda e, row=row, col=col: self.handle_right_click(row, col))
 
        mines_placed = 0
        while mines_placed < self.mines:
            row = random.randint(0, self.row - 1)
            col = random.randint(0, self.col - 1)
            if not self.is_mine[row][col]:
                self.is_mine[row][col] = True
                mines_placed += 1
 
    def handle_click(self, row, col):
        if self.is_flagged[row][col]:
            return
 
        if self.is_mine[row][col]:
            self.tiles[row][col].config(bg="red", text="*", relief=tk.SUNKEN, state=tk.DISABLED)
            self.show_gameover_message()
            return
 
        self.reveal_tile(row, col)
        if self.num_tiles_remaining == self.mines:
            self.show_win_message()
 
    def reveal_tile(self, row, col):
        if self.is_revealed[row][col]:
            return
 
        self.is_revealed[row][col] = True
        self.num_tiles_remaining -= 1
 
        mine_count = 0
        for i in range(max(0, row - 1), min(self.row, row + 2)):
            for j in range(max(0, col - 1), min(self.col, col + 2)):
                if self.is_mine[i][j]:
                    mine_count += 1
        if mine_count == 0:
            self.tiles[row][col].config(bg="gray", relief=tk.SUNKEN, state=tk.DISABLED)
            for i in range(max(0, row - 1), min(self.row, row + 2)):
                for j in range(max(0, col - 1), min(self.col, col + 2)):
                    self.reveal_tile(i, j)
        else:
            self.tiles[row][col].config(bg="light gray", relief=tk.SUNKEN, text=str(mine_count), state=tk.DISABLED)
 
    def handle_right_click(self, row, col):
        if self.is_revealed[row][col]:
            return
 
        if self.is_flagged[row][col]:
            self.tiles[row][col].config(text="")
            self.is_flagged[row][col] = False
            self.num_mines_remaining += 1
        else:
            self.tiles[row][col].config(text="F")
            self.is_flagged[row][col] = True
            self.num_mines_remaining -= 1
 
        # обновляем отображение количества оставшихся мин
        mine_count_label.config(text=f"Mines remaining: {self.num_mines_remaining}")
 
    def show_gameover_message(self):
        message = tk.Message(self.master, text="Game Over! You lost.", width=200)
        message.grid(row=self.row + 1, columnspan=self.col)
 
        for row in range(self.row):
            for col in range(self.col):
                if self.is_mine[row][col]:
                    self.tiles[row][col].config(bg="gray", text="*", relief=tk.SUNKEN, state=tk.DISABLED)
                else:
                    self.reveal_tile(row, col)
 
    def show_win_message(self):
        message = tk.Message(self.master, text="Congratulations! You won!", width=200)
        message.grid(row=self.row + 1, columnspan=self.col)
 
        for row in range(self.row):
            for col in range(self.col):
                if self.is_mine[row][col]:
                    self.tiles[row][col].config(text="F", state=tk.DISABLED)
 
    def restart_game(self):
        for row in range(self.row):
            for col in range(self.col):
                self.tiles[row][col].destroy()
        self.__init__(self.master, self.row, self.col, self.mines)
 
 
root = tk.Tk()
root.title("Minesweeper")
 
menu_bar = tk.Menu(root)
root.config(menu=menu_bar)
 
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Restart", command=lambda: game.restart_game())
file_menu.add_command(label="Exit", command=root.quit)
 
row = 10
col = 10
mines = 10
 
game_frame = tk.Frame(root)
game_frame.pack()
 
mine_count_label = tk.Label(game_frame, text=f"Mines remaining: {mines}")
mine_count_label.grid(row=row + 1, columnspan=col)
 
game = MinesweeperGame(game_frame, row, col, mines)
 
root.mainloop()
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.04.2023, 21:45
Помогаю со студенческими работами здесь

Создать запись в клетку ссылки на другую клетку, запись в клетку функции суммирования блока клеток
Ребят, подскажите- только начала изучать программу, создала таблицу, не получается создать запись в клетку ссылки на другую клетку, запись...

Написать игру Сапёр
Игра должна иметь 3 уровня сложности: «Новичок» (поле 9x9, количество мин - 10), «Любитель» (поле 16x16, количество мин - 40) и...

Создать игру «Сапёр»
Задание написать сапер (прототип) на языке с# с использованием паттерна mvvm на wpf. Как создавать динамически игровое поле? Представляю...

Создать игру сапер
Создать игру - консольное приложение, популярный аналог игры &quot;Сапер&quot;. Игровое поле имеет фиксированный размер, например 5х5 клеточек....

Сделать игру сапер (minesweeper)
Нужна помощь с написанием кода для игры сапер. Надо сделать экран где пользователь будет видеть пустые ячейки или квадратики как в игре...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru