С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/259: Рейтинг темы: голосов - 259, средняя оценка - 4.94
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 46

Python: крестики-нолики

17.06.2015, 12:58. Показов 52229. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья, добрый день.
Я сел за изучение Python'а по прекрасной книжке М.Доусона.
Тут добрался с до игры "крестики-нолики", которая писалась для того, чтобы показать как активно работать с функциями. Но у меня возникли с ней вопросы, хотел бы, чтобы Вы мне помогли! Заранее спасибо. Ниже я привожу полный код.

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
X = "X"
O = "O"
EMPTY = " "
TIE = "Ничья"
NUM_SQUARES = 9
 
def display_instr():
    print("Инструкция")
 
def ask_yes_no(question):
    respone = None
    while respone not in ("y","n"):
        respone = input(question).lower()
    return respone
 
def ask_number(question, low, high):
    respone = None
    while respone not in range(low,high):
        respone = int(input(question))
    return respone
 
def pieces():
    go_first = ask_yes_no("Хочешь оставить за собой первый ход? (y/n): ")
    if go_first == "y":
        print("Ну что ж, даю тебе фору, играй крестикаи")
        human = X
        computer = O
    else:
        print("Твоя удаль тебя погубит... Буду начинать я.")
        human = O
        computer = X
    return computer,human
 
def new_board():
    board=[]
    for square in range(NUM_SQUARES):
        board.append(EMPTY)
    return board
 
def display_board(board):
    print("\n\t",board[0],"|",board[1],"|", board[2])
    print("\t","----------")
    print("\n\t",board[3],"|",board[4],"|", board[5])
    print("\t","----------")
    print("\n\t",board[6],"|",board[7],"|", board[8], "\n")
 
def legal_moves(board):
    moves=[]
    for square in range(NUM_SQUARES):
        if board[square] == EMPTY:
            moves.append(square)
    return moves
 
def winner(board):
    WAYS_TO_WIN = ((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))
    for row in WAYS_TO_WIN:
        if board[row[0]] == board[row[1]]==board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner
        
def human_move(board,human):
    legal = legal_moves(board)
    move = None
    while move not in legal:
        move = ask_number("Твой ход. Выбери поля (0-8):", 0, NUM_SQUARES)
        if move not in legal:
            print("Смешной человек! Это поле уже занято.")
        return move
 
def computer_move(board, computer, human):
    board = board[:]
    BEST_MOVES=(4,0,2,6,8,1,3,5,7)
    print("Я выберу поле номер", end = " ")
    for move in legal_moves(board):
        board[move]=human
        if winner(board) == human:
            print(move)
            return move
        board[move] = EMPTY
    for move in legal_moves(board):
        board[move]=human
        if winner(board) == human:
            print(move)
            return move
 
 
def next_turn(turn):
    if turn==X:
        return O
    else:
        return X
 
def congrat_winner(the_winner, computer, human):
    if the_winner != TIE:
        print("Три", the_winner, "в ряд")
    else:
        print("Ничья")
    if the_winner == computer:
        print("Как я и предсказывал, победа в очередной раз осталась за мной")
    elif the_winner == human:
        print("О нет, неужели ты перехитрил меня")
    elif the_winner == TIE:
        print("Ничья")
 
def main():
    display_instr()
    computer, human = pieces()
    turn = X
    board = new_board()
    display_board(board)
    while not winner(board):
        if turn == human:
            move = human_move(board,human)
            board[move]=human
        else:
            move = computer_move(board,computer,human)
            board[move] = computer
        display_board(board)
        turn=next_turn(turn)
    the_winner = winner(board)
    congrat_winner(the_winner, computer, human)
 
main()
input("Нажмите ентер, чтобы выйти")
Для начала - вопрос к функции:

Python
1
2
3
4
5
6
def winner(board):
    WAYS_TO_WIN = ((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))
    for row in WAYS_TO_WIN:
        if board[row[0]] == board[row[1]]==board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner
if проверяет для каждой тройки полей, не пусты ли они и одинаковые ли в них значение. То есть нам надо найти три в ряд символа ХХХ или ООО, либо по диагонали (0,3,6) и (0,4,8).
Я когда разбирался в примере, не обратил на содержимое for, в итоге начал разбирать и не могу понять... board[row[0]] , а также [1] и [2] - это же номера элементов в котреже? Как проверяются тогда остальные номера? объясните идиоту, как проверяются в этой функции все 8 значений "победных"?

Добавлено через 30 минут
Я прошу прощения, по поводу "порядкового номера в кортеже" - я не прав. Кортеж это WAYS_TI_WIN, а мы перебираем board, но вопрос с порядковыми номерами все равно остается тем же - 0 == 1 == 2 проверяется на наличие одинаковых значений, почему только 0, 1 и 2?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2015, 12:58
Ответы с готовыми решениями:

Крестики нолики
Дан целочисленный массив numpy 3x3, который представляет собой поле для игры в крестики-нолики. Незаполненные поля обозначены 0,...

Крестики-нолики 1
Дан целочисленный массив numpy 3x3, который представляет собой поле для игры в крестики-нолики. Незаполненные поля обозначены 0,...

Крестики-нолики
ТЕМА: «ХРЕСТИКИ-НОЛИКИ» Завдання. Вам потрібно створити діалогове вікно simpledialog, в якому користувач зможе ввести своє ім'я. В...

4
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,181
Записей в блоге: 6
17.06.2015, 14:25
Потому что row - это проверяемый ряд, из трёх позиций. Надо проверить, что на его позициях 0, 1 и 2 одинаковые знаки (крестик или нолик).
1
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 46
17.06.2015, 16:19  [ТС]
Черт подери, вот все ок, но тут - я все равно не могу понять. И пошагово, и комплексно и псевдой расписывал эту функцию - ну никак не понимаю как она работает =(
0
4 / 3 / 2
Регистрация: 19.07.2015
Сообщений: 125
20.07.2015, 12:52
1.Пытаюсь сделать эту же задачу из той же книги.
Но выдаёт ошибку - в main() функции не определены. В вашем листинге это строки 106, 110 и т.д.
В чём тут дело?

2. Также нашёл у вас ошибку - повторён кусок строки 74-78 и 80-84
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
20.07.2015, 13:04
garp, во 1 надо создавать свою тему, а не писать в другой, во 2 нужно выкладывать код и полный текст ошибки. Без этого тебе никто ничем не поможет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.07.2015, 13:04
Помогаю со студенческими работами здесь

крестики-нолики
Что-то не так с ф-ей possible_moves. Как сделать ее рабочей?вернее,чтобы работала она корректно,потому что на данный момент программа...

Крестики-Нолики
Напишите функцию Tic_tac_toe(), которая принимает на вход массив 3х3 - поле игры в крестики-нолики. Незанятой (пустой) клетке соответствует...

Игра крестики нолики
Помогите найти ошибки в коде from tkinter import* window = Tk() window.geometry("400x400") holst =...

Как создать искусственный интеллект для игры "крестики-нолики"?
Добрый день. Сразу говорю, новичок здесь и такой же не особо опытный в программировании на питоне. Поэтому прошу помощи. В общем идея...

Нолики-крестики
Напишите программу, которая определяет, кто выиграл в крестики-нолики на увеличенном квадратном поле, выстроив подряд по горизонтали или по...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru