source: CMTManagement/utils/chess2.py @ 421

Last change on this file since 421 was 421, checked in by garonne, 17 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.