andewK

Untitled

May 27th, 2021
56
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import random
  2. def obrashen():
  3.     """Функция запрашивающая форму обращения"""
  4.     name=input("Введите своё имя, чтобы мы знали как к Вам обращаться ")
  5.     print("""
  6.    Какую форму обращения вы предпочитаете?
  7.    1. Мистер
  8.    2. Миссис
  9.    3. Мисс
  10.    4. Ваше Величество
  11.    5. Чувак
  12.    6. Называть Вас просто по имени
  13.    """)
  14.     n=""
  15.     while n!="1" or n!="2" or n!="3" or n!="4" or n!="5" or n!="6":
  16.         n=input("Введите номер устраивающего Вас обращения (1-6)")
  17.        
  18.         if n=="1":
  19.             name="Мистер "+name
  20.             break
  21.         elif n=="2":
  22.             name="Миссис "+name
  23.             break
  24.         elif n=="3":
  25.             name="Мисс "+name
  26.             break
  27.         elif n=="4":
  28.             name="Ваше Величество "+name
  29.             break
  30.         elif n=="5":
  31.             name="Чувак "+name
  32.             break
  33.         elif n=="6":
  34.             name=""+name
  35.             break
  36.         else:
  37.             print("Неправильный выбор. Нужно выбрать номер позиции.\nПопробуйте ещё раз.")
  38.        
  39.     print("\nИтак", name, "начнём")
  40.     return name
  41.  
  42. def vvod_yes_no(vopros):
  43.     """Функция задает вопрос с ответ Y или N."""
  44.     vozvr = None  #Первоначальное присвоение переменной содержащей ответ
  45.  
  46.     #Цикл который допускает только ответ y или n
  47.     while vozvr not in ("y", "n"):
  48.         vozvr = input(vopros).lower()
  49.  
  50.     return vozvr #Возврат введенного значения
  51.  
  52. def draw_board(board):
  53.     """Эта функция выводит поле"""
  54.     print ("-" * 13)
  55.     for i in range(3):
  56.         print ("|", board[0+i*3], "|", board[1+i*3], "|", board[2+i*3], "|")
  57.         print ("-" * 13)
  58.  
  59. def manual():
  60.     """Эта функция выводит инструкцию для игры в XO(Крестики Нолики)"""
  61.     Manual="""Мы приветствуем вас в игре XO(Крестики Нолики).
  62.    Если вы незнакомы с этой игрой прочитайте про неё информацию
  63.    Крестики-нолики — логическая игра между двумя противниками на квадратном поле 3 на 3 клетки или большего размера (вплоть до «бесконечного поля»).
  64.    Один из игроков играет «крестиками», второй — «ноликами». В традиционной китайской игре используются черные и белые камни.
  65.    Игроки по очереди ставят на свободные клетки поля 3х3 знаки (один всегда крестики, другой всегда нолики).
  66.    Первый, выстроивший в ряд 3 своих фигур по вертикали, горизонтали или диагонали, выигрывает. Первый ход делает игрок, ставящий крестики.
  67.  
  68.    Для того, чтобы сделать ход, введите число от 1 до 9.  Введенный номер
  69.    однозначно соответствует полям доски, как показанно ниже:
  70.    
  71.                    1 | 2 | 3
  72.                    ---------
  73.                    4 | 5 | 6
  74.                    ---------
  75.                    7 | 8 | 9
  76.  
  77.    \n
  78.    """
  79.     print(Manual)
  80.  
  81. def empty_cletka(board):
  82.     emptyCletka=[]
  83.     tmp=None
  84.     for tmp in board:
  85.         if tmp!="X" and tmp!="O":
  86.             emptyCletka.append(tmp-1)
  87.     return emptyCletka
  88.    
  89. def check_win(board):
  90.     """Функция которая определяет победившего"""
  91.    
  92.     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))
  93.     for each in win_coord:
  94.         if board[each[0]] == board[each[1]] == board[each[2]]:
  95.             return board[each[0]]
  96.     if len(empty_cletka(board))==0:
  97.         return "draw"
  98.     return False
  99.  
  100. def game_ended(board):
  101.     return check_win(board) != False
  102.  
  103. def check_for_loose(board,compOX):
  104.     vvod=check_win(board)
  105.     if vvod==compOX:
  106.         vvod=-1
  107.     elif vvod=="draw":
  108.         vvod=0
  109.     else:
  110.         vvod=1
  111.     return vvod
  112.  
  113. def check_for_win(board,compOX):
  114.     vvod=check_win(board)
  115.     if vvod==compOX:
  116.         vvod=1
  117.     elif vvod=="draw":
  118.         vvod=0
  119.     else:
  120.         vvod=-1
  121.     return vvod
  122.  
  123. check=check_for_win
  124.  
  125.  
  126. def PvP_PvE_EvE():
  127.     """Функция спрашивает кто с кем будет играть"""
  128.     vozvr=None
  129.     while vozvr not in ("PvE", "PvP","EvE"):
  130.         vozvr = input("Выберите режим игры[PvP/PvE/EvE]")
  131.  
  132.     return vozvr #Возврат введенного значения
  133.  
  134. def XO():
  135.     """Функция спрашивает Х или О будет играть человек"""
  136.     while True:
  137.         xo=input("Чем вы будите играть [X/O][x/o]")
  138.         if(xo=="X" or xo=="x" or xo=="Х" or xo=="х"):
  139.             return "X"
  140.         if(xo=="O" or xo=="o" or xo=="О" or xo=="о" or xo=="0"):
  141.             return "O"
  142.  
  143. def cell_is_free(board,cletka):
  144.     print(cletka,board[cletka-1])
  145.     if board[int(cletka)-1]==int(cletka):
  146.         return True
  147.     else:
  148.         return False
  149. def numeric_value(board):
  150.     vvod=None
  151.     print("Ходите")
  152.     while True:
  153.         vvod=str(input())
  154.         print(vvod)
  155.         if vvod in ("1","2","3","4","5","6","7","8","9"):
  156.             if cell_is_free(board,int(vvod)):
  157.                 return (int(vvod)-1)
  158.             else:
  159.                 print("Эта клетка занята")
  160.         else:
  161.             print("Ошибка. Нужно вводить только цифры от 1 до 9.")
  162.     return int(vvod)
  163.  
  164. #def minimax(board,compOX)
  165.     #return False
  166.  
  167.  
  168. def mini(board,compOX):
  169.     if compOX=="X":
  170.         manOX="O"
  171.     else:
  172.         manOX="X"
  173.     if game_ended(board):
  174.         return check(board,compOX)
  175.     spisok=empty_cletka(board)
  176.     tmp2=10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  177.     for tmp in spisok:
  178.         board[tmp]=manOX
  179.         tmp3=maxi(board, compOX)
  180.         if tmp2>tmp3:
  181.             tmp2=tmp3
  182.         board[tmp]=tmp+1        
  183.     return tmp2
  184.  
  185. def maxi(board,compOX):
  186.     if game_ended(board):
  187.         return check(board,compOX)
  188.     spisok=empty_cletka(board)
  189.     tmp2=-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  190.     for tmp in spisok:
  191.         board[tmp]=compOX
  192.         tmp3=mini(board, compOX)
  193.         if tmp2<tmp3:
  194.             tmp2=tmp3
  195.         board[tmp]=tmp+1        
  196.     return tmp2
  197.  
  198.  
  199. def hod_comp(board,compOX):
  200.     hody=[]
  201.     if game_ended(board):
  202.         return check(board,compOX)
  203.     spisok=empty_cletka(board)
  204.     best_hod=-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  205.     for hod in spisok:
  206.         board[hod]=compOX
  207.         test_hod=mini(board, compOX)
  208.         if best_hod<test_hod:
  209.             best_hod=test_hod
  210.             hody=[hod+1]
  211.         elif best_hod==test_hod:
  212.             hody.append(hod+1)
  213.         board[hod]=hod+1
  214.     print(hody)
  215.     rn = int(random.random()*len(hody))
  216.     print(rn)
  217.     return hody[rn]-1
  218.  
  219. #def hod_comp1(board,compOX):
  220.  #   hody=None
  221.   #  if game_ended(board):
  222. #        return check(board,compOX)
  223. #   spisok=empty_cletka(board)
  224. #   best_hod=-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  225. #   for hod in spisok:
  226. #       board[hod]=compOX
  227. #       test_hod=mini(board, compOX)
  228. #       if best_hod<test_hod:
  229. #            best_hod=test_hod
  230. #           hody=hod
  231. #
  232. #       board[hod]=hod+1
  233. #   print(hody)
  234. #   return hody
  235.  
  236. def rd_hod_comp(board):
  237.     spisok=empty_cletka(board)
  238.     return spisok[int(random.random()*len(spisok))]
  239.  
  240. def PvE(board,manOX):
  241.     if manOX=="X":  
  242.         compOX="O"
  243.         hoditMan=True
  244.     else:
  245.         compOX="X"
  246.         hoditMan=False
  247.    
  248.     while True:
  249.         draw_board(board)
  250.         if hoditMan:
  251.             cletka=int(numeric_value(board))
  252.             board[cletka]=manOX
  253.         else:
  254.             cletka=int(hod_comp(board,compOX))
  255.             board[cletka]=compOX
  256.         hoditMan=not hoditMan
  257.         if game_ended(board):
  258.             break
  259.     pobed=check_win(board)
  260.     return pobed
  261.            
  262. def EvE(board):
  263.     comp1="X"
  264.     comp2="O"
  265.     hoditcomp1=True
  266.     while True:
  267.         draw_board(board)
  268.         if hoditcomp1:
  269.             cletka=int(rd_hod_comp(board))
  270.             board[cletka]=comp1
  271.         else:
  272.             cletka=int(hod_comp(board,comp2))
  273.             board[cletka]=comp2
  274.         hoditcomp1=not hoditcomp1
  275.         if game_ended(board):
  276.             break
  277.     pobed=check_win(board)
  278.     return pobed
  279.  
  280.  
  281. def PvP(board):
  282.     man1="X"
  283.     man2="O"
  284.     hoditMan1=True
  285.     while True:
  286.         draw_board(board)
  287.         if hoditMan1:
  288.             cletka=int(numeric_value(board))
  289.             board[cletka]=man1
  290.         else:
  291.             cletka=int(numeric_value(board))
  292.             board[cletka]=man2
  293.         hoditMan1=not hoditMan1
  294.         if game_ended(board):
  295.             break
  296.     pobed=check_win(board)
  297.     return pobed
  298.  
  299.  
  300.    
  301. def main():
  302.     random.seed()
  303.     board = list(range(1,10))
  304.     manual()
  305.     ehe=True
  306.     #if
  307.     #check=check_for_loose
  308.    
  309.     #vvod_yes_no("Вы готовы играть?")
  310.     #name=obrashen()
  311.     p_e=PvP_PvE_EvE()
  312.     while ehe:
  313.         board = list(range(1,10))
  314.         if p_e=="PvP":
  315.             rezult=PvP(board)
  316.         elif p_e=="PvE":
  317.             rezult=PvE(board,XO())
  318.         elif p_e=="EvE":
  319.             rezult=EvE(board)
  320.         draw_board(board)
  321.         if rezult=="draw":
  322.             print("Ничья")
  323.         else:
  324.             print("Победил",rezult)
  325.         ehe=(input("Чтобы выйти нажмите Q") != "Q")
  326.  
  327.        
  328. main()
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
RAW Paste Data