[421] | 1 | #!/usr/bin/env python
|
---|
| 2 | '''This demonstrates controlling a screen oriented application (curses).
|
---|
| 3 | It starts two instances of gnuchess and then pits them against each other.
|
---|
| 4 | '''
|
---|
| 5 | import pexpect
|
---|
| 6 | import string
|
---|
| 7 | import ANSI
|
---|
| 8 | import sys, os, time
|
---|
| 9 |
|
---|
| 10 | class 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 |
|
---|
| 100 | def LOG (s):
|
---|
| 101 | print s
|
---|
| 102 | sys.stdout.flush ()
|
---|
| 103 | fout = open ('moves.log', 'a')
|
---|
| 104 | fout.write (s + '\n')
|
---|
| 105 | fout.close()
|
---|
| 106 |
|
---|
| 107 | print 'Starting...'
|
---|
| 108 |
|
---|
| 109 | black = Chess()
|
---|
| 110 | white = Chess()
|
---|
| 111 | white.read_until_cursor (19,60,1)
|
---|
| 112 | white.switch()
|
---|
| 113 |
|
---|
| 114 | done = 0
|
---|
| 115 | while 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 |
|
---|
| 127 | g.quit()
|
---|
| 128 |
|
---|
| 129 |
|
---|