Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/39: Рейтинг темы: голосов - 39, средняя оценка - 4.95
-23 / 3 / 0
Регистрация: 08.04.2020
Сообщений: 94

Сапер

05.10.2020, 16:28. Показов 9756. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сапёр — известная игра-головоломка для одного игрока на прямоугольном поле. В некоторых точках поля расположены мины. Цель игрока — открыть все клетки, на которых мин нет, причём нажатие на мину означает мгновенный проигрыш.

Ваша задача — написать игру «Сапёр» с псевдографическим интерфейсом. Например, поле может выглядеть так:
[ ][ ][ ][ ][ ]
[?][ ][F] 2 [F]
[ ] 1 1 2 1
[ ] 1
[?] 3 3 2 1
[?][F][F][F] 1
Ход делается указанием строки и столбца и, возможно, типа действия (если есть дополнительные варианты, кроме открытия клетки). Должна быть принципиальная возможность выиграть и проиграть.

Дополнительно желательно учесть ещё несколько моментов:

При нажатии на клетку, среди соседей которой нет мин, открываются также все соседние с ней клетки.
Если и среди соседей есть «нулевые» клетки, процесс продолжается рекурсивно.
Игрокам может быть разрешено оставлять отметки, обычно это флажок, указывающий на предполагаемое положение мины, и вопросительный знак. Оба этих значка не позволяют открыть клетку, не сняв предварительно отметку.
Крайне желательно, чтобы игрок не мог подорваться на мине первым же ходом. Для этого можно переставлять неудачную мину или, что лучше, генерацию поля проводить после первого хода игрока, а не заранее.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.10.2020, 16:28
Ответы с готовыми решениями:

Сапер
https://repl.it/@panacealove/DesertedColdCommand#main.py в чем ошибка я не понмаю

Сапёр
Сапёр — известная игра-головоломка для одного игрока на прямоугольном поле. В некоторых точках поля расположены мины. Цель игрока — открыть...

Игра сапер
Поле для игры сапёр представляет собой сетку размером n×m. В ячейке сетки может находиться или отсутствовать мина. Напишите...

2
8 / 8 / 0
Регистрация: 06.12.2022
Сообщений: 44
14.01.2024, 15:29
это не точное решение и оно модет быть плохим
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
import random
 
 
def print_board():
    def replace(text: str):
        if text == "z" or text == "m":
            if lose and text == "m":
                return "[*]"
            return "[ ]"
        elif text == "o":
            return "   "
        elif text == "F" or text == "Fm":
            return "[F]"
        return f" {text} "
    for line in BOARD:
        print("".join(map(replace, line)))
    print(f"flags - {count_flags[0]}/{count_flags[1]}")
    print("-" * (len(BOARD[0]) * 3))
 
 
def paste_miens(x_first, y_first):
    cors = []
    while len(cors) != count_flags[1]:
        x_mien = random.randint(0, len(BOARD) - 1)
        y_mien = random.randint(0, len(BOARD[0]) - 1)
        if x_mien == x_first and y_mien == y_first:
            continue
        cors.append((x_mien, y_mien))
    for cor in cors:
        BOARD[cor[0]][cor[1]] = "m"
 
 
def count_miens(x_open, y_open):
    miens = []
    clear = []
    count = 0
    for i in range(x_open - 1, x_open + 2):
        for j in range(y_open - 1, y_open + 2):
            if i == x_open and j == y_open:
                continue
            if not 0 <= i < len(BOARD) or not 0 <= j < len(BOARD[0]):
                continue
            if BOARD[i][j] == "m" or BOARD[i][j] == "Fm":
                count += 1
                miens.append((i, j))
            else:
                clear.append((i, j))
    if count != 0:
        clear.clear()
    return count, miens, clear
 
 
def open_board(x_open, y_open):
    if not 0 <= x_open < len(BOARD) or not 0 <= y_open < len(BOARD[0]):
        return
    if BOARD[x_open][y_open] == "m" or BOARD[x_open][y_open] == "o" or BOARD[x_open][y_open].isdigit():
        return
    count, miens, clear = count_miens(x_open, y_open)
    if count == 0:
        BOARD[x_open][y_open] = "o"
    else:
        BOARD[x_open][y_open] = f"{count}"
        for cor in miens:
            open_board(cor[0], cor[1])
    for cor in clear:
        open_board(cor[0], cor[1])
        
 
BOARD = [["z"] * 5 for _ in range(6)]
count_flags = [0, 5]
first = True
lose = False
print("Игра в сапера")
print("open <строка> <столбец> - открыть ячейку")
print("flag <строка> <столбец> - поставить влаг в ячейку")
print("delete <строка> <столбец> - убарть влаг из ячейки")
print("-" * (len(BOARD[0]) * 3))
while True:
    print_board()
    command = input()
    if command == "exit":
        break
    command = command.split()
    if len(command) != 3 or command[0] not in ["open", "flag", "delete"]:
        print("неврная команда".upper())
        continue
    type_command, x, y = command
    x, y = int(x) - 1, int(y) - 1
    if not 0 <= x < len(BOARD) or not 0 <= y < len(BOARD[0]):
        print("неверные координаты".upper())
        continue
    if type_command == "open":
        if first:
            paste_miens(x, y)
            first = not first
        elif BOARD[x][y] == "m":
            print("-" * (len(BOARD[0]) * 3))
            print("вы проиграли".upper())
            print("-" * (len(BOARD[0]) * 3))
            lose = True
            print_board()
            break
        elif BOARD[x][y] == "Fm" or BOARD[x][y] == "F":
            print("снимите флажок".upper())
            continue
        open_board(x, y)
        count_z = 0
        for col in BOARD:
            count_z += col.count("z")
        if count_z == 0:
            print("-" * (len(BOARD[0]) * 3))
            print("вы выграли".upper())
            print("-" * (len(BOARD[0]) * 3))
    elif type_command == "flag":
        if count_flags[0] == count_flags[1]:
            print("флажки закончились".upper())
        elif BOARD[x][y] == "m":
            BOARD[x][y] = "Fm"
            count_flags[0] += 1
        elif BOARD[x][y] == "Fm" or BOARD[x][y] == "F" or BOARD[x][y].isdigit():
            print("невозможно поставить".upper())
        else:
            BOARD[x][y] = "F"
            count_flags[0] += 1
    elif type_command == 'delete':
        if BOARD[x][y] == "Fm":
            BOARD[x][y] = "m"
            count_flags[0] -= 1
        elif BOARD[x][y] in ["z", 'o', 'm'] or BOARD[x][y].isdigit():
            print("невозможно убрать".upper())
        elif BOARD[x][y] == "F":
            BOARD[x][y] = "z"
            count_flags[0] -= 1
