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

Загрузка

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

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

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

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