Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2023, 14:50   #1
HozozoHozo
Новичок
Джуниор
 
Регистрация: 09.11.2023
Сообщений: 2
По умолчанию Python; Сапёр (незаконченный), функция неправильно работает

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

Код:
import random

def fieldFiller(field):
    for i in range(9):
        for k in range(9):
            cells = []
            if field[i][k] != 'M':
                if i == 0:
                    cells.append(field[1][k])
                elif i == 8:
                    cells.append(field[7][k])
                else:
                    cells.append(field[i-1][k])
                    cells.append((field[i+1][k]))
                if k == 0:
                    cells.append(field[i][1])
                elif k == 8:
                    cells.append(field[i][7])
                else:
                    cells.append(field[i][k-1])
                    cells.append(field[i][k+1])
                if i == 0:
                    if k == 0:
                        cells.append(field[1][1])
                    elif k == 8:
                        cells.append(field[1][7])
                    else:
                        cells.append(field[1][k-1])
                        cells.append(field[1][k+1])
                elif i == 8:
                    if k == 0:
                        cells.append(field[7][1])
                    elif k == 8:
                        cells.append(field[7][7])
                    else:
                        cells.append(field[7][k-1])
                        cells.append(field[7][k+1])
                else:
                    if k == 0:
                        cells.append(field[i+1][1])
                        cells.append(field[i-1][1])
                    elif k == 8:
                        cells.append(field[i-1][7])
                        cells.append(field[i+1][7])
                    else:
                        cells.append(field[i+1][k+1])
                        cells.append(field[i+1][k-1])
                        cells.append(field[i-1][k+1])
                        cells.append(field[i-1][k+1])
                field[i][k] = cells.count('M')
    return field



field = [['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P']]
fieldPlay = [['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P']]
x, y = map(int, input('Input the coordinates you want to play first, like 3 2 (3 is the column and 2 is the row). ').split())
field[y-1][x-1], fieldPlay[y-1][x-1] = 'chosen', 'chosen'
mineCount = 0
for i in range(9):
    for k in range(9):
        if field[i][k] != 'chosen':
            mineCheck = random.randint(1, 10)
            if mineCheck <= 2:
                field[i][k] = 'M'
                mineCount += 1
for i in field:
    striong = ''
    for k in i:
        striong += str(k) + ' '
    print(striong)
field2 = fieldFiller(field)
print('='*18)
for i in field2:
    striong = ''
    for k in i:
        striong += str(k) + ' '
    print(striong)
В чём проблема в функции?
Апрецирую ответ
HozozoHozo вне форума Ответить с цитированием
Старый 09.11.2023, 18:40   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

В самой последней строке неверный знак:
Код:
cells.append(field[i-1][k+1])
Надо:
Код:
cells.append(field[i-1][k-1])
Поэтому проще сделать цикл, чем расписывать все варианты:
Код:
def fieldFiller(field):
    for i in range(9):
        for k in range(9):
            if field[i][k] != 'M':
                m_count = 0
                for i1 in range(max(i - 1, 0), min(i + 1, 8) + 1):
                    for k1 in range(max(k - 1, 0), min(k + 1, 8) + 1):
                        m_count += field[i1][k1] == 'M'
                field[i][k] = m_count
    return field
Или:
Код:
def fieldFiller(field):
    for i in range(9):
        for k in range(9):
            if field[i][k] != 'M':
                field[i][k] = sum(field[i1][k1] == 'M' for i1 in range(max(i - 1, 0), min(i + 2, 9)) for k1 in range(max(k - 1, 0), min(k + 2, 9)))
    return field
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 09.11.2023 в 18:54.
BDA на форуме Ответить с цитированием
Старый 10.11.2023, 16:16   #3
HozozoHozo
Новичок
Джуниор
 
Регистрация: 09.11.2023
Сообщений: 2
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В самой последней строке неверный знак:
Код:
cells.append(field[i-1][k+1])
Надо:
Код:
cells.append(field[i-1][k-1])
...Аж неловко немного.
Апрецирую :D


Цитата:
Сообщение от BDA
Поэтому проще сделать цикл, чем расписывать все варианты:
Код:
def fieldFiller(field):
    for i in range(9):
        for k in range(9):
            if field[i][k] != 'M':
                m_count = 0
                for i1 in range(max(i - 1, 0), min(i + 1, 8) + 1):
                    for k1 in range(max(k - 1, 0), min(k + 1, 8) + 1):
                        m_count += field[i1][k1] == 'M'
                field[i][k] = m_count
    return field
Или:
Код:
def fieldFiller(field):
    for i in range(9):
        for k in range(9):
            if field[i][k] != 'M':
                field[i][k] = sum(field[i1][k1] == 'M' for i1 in range(max(i - 1, 0), min(i + 2, 9)) for k1 in range(max(k - 1, 0), min(k + 2, 9)))
    return field
Тогда я тут посижу и буду пытаться понять этот код. Выходит это вот так все видят мой код написанный без комментариев.
HozozoHozo вне форума Ответить с цитированием
Старый 10.11.2023, 17:28   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

HozozoHozo
Цитата:
В чём проблема в функции?
Апрецирую ответ
Цитата:
...Аж неловко немного.
Апрецирую :D
Это о чём? Меня заинтересовало, но ближайшее что нашёл в Вики:
Цитата:
Апперцепция (лат. ad — к и лат. perceptio — восприятие) — это процесс, в результате которого элементы сознания становятся ясными и отчетливыми, посредством интроспекции.
Это об этом??
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция СУММЕСЛИ неправильно считает сумму Иван Степанов Microsoft Office Excel 6 25.02.2020 08:03
Неправильно работает функция rand() на микроконтроллере ATMEGA328P Marcus75 Микроконтроллеры, робототехника, схемотехника, 3D принтеры 8 14.11.2019 13:34
Неправильно работает рекурсивная функция [FENIX] PHP 0 05.12.2018 09:03
Функция неправильно возвращает строку(С++) tolikprankster Помощь студентам 4 10.02.2013 20:08
Неправильно работает функция округления числа Nomicos Помощь студентам 3 09.07.2012 16:23