Прикреплённый файл «2014-04-04-xo.py»

Загрузка

   1 #!/usr/bin/env python
   2 # coding: utf
   3 import sys, random
   4 
   5 def show(pos,sz,msg=None):
   6     print
   7     if msg: print msg
   8     print ("\n"+"_"*(sz*2-1)+"\n").join("|".join(pos[sz*i:sz*i+sz]) for i in xrange(sz))
   9 
  10 def good(pos, turn):
  11     '''Хороша ли для нас позиция pos (turn -- наш ход)?'''
  12     if pos in Field:                        # Позиция уже встречалась
  13         return Field[pos]
  14     Field[pos],Mark=[], turn and Me or It
  15     for win in Wins:                        # Не выиграл ли кто?
  16         if all((pos[p]==Me for p in win)):  # Мы выиграли
  17             Field[pos].append(True)         # Победа
  18             return True
  19         if all((pos[p]==It for p in win)):  # Выиграл противник
  20             return False
  21     if " " not in pos:                      # Больше ходов нет
  22         Field[pos].append(False)            # Ничья
  23     else:                                   # Возможные ходы
  24         newposes=[pos[:i]+Mark+pos[i+1:] for i in xrange(SZ) if pos[i]==" "]
  25         if turn:                            # Наш ход
  26             Field[pos]=[npos for npos in newposes if good(npos, not turn)]
  27         else:                               # Ход противника
  28             if all((good(npos, not turn) for npos in newposes)):
  29                 Field[pos]=list(newposes)   # Если все выигрышные, добавим их
  30     return Field[pos]
  31 
  32 Field={}
  33 Me,It,Turn=len(sys.argv)>1 and sys.argv[1] not in "Xx" and ("O","X",False) or ("X","O",True)
  34 sz=len(sys.argv)>2 and int(sys.argv[2]) or 3
  35 SZ=sz*sz
  36 Wins=[[x+sz*n for n in xrange(sz)] for x in xrange(sz)]+ \
  37      [[x+sz*n for x in xrange(sz)] for n in xrange(sz)]+ \
  38      [[n+sz*n for n in xrange(sz)]]+ \
  39      [[sz*(n+1)-n-1 for n in xrange(sz)]]
  40 
  41 pos=" "*SZ
  42 good(pos,Turn)
  43 
  44 while type(Field[pos][0]) is str:
  45     if Turn:
  46         pos=random.choice(Field[pos])
  47     else:
  48         show(pos,sz)
  49         n=None
  50         while n is None:
  51             try:
  52                 n=int(raw_input("> "))
  53             except:
  54                 n=None
  55             else:
  56                 if n<0 or n>=SZ or pos[n]!=" ":
  57                     n=None
  58         pos=pos[:n]+It+pos[n+1:]
  59     Turn = not Turn
  60 show(pos,sz,Field[pos][0] and "I win" or "Draw")

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.