1

Тема: Задача про можливі ходи ферзя

Доброго дня!

Розв'язую задачу "чи може ферзь походити з клітини X на клітину Y". Спочатку перевіряю чи правильно введені координати клітин. Підкажіть, будь ласка, чи правильно перевіряє програма координати у кортежах vertical і horizontal. Дякую!

vertical = tuple("12345678")
horizontal = tuple("abcdefgh")

x = tuple(input("Введіть поле, на якому стоїть ферзь "))
y = tuple(input("Введіть поле, на яке Ви хочете поставити ферзя "))

if (x[1] or y[1] not in horizontal) or (x[2] or y[2] not in vertical) or len(x)!=2 or len(y)!=2:
    print("Введені некоректні дані. Будь ласка, перевірте")

2 Востаннє редагувалося koala (04.02.2018 09:46:59)

Re: Задача про можливі ходи ферзя

"Правильно" - поняття відносне. Мені розповідали про викладача, який натискав у запиті введення Ctrl+Break, а потім вимагав показати, де в завданні сказано виходити при натисканні цієї комбінації, і знижував студентам оцінку, якщо там такого не було.
І ні, неправильно, кортежі (тьюпли), як і списки, індексуються з 0.
Будь ласка, в майбутньому описуйте проблему конкретніше. Ви явно отримували якийсь не такий результат, але чомусь тут цього не сказали. Не робіть так, якщо маєте конкретний приклад даних, на яких програма працює некоректно, і не можете зрозуміти, чому - наводьте ці дані, не змушуйте людей робити те, що ви вже зробили.

Прихований текст
x='c'
y='5'

x = 'abcdefgh'.index(x)
y = 7-'12345678'.index(y)

for row in range(8):
    line = ''
    for col in range(8):
        if row==x or col==y or row+col==x+y or row-col==x-y:
            line+='X'
        else:
            line+='_'
    print(line)
Подякували: Eff1c, leofun012

3

Re: Задача про можливі ходи ферзя

Сорі, що не пояснив і дякую за код.

Правильно було:

vertical = tuple("12345678")
horizontal = tuple("abcdefgh")

x = tuple(input("Введіть поле, на якому стоїть ферзь "))
y = tuple(input("Введіть поле, на яке Ви хочете поставити ферзя "))

if (x[0] or y[0]) not in horizontal or (x[1] or y[1]) not in vertical or len(x)!=2 or len(y)!=2:
    print("Введені некоректні дані. Будь ласка, перевірте")

else: print("Все добре")

Правильно було брати в в дужки вираз

(x[0] or y[0])

А в мене виходило, що "x[0]"  і "or y[0]) not in horizontal" є окремими умовами.

4 Востаннє редагувалося koala (04.02.2018 15:05:25)

Re: Задача про можливі ходи ферзя

Введіть

a1
i9

і переконайтеся, що так теж не працює. Справа в тому, що "a" or "i" повертає "a".
Функції ви вже вчили? Тут буде коректніше написати функцію "is_correct", яка перевірятиме одне введене значення на коректність.
Крім того, стрічки теж підтримують оператори in та [], вам не потрібні кортежі. Принаймні поки що.

5

Re: Задача про можливі ходи ферзя

Переписав з використанням функцій, але ще не додав перевірку на діагоналі (розумію цю ідею - графік функцій "y=x+a" та "y= -x +a", але треба реалізувати). Фактично формую список із доступних полів для ферзя.

horizontal = tuple("12345678")
vertical = tuple("abcdefgh")

x = tuple(input("Введіть поле, на якому стоїть ферзь "))
y = tuple(input("Введіть поле, на яке Ви хочете поставити ферзя "))


def is_correct(t):
    if (t[0] not in vertical) or (t[1] not in horizontal) or len(x)!=2:
        return print("".join(t),"- не входить до клітин шахової дошки")

is_correct(x)
is_correct(y)

list = []

for row in horizontal:
    for col in vertical:
        if row == x[1] or col == x[0]:
           list.append(col+row)

if (y[0]+y[1]) in list and x!=y:
    print('Ферзь може перейти з поля',x[0]+x[1],'на поле',y[0]+y[1])

6

Re: Задача про можливі ходи ферзя

return print робити безглуздо, print повертає None, як і функція без return.
Перевірку на довжину варто робити першою (і вписати там правильну змінну).
І взагалі було б краще

def is_correct(t):
    return (len(t)!=2) or (t[0] not in vertical) or (t[1] not in horizontal)

def inp_field(s):
while True:
    x = tuple(input(s))
    if is_correct(t):
        break
    else:
        print("".join(x),"- не входить до клітин шахової дошки")

x = inp_field("Введіть поле, на якому стоїть ферзь ")
y = inp_field("Введіть поле, на яке Ви хочете поставити ферзя ")
Подякували: DimONN1

7

Re: Задача про можливі ходи ферзя

І як правильно зауважив leofun01, назва функції leofun01 не відповідає тому, що вона робить - вона ж навпаки перевіряє на некоректність. Можна, звісно, перейменувати її на is_not_correct, але тоді може виникнути покруч not is_not_correct, так що краще просто замінити умову:
def is_correct(t):
    return (len(t)==2) and (t[0] in vertical) and (t[1] in horizontal)
...
Тоді і умова виходу в inp_field (яку краще все ж назвати input_field) буде виконуватися правильно.

Подякували: DimONN, leofun012

8

Re: Задача про можливі ходи ферзя

Це працюючий варіант без Ваших правок. Відшліфую трохи пізніше.

horizontal = tuple("12345678")
vertical = tuple("abcdefgh")

x = tuple(input("Введіть поле, на якому стоїть ферзь "))
y = tuple(input("Введіть поле, на яке Ви хочете поставити ферзя "))

def is_correct(t):
    if (t[0] not in vertical) or (t[1] not in horizontal) or len(x)!=2:
        return print("".join(t),"- не входить до клітин шахової дошки")

def compareplus(m,n):
    return vertical.index(m)+horizontal.index(n)

def compareminus(m,n):
    return vertical.index(m)-horizontal.index(n)

is_correct(x)
is_correct(y)

list = []

for col in vertical:
    for row in horizontal:
        if col == x[0] or row == x[1] or compareplus(col,row) == compareplus(x[0],x[1]) or compareminus(col,row) == compareminus(x[0],x[1]) :
           list.append(col+row)
           print(list)

if (y[0]+y[1]) in list and x!=y:
    print('Ферзь може перейти з поля',x[0]+x[1],'на поле',y[0]+y[1])
else:print('Ферзь не може перейти з поля',x[0]+x[1],'на поле',y[0]+y[1])