Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > New Chess Module

Reply
Thread Tools

New Chess Module

 
 
shatranjchess@gmail.com
Guest
Posts: n/a
 
      03-15-2007
I'm releasing a new python chess module called shatranj.
You can get it from www.employees.org/~stannous/shatranj
until I move the project to sourceforge or some other place.

It's a text based (bitboard) chess engine that implements
an alphabeta search with iterative deepening.
It also has a small opening book and stores most of
its information in dictionaries (hash tables). So for
a python module, it should be fast.

It currently has a very simple evaluation
function so don't expect strong play. My goal was to
implement a complete program using 64 bit numbers
(bitboards) as the main data structures...sacrificing
speed for code clarity. I'm hoping that non-programmers
interested in AI or advanced chess players will be able
to pick it up and add some intelligence to it. Being
written in Python, it's not blazingly fast...but Kasparov
doesn't even look at 2k nodes per second, does he?

Some things I could use some help with: interface for
xboard and winboard not to mention a better
evaluation function.

(comments and suggestions are welcome...
please email shatranjchess at gmail dot com)

Here's a small interactive session of how it works:

------------------
>>> from shatranj import *

....reading startup data
....total time to read data 0.0774528980255
....found opening book shatranj-book.bin with 37848 positions
>>> position = Position("r1bqk2r/pppp1ppp/2n5/5N2/2B1n3/8/PPP1QPPP/R1B1K2R")
>>> all_pieces = position.piece_bb["b_occupied"] | position.piece_bb["w_occupied"]
>>> other_pieces = position.piece_bb["b_occupied"]
>>> from_square = c4
>>> wtm = 1
>>> mask = position.pinned(from_square,wtm)
>>> ne_pieces = diag_mask_ne[from_square] & all_pieces
>>> nw_pieces = diag_mask_nw[from_square] & all_pieces
>>> moves = ((diag_attacks_ne[from_square][ne_pieces] & other_pieces) | \

.... (diag_attacks_ne[from_square][ne_pieces] & ~all_pieces)
| \
.... (diag_attacks_nw[from_square][nw_pieces] & other_pieces)
| \
.... (diag_attacks_nw[from_square][nw_pieces] & ~all_pieces))
& mask
>>>
>>> moves

1275777090846720L
>>>
>>> tobase(moves,2)

'1001000100001010000000000000101000000000000000000 00'
>>> display(moves)


+---+---+---+---+---+---+---+---+
8 | | . | | . | | . | | . |
+---+---+---+---+---+---+---+---+
7 | . | | . | | . | 1 | . | |
+---+---+---+---+---+---+---+---+
6 | 1 | . | | . | 1 | . | | . |
+---+---+---+---+---+---+---+---+
5 | . | 1 | . | 1 | . | | . | |
+---+---+---+---+---+---+---+---+
4 | | . | | . | | . | | . |
+---+---+---+---+---+---+---+---+
3 | . | 1 | . | 1 | . | | . | |
+---+---+---+---+---+---+---+---+
2 | | . | | . | | . | | . |
+---+---+---+---+---+---+---+---+
1 | . | | . | | . | | . | |
+---+---+---+---+---+---+---+---+
a b c d e f g h

>>> move_list = position.generate_moves(wtm)
>>> moves,san_moves = position.get_move_list(move_list)
>>> san_moves.values()

['Rg1', 'O-O', 'f3', 'a3', 'Rb1', 'f4', 'Ba6', 'Qe3', 'Bh6', 'Bd3',
'Qg4', 'Ng3', 'Ne7', 'Be6', 'Nxg7', 'Qxe4', 'Ne3', 'b4', 'b3', 'Be3',
'Bg5', 'g3', 'Kf1', 'Rf1', 'Nh6', 'a4', 'Nh4', 'Qh5', 'Kd1', 'h4',
'h3',
'c3', 'Bxf7', 'Nd6', 'Bb5', 'Nd4', 'Qf3', 'g4', 'Qf1', 'Bb3', 'Qd1',
'Qd3', 'Qd2', 'Bd5', 'Bd2', 'Bf4']
>>>
>>> # now play a game!
>>> play()

Shatranj version 1.0
g: switch sides m: show legal moves
n: new game l: list game record
d: display board b: show book moves
sd: change search depth (2-16) default=5
q: quit

Shatranj: d

+---+---+---+---+---+---+---+---+
8 | r | n | b | q | k | b | n | r |
+---+---+---+---+---+---+---+---+
7 | p | p | p | p | p | p | p | p |
+---+---+---+---+---+---+---+---+
6 | | . | | . | | . | | . |
+---+---+---+---+---+---+---+---+
5 | . | | . | | . | | . | |
+---+---+---+---+---+---+---+---+
4 | | . | | . | | . | | . |
+---+---+---+---+---+---+---+---+
3 | . | | . | | . | | . | |
+---+---+---+---+---+---+---+---+
2 | P | P | P | P | P | P | P | P |
+---+---+---+---+---+---+---+---+
1 | R | N | B | Q | K | B | N | R |
+---+---+---+---+---+---+---+---+
a b c d e f g h



Shatranj:
-----------------------------------

Enjoy,
Sam

 
Reply With Quote
 
 
 
 
Paul Rubin
Guest
Posts: n/a
 
      03-15-2007
http://www.velocityreviews.com/forums/(E-Mail Removed) writes:
> written in Python, it's not blazingly fast...but Kasparov
> doesn't even look at 2k nodes per second, does he?


Wow, cool. Out of curiosity how many nodes per second does it look
at?
 
Reply With Quote
 
 
 
 
shatranjchess@gmail.com
Guest
Posts: n/a
 
      03-15-2007
On Mar 15, 4:46 pm, Paul Rubin <http://(E-Mail Removed)> wrote:
> (E-Mail Removed) writes:
> > written in Python, it's not blazingly fast...but Kasparov
> > doesn't even look at 2k nodes per second, does he?

>
> Wow, cool. Out of curiosity how many nodes per second does it look
> at?


depends on your processor speed...on a recent machine (~2.3GHz)
I can get about 2k nps without the psyco boost...but my goal was not
to beat the compiled programs with fast code. I'd like to develop a
strong program with good evaluation and move ordering. And perhaps
try search methods other than alphabeta. Using bitboards should
make the first part easier and using python should help with the
second
part.

--Sam

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Interfacing my chess client with GNU chess using python Varun Hiremath Python 1 09-18-2006 05:24 PM
Chess module blog Will McGugan Python 1 06-19-2006 02:42 AM
New Python chess module Will McGugan Python 5 09-30-2005 10:04 PM
use Java to write Chiness Chess? nick Java 1 11-19-2004 10:50 AM
Chess server in New Zealand? Alex Brunetti NZ Computing 0 12-24-2003 03:14 AM



Advertisments