Прикреплённый файл «xoproto.py»

Загрузка

   1 #!/usr/bin/env python
   2 # coding: utf
   3 '''
   4 '''
   5 
   6 class Proto:
   7     '''Протокол игры в крестики-нолики'''
   8     version = 0.02
   9     debug = False
  10 
  11     def cell(self, x, y, field=None):
  12         '''Содержимое клетки (или "E", если coord неправильные)'''
  13         field = field or self.field
  14         if  0<=x<self.size and 0<=y<self.size:
  15             return field[y][x]
  16         else:
  17             return "E"
  18 
  19     def diff(self, board1, board2):
  20         '''Чем board1 отличается от board2'''
  21         s=self.size
  22         return [(x,y,board2[x+y*s]) for x in xrange(s) for y in xrange(s) if board1[x+y*s]!=board2[x+y*s]]
  23 
  24     def check(self, who=None):
  25         '''Проверить, не выиграл ли кто
  26         Возвращает "X", "O", "DRAW" (ничья) и "NEXT" (пока никто)
  27         Выигрыш противника не проверяется!
  28         '''
  29         if not self.pos: return "."
  30         x, y = self.pos
  31         if not who: who = self.last
  32         swin = who*self.win
  33         seq = xrange(-self.win+1,self.win)
  34         lines = (
  35                     "".join((self.cell(x+i,y) for i in seq)),
  36                     "".join((self.cell(x,y+i) for i in seq)),
  37                     "".join((self.cell(x+i,y+i) for i in seq)),
  38                     "".join((self.cell(x+i,y-i) for i in seq)),
  39                  )
  40         for line in lines:
  41             if swin in line:
  42                self.winner = who
  43                return "ENDGAME {}".format(who)
  44         if self.count == self.size**2:
  45             self.winner = "DRAW"
  46             return "ENDGAME DRAW"
  47         return "NEXT"
  48 
  49     def INIT(self, size, win=0):
  50         '''(size[, win=size]) Начать игру на поле size*size, длина выигрышной комбинации win'''
  51         self.size  = int(size)
  52         self.field = [["." for i in xrange(self.size)] for j in xrange(self.size)]
  53         self.win = int(win) or self.size
  54         self.last = "O"
  55         self.pos = None
  56         self.count = 0
  57         self.winner = None
  58         return "OK"
  59 
  60     def SET(self, board, x, y):
  61         '''(board, x, y) Задать игровое состояние board, последний ход x,y'''
  62         pos = int(x),int(y)
  63         field = [[c for c in board[self.size*i:self.size*(i+1)]] for i in xrange(self.size)]
  64         last = self.cell(x,y,field)
  65         if last not in "XO":
  66             return "ERROR PLACEMENT"
  67         l,c1,c2 = last == "O", board.count("X"), board.count("O")
  68         if l and c1 != c2 or not l and c1 != c2+1:
  69             return "ERROR COUNT"
  70         self.field=field
  71         self.last = last
  72         self.pos = pos
  73         self.count = self.size*self.size - board.count(".")
  74         self.winner = None
  75         return "OK"
  76 
  77     def MOVE(self, coord, who):
  78         '''(coord, who) Сделать ход фигурой who на поле coord'''
  79         if self.winner:
  80             return "ERROR ENDGAME {}".format(self.winner)
  81         who = who.upper()
  82         if self.last == who or who not in "XO":
  83             return "ERROR TURN"
  84         if type (coord) is str:
  85             x, y = coord.replace(",", " ").split()
  86         else:
  87             x, y = coord
  88         x, y = int(x), int(y)
  89 
  90         if self.field[y][x] != ".":
  91             return "ERROR OCCUPIED"
  92         self.last = who
  93         self.pos = x,y
  94         self.field[y][x] = who
  95         self.count += 1
  96         return self.check()
  97 
  98     def INFO(self):
  99         '''Показать информацию об игре'''
 100         b="".join(("".join((c for c in l)) for l in self.field))
 101         return "GAME {} {} {} {}".format(self.size, self.win, self.last, b)
 102 
 103     def BOARD(self):
 104         '''Показать игровое поле'''
 105         b="\n".join(("".join((c for c in l)) for l in self.field))
 106         return "FIELD\n{}".format(b)
 107 
 108     def HELP(self):
 109         '''Помощь по командам'''
 110         ret = "COMMANDS"
 111         for cmd in dir(self):
 112             if cmd == cmd.upper():
 113                 ret+="\n{} {}".format(cmd, getattr(self, cmd).__doc__)
 114         return ret
 115 
 116     def VERSION(self):
 117         '''Показать версию протокола'''
 118         return "XO ver {}".format(self.version)
 119 
 120     def DEBUG(self):
 121         '''Вклчить/выключить режим отладки'''
 122         self.debug = not self.debug
 123         return "OK"
 124 
 125     def command(self, cmd):
 126         cmd = cmd.split()
 127         cmd[0]=cmd[0].upper()
 128         if cmd[0] not in dir(self):
 129             return "ERROR INVALID '{}'".format(cmd[0])
 130         try:
 131             command = getattr(self, cmd[0])
 132             ret = command(*cmd[1:])
 133         except Exception, message:
 134             if self.debug:
 135                 raise
 136             else:
 137                 return "ERROR PARAMETER {}".format(message)
 138         return ret
 139 
 140 if __name__ == "__main__":
 141     proto = Proto()
 142     req, ret = "VERSION", ""
 143     while req != "." and not ret.startswith("ENDGAME"):
 144         ret = proto.command(req)
 145         print ret
 146         req = raw_input("> ")

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

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

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