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

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

27.04.2023, 14:23. Показов 1232. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru