Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- def obrashen():
- """Функция запрашивающая форму обращения"""
- name=input("Введите своё имя, чтобы мы знали как к Вам обращаться ")
- print("""
- Какую форму обращения вы предпочитаете?
- 1. Мистер
- 2. Миссис
- 3. Мисс
- 4. Ваше Величество
- 5. Чувак
- 6. Называть Вас просто по имени
- """)
- n=""
- while n!="1" or n!="2" or n!="3" or n!="4" or n!="5" or n!="6":
- n=input("Введите номер устраивающего Вас обращения (1-6)")
- if n=="1":
- name="Мистер "+name
- break
- elif n=="2":
- name="Миссис "+name
- break
- elif n=="3":
- name="Мисс "+name
- break
- elif n=="4":
- name="Ваше Величество "+name
- break
- elif n=="5":
- name="Чувак "+name
- break
- elif n=="6":
- name=""+name
- break
- else:
- print("Неправильный выбор. Нужно выбрать номер позиции.\nПопробуйте ещё раз.")
- print("\nИтак", name, "начнём")
- return name
- def vvod_yes_no(vopros):
- """Функция задает вопрос с ответ Y или N."""
- vozvr = None #Первоначальное присвоение переменной содержащей ответ
- #Цикл который допускает только ответ y или n
- while vozvr not in ("y", "n"):
- vozvr = input(vopros).lower()
- return vozvr #Возврат введенного значения
- def draw_board(board):
- """Эта функция выводит поле"""
- print ("-" * 13)
- for i in range(3):
- print ("|", board[0+i*3], "|", board[1+i*3], "|", board[2+i*3], "|")
- print ("-" * 13)
- def manual():
- """Эта функция выводит инструкцию для игры в XO(Крестики Нолики)"""
- Manual="""Мы приветствуем вас в игре XO(Крестики Нолики).
- Если вы незнакомы с этой игрой прочитайте про неё информацию
- Крестики-нолики — логическая игра между двумя противниками на квадратном поле 3 на 3 клетки или большего размера (вплоть до «бесконечного поля»).
- Один из игроков играет «крестиками», второй — «ноликами». В традиционной китайской игре используются черные и белые камни.
- Игроки по очереди ставят на свободные клетки поля 3х3 знаки (один всегда крестики, другой всегда нолики).
- Первый, выстроивший в ряд 3 своих фигур по вертикали, горизонтали или диагонали, выигрывает. Первый ход делает игрок, ставящий крестики.
- Для того, чтобы сделать ход, введите число от 1 до 9. Введенный номер
- однозначно соответствует полям доски, как показанно ниже:
- 1 | 2 | 3
- ---------
- 4 | 5 | 6
- ---------
- 7 | 8 | 9
- \n
- """
- print(Manual)
- def empty_cletka(board):
- emptyCletka=[]
- tmp=None
- for tmp in board:
- if tmp!="X" and tmp!="O":
- emptyCletka.append(tmp-1)
- return emptyCletka
- def check_win(board):
- """Функция которая определяет победившего"""
- win_coord = ((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 each in win_coord:
- if board[each[0]] == board[each[1]] == board[each[2]]:
- return board[each[0]]
- if len(empty_cletka(board))==0:
- return "draw"
- return False
- def game_ended(board):
- return check_win(board) != False
- def check_for_loose(board,compOX):
- vvod=check_win(board)
- if vvod==compOX:
- vvod=-1
- elif vvod=="draw":
- vvod=0
- else:
- vvod=1
- return vvod
- def check_for_win(board,compOX):
- vvod=check_win(board)
- if vvod==compOX:
- vvod=1
- elif vvod=="draw":
- vvod=0
- else:
- vvod=-1
- return vvod
- check=check_for_win
- def PvP_PvE_EvE():
- """Функция спрашивает кто с кем будет играть"""
- vozvr=None
- while vozvr not in ("PvE", "PvP","EvE"):
- vozvr = input("Выберите режим игры[PvP/PvE/EvE]")
- return vozvr #Возврат введенного значения
- def XO():
- """Функция спрашивает Х или О будет играть человек"""
- while True:
- xo=input("Чем вы будите играть [X/O][x/o]")
- if(xo=="X" or xo=="x" or xo=="Х" or xo=="х"):
- return "X"
- if(xo=="O" or xo=="o" or xo=="О" or xo=="о" or xo=="0"):
- return "O"
- def cell_is_free(board,cletka):
- print(cletka,board[cletka-1])
- if board[int(cletka)-1]==int(cletka):
- return True
- else:
- return False
- def numeric_value(board):
- vvod=None
- print("Ходите")
- while True:
- vvod=str(input())
- print(vvod)
- if vvod in ("1","2","3","4","5","6","7","8","9"):
- if cell_is_free(board,int(vvod)):
- return (int(vvod)-1)
- else:
- print("Эта клетка занята")
- else:
- print("Ошибка. Нужно вводить только цифры от 1 до 9.")
- return int(vvod)
- #def minimax(board,compOX)
- #return False
- def mini(board,compOX):
- if compOX=="X":
- manOX="O"
- else:
- manOX="X"
- if game_ended(board):
- return check(board,compOX)
- spisok=empty_cletka(board)
- tmp2=10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- for tmp in spisok:
- board[tmp]=manOX
- tmp3=maxi(board, compOX)
- if tmp2>tmp3:
- tmp2=tmp3
- board[tmp]=tmp+1
- return tmp2
- def maxi(board,compOX):
- if game_ended(board):
- return check(board,compOX)
- spisok=empty_cletka(board)
- tmp2=-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- for tmp in spisok:
- board[tmp]=compOX
- tmp3=mini(board, compOX)
- if tmp2<tmp3:
- tmp2=tmp3
- board[tmp]=tmp+1
- return tmp2
- def hod_comp(board,compOX):
- hody=[]
- if game_ended(board):
- return check(board,compOX)
- spisok=empty_cletka(board)
- best_hod=-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- for hod in spisok:
- board[hod]=compOX
- test_hod=mini(board, compOX)
- if best_hod<test_hod:
- best_hod=test_hod
- hody=[hod+1]
- elif best_hod==test_hod:
- hody.append(hod+1)
- board[hod]=hod+1
- print(hody)
- rn = int(random.random()*len(hody))
- print(rn)
- return hody[rn]-1
- #def hod_comp1(board,compOX):
- # hody=None
- # if game_ended(board):
- # return check(board,compOX)
- # spisok=empty_cletka(board)
- # best_hod=-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- # for hod in spisok:
- # board[hod]=compOX
- # test_hod=mini(board, compOX)
- # if best_hod<test_hod:
- # best_hod=test_hod
- # hody=hod
- #
- # board[hod]=hod+1
- # print(hody)
- # return hody
- def rd_hod_comp(board):
- spisok=empty_cletka(board)
- return spisok[int(random.random()*len(spisok))]
- def PvE(board,manOX):
- if manOX=="X":
- compOX="O"
- hoditMan=True
- else:
- compOX="X"
- hoditMan=False
- while True:
- draw_board(board)
- if hoditMan:
- cletka=int(numeric_value(board))
- board[cletka]=manOX
- else:
- cletka=int(hod_comp(board,compOX))
- board[cletka]=compOX
- hoditMan=not hoditMan
- if game_ended(board):
- break
- pobed=check_win(board)
- return pobed
- def EvE(board):
- comp1="X"
- comp2="O"
- hoditcomp1=True
- while True:
- draw_board(board)
- if hoditcomp1:
- cletka=int(rd_hod_comp(board))
- board[cletka]=comp1
- else:
- cletka=int(hod_comp(board,comp2))
- board[cletka]=comp2
- hoditcomp1=not hoditcomp1
- if game_ended(board):
- break
- pobed=check_win(board)
- return pobed
- def PvP(board):
- man1="X"
- man2="O"
- hoditMan1=True
- while True:
- draw_board(board)
- if hoditMan1:
- cletka=int(numeric_value(board))
- board[cletka]=man1
- else:
- cletka=int(numeric_value(board))
- board[cletka]=man2
- hoditMan1=not hoditMan1
- if game_ended(board):
- break
- pobed=check_win(board)
- return pobed
- def main():
- random.seed()
- board = list(range(1,10))
- manual()
- ehe=True
- #if
- #check=check_for_loose
- #vvod_yes_no("Вы готовы играть?")
- #name=obrashen()
- p_e=PvP_PvE_EvE()
- while ehe:
- board = list(range(1,10))
- if p_e=="PvP":
- rezult=PvP(board)
- elif p_e=="PvE":
- rezult=PvE(board,XO())
- elif p_e=="EvE":
- rezult=EvE(board)
- draw_board(board)
- if rezult=="draw":
- print("Ничья")
- else:
- print("Победил",rezult)
- ehe=(input("Чтобы выйти нажмите Q") != "Q")
- main()
Add Comment
Please, Sign In to add comment