source: CMTManagement/utils/chess2.py@ 689

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