Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2014-04-11 13:10:46, 2.3 KB) [[attachment:2014-04-04-xo.py]]
- [получить | показать] (2014-04-11 13:11:16, 0.1 KB) [[attachment:xo.test.txt]]
- [получить | показать] (2014-04-11 13:11:03, 4.5 KB) [[attachment:xoproto.py]]
Вам нельзя прикреплять файлы к этой странице.