0
0 / 0 / 0
Регистрация: 22.09.2025
Сообщений: 2
22.09.2025, 17:18
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
import random
 
 
def print_board():
    for row in board:
        line = ''
        for cell in row:
            if cell in ['z', 'm']:
                line += '[*]' if lost and cell == 'm' else '[ ]'
            elif cell == 'o':
                line += '   '
            elif cell in ['F', 'Fm']:
                line += '[F]'
            else:
                line += f' {cell} '
        print(line)
    print(f'flags - {flags}/{mines}')
    print('-' * (len(board[0]) * 3))
 
 
def place_mines(safe_x, safe_y):
    positions = []
    while len(positions) < mines:
        x, y = random.randint(0, len(board) - 1), random.randint(0, len(board[0]) - 1)
        if (x, y) != (safe_x, safe_y) and (x, y) not in positions:
            positions.append((x, y))
    for x, y in positions:
        board[x][y] = 'm'
 
 
def count_mines(x, y):
    cnt, empty = 0, []
    for i in range(max(0, x - 1), min(len(board), x + 2)):
        for j in range(max(0, y - 1), min(len(board[0]), y + 2)):
            if (i, j) == (x, y): continue
            if board[i][j] in ['m', 'Fm']:
                cnt += 1
            else:
                empty.append((i, j))
    return cnt, empty if cnt == 0 else []
 
 
def open_cell(x, y):
    if not (0 <= x < len(board) and 0 <= y < len(board[0])): return
    if board[x][y] in ['m', 'o'] or board[x][y].isdigit(): return
 
    cnt, empty = count_mines(x, y)
    board[x][y] = 'o' if cnt == 0 else str(cnt)
    for nx, ny in (empty if cnt == 0 else [(x, y)]):
        open_cell(nx, ny)
 
 
board = [['z'] * 5 for _ in range(6)]
mines = 5
flags = 0
first = True
lost = False
 
print("Сапер")
print("open x y - открыть")
print("flag x y - флаг")
print("delete x y - убрать флаг")
print('-' * 15)
 
while True:
    print_board()
    cmd = input().split()
 
    if not cmd or cmd[0] == 'exit': break
    if len(cmd) != 3 or cmd[0] not in ['open', 'flag', 'delete']:
        print('НЕВЕРНАЯ КОМАНДА')
        continue
 
    action, x, y = cmd[0], int(cmd[1]) - 1, int(cmd[2]) - 1
    if not (0 <= x < len(board) and 0 <= y < len(board[0])):
        print('НЕВЕРНЫЕ КООРДИНАТЫ')
        continue
 
    if action == 'open':
        if first:
            place_mines(x, y)
            first = False
        elif board[x][y] == 'm':
            lost = True
            print('ВЫ ПРОИГРАЛИ')
            print_board()
            break
        elif board[x][y] in ['F', 'Fm']:
            print('СНИМИТЕ ФЛАГ')
            continue
        open_cell(x, y)
        if sum(row.count('z') for row in board) == 0:
            print('ВЫ ВЫИГРАЛИ')
            break
 
    elif action == 'flag':
        if flags == mines:
            print('ФЛАГИ ЗАКОНЧИЛИСЬ')
        elif board[x][y] == 'm':
            board[x][y] = 'Fm'
            flags += 1
        elif board[x][y] not in ['F', 'Fm'] and not board[x][y].isdigit():
            board[x][y] = 'F'
            flags += 1
        else:
            print('НЕВОЗМОЖНО')
 
    elif action == 'delete':
        if board[x][y] == 'Fm':
            board[x][y] = 'm'
            flags -= 1
        elif board[x][y] == 'F':
            board[x][y] = 'z'
            flags -= 1
        else:
            print('НЕВОЗМОЖНО')
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.09.2025, 17:18
Помогаю со студенческими работами здесь

Сапёр на python
помогите сделать обычный сапер на питоне, где можно выбирать координаты и выбирать что сделать с этой точкой (обезвредить, открыть) поле...

Игра Сапер
Здравствуйте! Вот все не могу добить.... надо было написать код для поля игры Сапер. Вроде есть, но еще требовалось что бы поле было не...

Написать генератор карт для игры «сапёр».
Написать генератор карт для игры «сапёр». Карта размером NxM. Формат ввода Каждая строка содержит два натуральных числа разделённых...

Оптимизация алгоритма по выводу поля игры сапёр
Всем хай! Написал код для решения следующей задачи. Текст задачи: Вам дан размер прямоугольного поля и координаты всех мин,...

Сапер. Нужно сделать чтобы рандом не ставил бомбу на одно и тоже место
from tkinter import* from random import randint def player_win(): for y in range(len(w)): for x in range(len(w)): ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru