Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2014-04-18 15:19:22, 3.0 KB) [[attachment:xoai.py]]
- [получить | показать] (2014-04-18 15:19:33, 1.7 KB) [[attachment:xonet.py]]
- [получить | показать] (2014-04-18 15:19:10, 5.0 KB) [[attachment:xoproto.py]]
Вам нельзя прикреплять файлы к этой странице.