Work towards C SDK (#11). Frenchie is still broken.
[progcomp10.git] / src / link / pexpect / examples / chess2.py
1 #!/usr/bin/env python
2
3 '''This demonstrates controlling a screen oriented application (curses).
4 It starts two instances of gnuchess and then pits them against each other.
5 '''
6
7 import pexpect
8 import string
9 import ANSI
10 import sys, os, time
11
12 class Chess:
13
14         def __init__(self, engine = "/usr/local/bin/gnuchess -a -h 1"):
15                 self.child = pexpect.spawn (engine)
16                 self.term = ANSI.ANSI ()
17              
18                 #self.child.expect ('Chess')
19                 #if self.child.after != 'Chess':
20                 #        raise IOError, 'incompatible chess program'
21                 #self.term.process_list (self.child.before)
22                 #self.term.process_list (self.child.after)
23
24                 self.last_computer_move = ''
25
26         def read_until_cursor (self, r,c, e=0):
27             '''Eventually something like this should move into the screen class or
28             a subclass. Maybe a combination of pexpect and screen...
29             '''
30             fout = open ('log','a')
31             while self.term.cur_r != r or self.term.cur_c != c:
32                 try:
33                     k = self.child.read(1, 10)
34                 except Exception, e:
35                     print 'EXCEPTION, (r,c):(%d,%d)\n' %(self.term.cur_r, self.term.cur_c)
36                     sys.stdout.flush()
37                 self.term.process (k)
38                 fout.write ('(r,c):(%d,%d)\n' %(self.term.cur_r, self.term.cur_c))
39                 fout.flush()
40                 if e:
41                     sys.stdout.write (k)
42                     sys.stdout.flush()
43                 if self.term.cur_r == r and self.term.cur_c == c:
44                     fout.close()
45                     return 1
46             print 'DIDNT EVEN HIT.'
47             fout.close()
48             return 1
49
50         def expect_region (self):
51             '''This is another method that would be moved into the
52             screen class.
53             '''
54             pass
55         def do_scan (self):
56             fout = open ('log','a')
57             while 1:
58                 c = self.child.read(1,10)
59                 self.term.process (c)
60                 fout.write ('(r,c):(%d,%d)\n' %(self.term.cur_r, self.term.cur_c))
61                 fout.flush()
62                 sys.stdout.write (c)
63                 sys.stdout.flush()
64
65         def do_move (self, move, e = 0):
66                 time.sleep(1)
67                 self.read_until_cursor (19,60, e)
68                 self.child.sendline (move)
69
70         def wait (self, color):
71             while 1:
72                 r = self.term.get_region (14,50,14,60)[0]
73                 r = r.strip()
74                 if r == color:
75                     return
76                 time.sleep (1)
77
78         def parse_computer_move (self, s):
79                 i = s.find ('is: ')
80                 cm = s[i+3:i+9]        
81                 return cm
82         def get_computer_move (self, e = 0):
83                 time.sleep(1)
84                 self.read_until_cursor (19,60, e)
85                 time.sleep(1)
86                 r = self.term.get_region (17,50,17,62)[0]
87                 cm = self.parse_computer_move (r)
88                 return cm
89
90         def switch (self):
91                 print 'switching'
92                 self.child.sendline ('switch')
93
94         def set_depth (self, depth):
95                 self.child.sendline ('depth')
96                 self.child.expect ('depth=')
97                 self.child.sendline ('%d' % depth)
98
99         def quit(self):
100                 self.child.sendline ('quit')
101
102 def LOG (s):
103     print s
104     sys.stdout.flush ()
105     fout = open ('moves.log', 'a')
106     fout.write (s + '\n')
107     fout.close()
108
109 print 'Starting...'
110
111 black = Chess()
112 white = Chess()
113 white.read_until_cursor (19,60,1)
114 white.switch()
115
116 done = 0
117 while not done:
118     white.wait ('Black')
119     move_white = white.get_computer_move(1)
120     LOG ( 'move white:'+ move_white )
121
122     black.do_move (move_white)
123     black.wait ('White')
124     move_black = black.get_computer_move()
125     LOG ( 'move black:'+ move_black )
126    
127     white.do_move (move_black, 1)
128
129 g.quit()
130
131

UCC git Repository :: git.ucc.asn.au